异常机制
Exception
检查性异常:用户错误或问题引起的,例如打开一个不存在的文件
运行时异常:可以在编译时被忽略
错误ERROR:不是异常,是脱离程序员控制的问题,例如:栈溢出,编译时也检查不到
异常处理框架
把异常当作对象处理
Java.lang.Throwable 分为错误和异常两大类
错误发生时,jvm一般会选择终止线程
exception通常可以被程序处理
运行时异常RuntimeException
- ArrayIndexOutOfBoundsException 数组下标越界
- NullPointerException 空指针异常
- ArithmeticException 算术异常
- MissingResourceException 丢失异常
- ClassNotFoundException 找不到类
异常处理机制
抛出异常
捕获异常
异常处理的五个关键字:try catch finally throw throws
自动生成异常捕获模版:option+command+t
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 3;
//假设要捕获多个异常:从小到大
try { // try监控区域
System.out.println(a/b);
}catch (ArithmeticException e){ //catch(想要捕获的异常类型)
System.out.println("something wrong, divisor can't be 0");
}finally {
System.out.println("finally");
}
// finally 可以不要,假设I/O,资源需要关闭
try {
new Test().a();
}catch (Throwable e){
System.out.println("catch");
}finally {
System.out.println("got");
}
}
public void a(){
b();
}
public void b(){
a();
}
}
主动抛出异常
public void test(int a,int b){
if (b == 0){
throw new ArithmeticException(); // 主动抛出异常,一般在方法中使用
}
假设这个方法中,处理不了这个异常,方法上抛出异常
public void test(int a,int b) throws ArithmeticException{
if (b == 0){
throw new ArithmeticException(); // 主动抛出异常,一般在方法中使用
}
自定义异常
继承Exception类
My exception
// 自定义的异常类
public class MyException extends Exception{
// 传递数字>10
private int detail;
public MyException(int detail) {
this.detail = detail;
}
// toString 异常的打印信息
@Override
public String toString() {
return "MyException{" +
"detail=" + detail +
'}';
}
}
Test my exception
public class TestMyException {
// 可能会存在异常的方法
static void test(int a) throws MyException {
System.out.println("para " + a);
if (a > 10){
throw new MyException(a); // 抛出
}
System.out.println("ok");
}
public static void main(String[] args) {
try {
test(15);
} catch (MyException e) {
// 可以添加异常处理的代码块
System.out.println("my exception " + e);
}
}
}