Java异常

Java的异常是指在程序运行过程中出现的错误或异常情况,例如除数为零、数组越界、空指针等。Java中的异常分为两种:受检异常和非受检异常。

受检异常是指在编译时就能够检测到的可能发生的问题,必须要进行处理才能通过编译。这些问题通常与外部环境有关,并且可以被预见并避免。比如文件不存在(FileNotFoundException)、网络连接失败(IOException)等。

非受检/未捕获 异常则不需要强制性地对其进行处理,在代码执行期间如果抛出了该类型 的异 常,则会导致程序崩溃退出 。RuntimeException及其子类都属于 非 可查 异 常 ,包括NullPointerException, ArrayIndexOutOfBoundsException 等 一系列 运 行 时 错误

当一个方法内部产生了某个特定类型(checked exception) 的 checked Exception ,那么它应该将此Exception 抛给调用者去解决;而unchecked Exception 则无需显式声明throws语法来告知其他人自己所throw 出去哪些exception.

try-catch-finally 是 Java 中最基本也最重要得控制结构之一。

  • try: 包含待监视代码块
  • catch: 捕获由try引起得任何exceptions.
    • 多catch block : 如果你想要捕获多个不同类型的异常,可以使用多个catch块。
    • catch block 参数: 每一个catch 块都包含了要处理特定exception 的参数。这些参数是 exception 类型或者其子类得实例
  • finally : 无论是否发生异常, 都会执行finally代码块中的语句。
    好的,下面是一个简单的Java代码示例:
import java.io.*;

public class ExceptionDemo {
    public static void main(String[] args) {
        try{
            BufferedReader br = new BufferedReader(new FileReader("file.txt"));
            String line;
            while((line=br.readLine())!=null){
                System.out.println(line);
            }
        } catch(FileNotFoundException e){
           // 处理文件不存在异常 
           System.err.println("File not found: " + e.getMessage());
        } catch(IOException e){
          //处理IO 异常  
          System.err.println("IOException: " +e.getMessage());   
       } finally{
         // 关闭资源, 无论是否发生了异常都会执行这里.
         if(br != null){ 
             try{    
                 br.close();     
              }catch (IOException ex){      
                  ex.printStackTrace();
               }
         }
      }

   }

}

在上述代码中,我们使用try-catch-finally语句块来读取指定路径下的文本文件。如果该 文件存在,则程序将逐行输出其内容;否则就抛出FileNotFoundException并打印错误信息。

此外,在finally子句中关闭BufferedReader对象以释放相关资源,并确保不管有没有产 生 异 常 ,所需得清除工作总能够正确地完成 。
Java 还提供了 throw 和 throws 关键字来抛出和声明 异常 。throw关键字用于在方法内部显式地抛出某种类型的 Exception ,而throws则用于告知调用该方法时可能产生哪些 checked exceptions.
在Java中,异常处理的基本流程如下:

  1. 在可能会出现异常情况的代码块前加上try关键字,并将这些代码放在一个花括号内。

  2. 如果发生了某种类型的异常,则程序跳转到与之匹配的catch语句块。如果没有找到合适 的 catch 块来捕获该exception, 则此时JVM 会终止当前线程并抛出未被捕获得 exception.

  3. 每个catch语句都包含要执行以解决特定问题所需得一组指令(即“处理器”)。当 try 中产 生 异常 并且其 类型 匹 配于其中任何一个 catch block 后 ,控制权就传给相应地 handler 。handler 处理完后可以选择重新throw 或者不做任何事情而让方法正常结束

  4. finally 关键字用于定义必须执行但是不能通过return、break或continue等方式退出try/catch/finally结构体从而保证资源释放和清除工作能够正确进行。

5 . throw 和 throws 是 Java 提供两种机制来实现自己编写可重复使用性高,易读性好同时也更安全稳定 可靠 微服务:

  • 使用throws声明函数可能引起哪些checked exceptions
  • 对那些无法恢复错误(例如NullPointerException) ,则需要显式地调用throw 来告知其他人你已经遇到了一个无法处理的错误。

总之,Java异常机制是一种非常重要且强大的特性。它可以帮助我们更好地管理程序中可能出现 的各种问题,并提供相应解决方案以保证代码运行稳定和可靠。
除了try-catch-finally语句块外,Java还提供了一些其他的异常处理机制:

  1. try-with-resources:用于自动关闭资源(如文件、网络连接等),避免因忘记手动关闭而导致内存泄漏或程序崩溃。

  2. assert关键字:可以在代码中添加断言来检查某个条件是否成立。如果不成立,则会抛出AssertionError异常,并终止程序运行。

  3. 自定义异常类:除了使用Java标准库中已有的Exception子类之外,我们也可以根据需要创建自己 的 异常 类 。这样做能够更好地满足特定应用场景下对错误信息和处理方式的需求
    好的,下面是一个使用自定义异常类和try-with-resources语句块的Java代码示例:

class MyException extends Exception {
    public MyException(String message) {
        super(message);
    }
}

public class ResourceDemo {

   public static void main(String[] args){
      try (MyResource resource = new MyResource()) { // 使用try-with-resource来打开资源 
         resource.doSomething();
      } catch(MyException e){  // 处理自定义异常  
          System.err.println("Error: " +e.getMessage());   
       }

   }

}


// 自己编写得resource 类, 实现了AutoCloseable 接口.
class MyResource implements AutoCloseable{
    
     @Override
     public void close() throws Exception{     
           System.out.println("Closing my resources");
     }
      
     public void doSomething() throws IOException,MyException{
            if(true)
                throw new IOException();       
             else if(false)
                 throw new RuntimeException();        
              else         
                  throw new MyException("This is a custom exception");          
       } 

}

在上述代码中,我们创建了一个名为“myexception”的自定义异常类,并将其用于处理doS omething方法可能抛出 的 异 常 。同时,在main函数中利用 Java7 中新增加得 try with resources 来确保程序能够正确地关闭相关资源。

此外,在实现close() 方法时 , 我们可以添加一些必要清除工作以释放所占据内存等系统 资源。

4 . Java 8 中新增加得 Optional 可以帮助开发者优雅地解决NullPointerException问题.

总体上说, 在编写高质量可靠性强且易读性好得java 应用时 ,合理利用各种exception handling 技术是非常重要并必须掌握其中精髓

posted @ 2023-05-05 12:38  两拳ko小yu  阅读(29)  评论(0编辑  收藏  举报