Exception
记录 exception class
学习笔记,仅供参考
Exception
异常指一个在程序执行过程中产生的事件,它打断了程序的正常执行过程,从而使程序终止运行。要是能处理掉异常,程序就不会终止,那么后面的程序就可以被执行到
异常的继承图如下:
异常的分类
检查异常(Checked Exception)
: 除了 Error 和 RuntimeException 及其子类外,其他的类都是检查异常,像 IOException、FileNotFoundException等。检查异常会在编译时就报错,所以必须要处理或抛出该异常,否则编译无法通过错误(Error)
: Error 及其子类,编译时无法判断出,只有在运行时才会报错且终止程序。通常是由硬件或系统级错误,所以较异常要更严重些。运行时异常(RuntimeException)
: RuntimeException 及其子类,编译无法判断,只有运行时才会检查到,出错时会自动抛出异常,所以并非一定要处理异常。通常是由逻辑错误或 API 运用不当导致的
异常的捕获和处理
处理异常会用到 try
, catch
, finally
三种代码块
try {
// 用 try 包住可能有异常的代码,以此来捕获异常
code
} catch (异常类型 异常变量名) {
// 若是捕获到异常,就执行 catch 中的语句,一般为一些报错信息
handle exception statements
} catch (ExceptionTyle name) {
// catch 可以有多个,可以用来捕获不同类型的异常
statements
} finally {
// 无论是否有异常都会执行此内容,很适合用来清理或关流
code
}
/*******************example******************/
// ★ 注意多重异常捕获时,父类异常要放在子类的后面,否则会报错
try {
code
} catch (IndexOutOfBoundsException e) {
System.out.println("IndexOutOfBoundsException: " + e.getMessage());
} catch (IOException e) {
System.out.println("IOException: " + e.getMessage());
}
// 多个 catch 的缩写
try {
code
} catch (IndexOutOfBoundsException | IOException ex) {
ex.printStackTrack();
}
// 但这样写后,ex 变量就变为 final 型,之后不能再被赋值
抛出异常
有异常时,可以选择处理,还可以选择不处理,将异常抛给上一级,上一级也可选择处理或抛出,直到某一级处理或抛给 JVM 来处理(终止程序, 打印信息)
如除法函数中,要是除数为零,抛出异常
public class Test {
public static void main(String arg[]) throws Exception {
division(1, 0);
}
// division method
public void division(int x, int y) throws Exception {
if (0 == y) {
// throw exception
throw new Exception("Shit! / by zero");
}
System.out.println(x / y);
}
}
若抛出的是 RuntimeException,在方法名后面就不用声明异常的类型;若是非 Runtime 类的则 必须 要用 throws ExceptionType
来声明有异常
异常的好处
通过异常可以判断出是什么样的异常,在哪里有异常,从而根据所给的异常信息和网络文档来进行代码的修改