使用方法与相关定义
因为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 代码总会被执行。一般用于释放资源。
注意事项
- 如果 try 语句中出现的异常未被 catch,默认将异常 throw 给上层调用者处理。但必须在方法中声明 throws。
- try/catch 代码中的 return 语句会在执行完 finally 后再返回,但 finally 中对返回变量的改变不会影响最终的返回结果。
- 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(); } } }
总结
异常处理是必备的开发技能,所以记录下来以备不时之需,多看多用,就会更好的理解它们。