Error:严重错误
StackOverError
异常:Exception - 可以解决的
运行时异常/未检查异常:RuntimeException -> Exception
ClassCastException -> 强制类型转换异常
NullPointerException -> 空指针异常(调用null值的属性或方法)
ArrayIndexOutOfBoundsException -> 数组越界异常
xxxIndexOutOfBoundsException
ConcurrentModificationException -> 集合迭代删除
NumberFormatException -> 数值转换异常
Integer.valueOf("aa");
ArithmeticException: / by zero
造成原因:程序员自身马虎,必须要解决的,改代码,基本不用try/catch
已检查异常:Exception
FileNotFoundException
IOException
ParseException
SQLException
UnsupportedEncodingException
ClassNotFoundException
造成原因:不是程序员自身问题,没办法完全避免的异常
可能是外部客观原因,不能彻底解决,只能避免
处理异常:只有已检查异常必须使用代码处理
未检查异常必须修改代码、纠正程序
1.方法上声明抛出 throws 已检查异常
2.自己处理 try/catch 代码块
注意:
try只能有一个,catch可以有多个,至少有一个
一个catch中可以捕获多个异常,用 | 连接
同一个异常,不能多次捕获
捕获异常,可以使用父类异常捕获
异常的父子类:如果同时捕获子类和父类,必须先捕获子类异常,再捕获父类异常(子类写在前,否则编译错误)
类的父子类:子类抛出的异常一定比父类抛出的异常小,有时不能抛出,只能try/catch
try不能独立使用
try-catch可以嵌套,不推荐
e.printStackTrace();打印代码执行栈路径
通常开发调试时会保留,上线时删除
finally -> 无论如何都会执行的
通常用来释放资源
前期代码,很少使用异常处理,JavaEE框架阶段,自定义异常处理
throw 手动抛出异常
异常处理原则:能自己解决的尽量自己解决,不能解决了再向外抛
异常属性:message - 异常提示信息,很重要
所有异常都有一个使用message初始化的构造器
所有异常都有getMessage()
自定义异常:
目的:为了区别不同的异常类型
定义方法:只需要添加构造器即可
其他全部靠继承
代码:
1.
try {// try中是可以正常执行的代码
System.out.println("异常之前");
System.out.println(new String("黑".getBytes(), "uf-8"));
// 在异常出现后的代码都执行不到
System.out.println("异常之后");
} catch (UnsupportedEncodingException e) {
// 捕获到指定异常后执行的代码 - 备用方案
System.out.println("捕获到异常");
//e.printStackTrace();
}
手制造异常,并抛出,等同于给方法调用者一个结果,结果是异常
2.
public class Login {
public static int login() {
int a = 10;
try {
//a = 1/0;
return a;
} catch (Exception e) {
return 1;
} finally {
a ++;
System.out.println("finally: " + a);
}
}
}
System.out.println(Login.login());
结果:
finally: 11
10