在Java中,异常也称为例外,是在程序运行过程中发生的、会打断程序正常执行的事件;比如数组越界、除0溢出、文件找不到等。
常见的几种异常:
1、算术异常(ArithmeticException)
2、没有给对象开辟内存空间时会出现空指针异常(NullPointerException)
3、找不到文件异常(FileNotFoundException)
基本上异常可分为两大类:java.lang.Exception类与 java.lang.Error类,它们均继承自java.lang.Throwable类。
Error类专门用于处理严重影响程序运行的错误,可是通常程序设计者不会设计程序代码去捕获这种错误,其原因在于即使捕捉到
它,也无法给予适当的处理,如java虚拟机出错就属于其中一种(它是JVM层次的严重错误,导致JVM无法继续执行,无法采取任
何恢复操作,最多提示错误信息)。
Exception类包含一般性的异常,这些异常能在捕捉到之后进行妥善处理,以确保程序继续运行。
Java异常处理
在 Java 应用程序中,对异常的处理有两种方式:处理异常和声明异常。
处理异常:try、catch 和 finally
若要捕获异常,则必须在代码中添加异常处理器块。这种 Java 结构可能包含 3 个部分,
都有 Java 关键字。下面的例子中使用了 try-catch-finally 代码结构。
import java.io.*;
public class EchoInputTryCatchFinally {
public static void main(String args[]){
System.out.println("Enter text to echo:");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader inputReader = new BufferedReader(isr);
try{
String inputLine = inputReader.readLine();
System.out.println("Read:" + inputLine);
}
catch(IOException exc){
System.out.println("Exception encountered: " + exc);
}
finally{
System.out.println("End. ");
}
}
}
其中:
- try 块:将一个或者多个语句放入 try 时,则表示这些语句可能抛出异常。编译器知道可能要发生异常,于是用一个特殊结构评估块内所有语句。
- catch 块:当问题出现时,一种选择是定义代码块来处理问题,catch 块的目的便在于此。catch 块是 try 块所产生异常的接收者。基本原理是:一旦生成异常,则 try 块的执行中止,JVM 将查找相应的 JVM。
- finally 块:还可以定义 finally 块,无论运行 try 块代码的结果如何,该块里面的代码一定运行。在常见的所有环境中,finally 块都将运行。无论 try 块是否运行完,无论是否产生异常,也无论是否在 catch 块中得到处理,finally 块都将执行。
try-catch-finally 规则:
- 必须在 try 之后添加 catch 或 finally 块。try 块后可同时接 catch 和 finally 块,但至少有一个块。
- 必须遵循块顺序:若代码同时使用 catch 和 finally 块,则必须将 catch 块放在 try 块之后。
- catch 块与相应的异常类的类型相关。
- 一个 try 块可能有多个 catch 块。若如此,则执行第一个匹配块。
- 可嵌套 try-catch-finally 结构。
- 在 try-catch-finally 结构中,可重新抛出异常。
- 除了下列情况,总将执行 finally 做为结束:JVM 过早终止(调用 System.exit(int));在 finally 块中抛出一个未处理的异常;计算机断电、失火、或遭遇病毒攻击。
声明异常
若要声明异常,则必须将其添加到方法签名块的结束位置。如:
public void errorProneMethod(int input) throws java.io.IOException {
//Code for the method,including one or more method
//calls that may produce an IOException
}
这样,声明的异常将传给方法调用者,而且也通知了编译器:该方法的任何调用者必须遵守处理或声明规则。声明异常的规则如下:
- 必须声明方法可抛出的任何可检测异常(checked exception)。
- 非检测性异常(unchecked exception)不是必须的,可声明,也可不声明。
- 调用方法必须遵循任何可检测异常的处理和声明规则。若覆盖一个方法,则不能声明与覆盖方法不同的异常。声明的任何异常必须是被覆盖方法所声明异常的同类或子类。