异常类型
受检异常和非受检异常
非受检异常在IDEA和eclipse中不会提醒,它们是可能会发生也可能不会发生的异常
非受检异常即使不处理也不会影响代码的执行
try-catch
try-catch的基本格式
try{
}catch(异常对象 对象名称){
}catch(异常对象 对象名称){
}
try{
}catch(异常对象1 | 异常对象2 对象名称){
}
try{
}catch(异常对象1和2的父类 对象名称){
}
try{
}catch(异常对象 对象名称){
}finally{
}
finally是必然执行的异常统一处理出口
无论是否发生异常,finally都必然执行
经典问题
经典问题:finally部分的语句什么时候会执行,什么时候不会执行?
int a = 10;
int b = 0;
try{
System.out.println(a/b);
}catch(NumberFormatEception e){
System.out.println("分母不可以为0");
}finally{
System.out.println("执行完毕");
}
控制台的输出为执行完毕
只要没有内存溢出,计算机停电,程序终止等问题,finally内的语句一定会被执行,即使没有捕获到分母为0的异常,程序崩溃也是如此
int a = 10;
try{
return a;
}catch(Eception e){
return 0;
}finally{
a = 20;
}
main方法内打印a的值,控制台的输出为10
因为a是基本数据类型,return只是将a的值复制了一份返回,即使finally在方法结束前必然会执行也无法影响到a的值,因为return的a是10这个值的复制
Person p = new Person();
p.age = 18;
try{
return p.age;
}catch(Eception e){
return 0;
}finally{
p.age = 28;
}
main方法内打印p.age的值,控制台的输出为28
p是引用数据类型,p在创建时,栈中只存储了p的引用地址,因为finally必然会在return前执行,因此堆内存中的age被改为了28,返回的自然也是28
int a = 10;
try{
System.exit(0);
}catch(Eception e){
return 0;
}finally{
System.out.println("执行完毕");
}
控制台没有输出
System.exit();这个方法强制终止程序,程序被终止时,finally内的语句不再执行
throws,throw
thorws关键字
如果异常是因为传入的参数而产生的,则应该将异常抛出
throw关键字
当传参不合理,又没有合适的异常名称可以描述时考虑使用
RuntimeException e = new RuntimeException("输入不合理");
throw e;