异常分类
异常主要有两类:
- Error:系统内部错误,这类错误由系统进行处理,程序本身无需捕获处理。
- Exception:可以处理的异常。
Exception有分为:
-
RuntimeExcption 异常(运行时异常):可以捕获,也可以不捕获。
-
非 RuntimeException(受检异常 / 编译时异常,Checked Exception):必须捕获。
RuntimeExcption 异常主要包括:
- 错误的类型转换
- 数组访问越界
- 访问
null
指针 - 算术异常
Checked Exception 异常主要有:
- 打开一个不存在的文件
- 没有找到具有指定名称的类
- 操作文件异常
- io 异常
throw 和 throws
throw 手动抛出异常:
if (a == null || b == null) {
throw new NullPointerException();
}
throws 声明异常:
public static void throwsTest() throws FileNotFoundException {
new FileInputStream("/home/project/shiyanlou.file");
}
捕获异常
使用 try
和 catch
语句块来捕获异常,有时候还会用到 finally
。
try
语句块是必不可少的,catch
和 finally
语句块可以根据情况选择其一或者全选。
catch
语句块可以有多个,表示捕获多个异常。
自定义异常
(1)继承 Exception 或其子类;
(2)提供无参构造方法和带字符串参数的构造方法。
例如:
// MyAriException.java
public class MyAriException extends ArithmeticException {
//自定义异常类,该类继承自ArithmeticException
public MyAriException() {
}
//实现默认的无参构造方法
public MyAriException(String msg) {
super(msg);
}
//实现可以自定义输出信息的构造方法,将待输出信息作为参数传入即可
}
异常堆栈
当异常抛出后,我们可以通过异常堆栈追踪程序的运行轨迹。
例如:
java.lang.NullPointerException
at ExceptionStackTrace.method2(ExceptionStackTrace.java:7)
at ExceptionStackTrace.method1(ExceptionStackTrace.java:3)
at ExceptionStackTrace.main(ExceptionStackTrace.java:11)
从下往上看,就可以得出程序运行的轨迹。