Java的异常处理

323 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情 >> 希望大家可以帮忙点个赞,谢谢!

前言

日常开发中需要对异常处理,我们通常采用抛出异常的方法来达到出现问题时可以查看日志迅速定位问题原因或对其进行抢救措施。

使用方法与相关定义

因为Java 程序中的异常是一个在程序执行期间发生的事件,所以它会中断正在执行程序的正常指令流,即停止当前运行的活动,对错误进行相应处理。而为了能够及时有效地处理程序中的运行错误,则必须使用异常类。

Throwable 类

java 中所有的异常都继承自 Throwable 类,Throwable 类有两个子类,分别时 Error 类和 Exception 类:

  • Error 类:【错误】即表示 java 程序在运行时产生的无法处理的故障(如堆栈溢出),错误出现时会导致程序无法正常执行并强制退出。
  • Exception 类:【异常】即表示 java 程序中产生的可以被处理的故障,异常出现时可以由程序进行处理。

RuntimeException 类

运行时异常
它是Exception 类的子类。表示 java 程序在运行中发生的异常,而在编译时无法被检测。是在 java 程序运行时会由系统自动抛出,允许应用程序不进行处理。

日志中报错的意义:

异常类型介绍
ArithmeticException算术异常,以零做除数
ArrayIndexOutOfBoundException数组越界异常
NullPointerException空指针异常,对象不存在

异常处理

抛出异常:throw

当程序中方法的执行出现问题时,这个方法就会创建异常对象并抛出。而我们可以在程序中自行抛出异常(注:JVM 在执行程序时发现问题也会自动抛出异常)

  • throw 语句:我们可自行创建异常对象并抛出,等待程序进行异常处理。
  • throws 语句:声明方法可能抛出某种异常且未经处理,调用该方法的上级需要进行异常处理。

class TestException{       
    // 把方法中的抛出异常交给上层处理     
    public void writeList(int size) throws IndexOutOfBoundsException, IOException{
        PrintWriter out = null;
        // 可以自定义异常并抛出
        if(size < 1) throw new IndexOutOfBoundsException("不能为空");
        try{
            // 虚拟机会自动发现异常且抛出,必须出现在 try 代码块中
            out = new PrintWriter(new FileWriter(txt));
            for (int i = 0; i < size; i++)
                System.out.println("Value at: " + i + " = " + list.get(i));
        }finally{
            if (out != null) out.close();
        }
     }
}

捕获异常: catch

当方法在执行中抛出异常时,必须要由专门的代码块对异常进行处理。

  • try 语句:可能出现异常的代码块。
  • catch 语句:捕获相应异常后停止执行 try 代码,转而执行对应 catch 代码。如果没有异常 catch 代码不会执行。
  • finally 语句:无论是否发生异常,finally 代码总会被执行。一般用于释放资源。

注意事项

  1. 如果 try 语句中出现的异常未被 catch,默认将异常 throw 给上层调用者处理。但必须在方法中声明 throws。
  2. try/catch 代码中的 return 语句会在执行完 finally 后再返回,但 finally 中对返回变量的改变不会影响最终的返回结果。
  3. finally 代码中应避免含有 return 语句或抛出异常,否则只会执行 finally 中的 return 语句,且不会向上级抛出异常。

Java 7 后在 try 语句中打开 IO 流,会在跳出后自动关闭流。所以不必再用 finally 语句关闭。

示例:

class TestException{               
    public void writeList(int size) {
        PrintWriter out = null;
        try {
            if(size < 1) throw new IndexOutOfBoundsException("不能为空!");
            out = new PrintWriter(new FileWriter("Out.txt"));
            for (int i = 0; i < size; i++)
                System.out.println("Value at: " + i + " = " + list.get(i));
        } catch (IndexOutOfBoundsException e) {
            System.err.println("Caught IndexOutOfBoundsException: " + e.getMessage());
        } catch (IOException e) {
            System.err.println("Caught IOException: " + e.getMessage());
        } finally {
            if (out != null) out.close();
        }
    }
}

总结

异常处理是必备的开发技能,所以记录下来以备不时之需,多看多用,就会更好的理解它们。