内容来自中软国际java培训
一、基本使用
基本结构
try{
//可能发生异常的语句
}catch(Exception e){
e.printStackTrace();//打印异常信息
}
一个可能发生多种不同异常的代码块,可以分别捕获异常
需要注意,哪一行异常捕获就直接出去了,不会执行后面的了
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date day = sdf.parse("1999-9-9");
String str = null;
str.length();
}catch (ParseException e){//捕获日期格式错误异常
e.printStackTrace();//打印异常信息
}catch (NullPointerException e){//捕获空指针异常
e.printStackTrace();
}
3. 一个可能发生多种异常的代码块,也可以在一个代码块中统一捕获
使用“|”表示捕获的异常是其中之一(关系为或)
try {
Date day = sdf.parse("1999-9-9");
String str = null;
str.length();
}catch (ParseException | NullPointerException e){
e.printStackTrace();//打印异常信息
}
4. 使用父类型异常可以捕获子类型异常
try {
}catch (Exception e){//父类型异常
e.printStackTrace();
}
5. 使用父类型异常可以同时捕获多个子类型异常
try {
Date day = sdf.parse("1999-9-9");
String str = null;
str.length();
}catch (Exception e){//可以捕获日期格式异常和空指针异常
e.printStackTrace();
}
6. 父子类型异常同时出现在多个catch块中,父类不能在前
子类异常在后,出现编译错误。因为父类异常在前,已经涵盖了子类异常。(若子类再出现,属于重复处理,或无法进入的catch)
try {
Date day = sdf.parse("1999-9-9");
String str = null;
str.length();
}catch (ParseException e){//子类型捕获日期格式异常
e.printStackTrace();
}catch (Exception e){//父类写在后面
e.printStackTrace();
}
7. finally:无论如何都必须执行的代码
try {
Date day = sdf.parse("1999/9/9");
return;//在未抛出异常时,首先会执行finally中的代码,才会执行return语句
}catch (ParseException e){
e.printStackTrace();
}finally{
System.out.println("无论如何,最终都会被执行的代码!");
}
8. try-finally用法
try {
String str = null;
str.length();
}finally {//有return也拦不了,反正都会执行
System.out.println("无论如何必须被执行!");
}
二、throw与throws
throws向外抛出异常
在方法中出现的异常,可以不处理,在方法的申明后,使用“throws+异常类名”,表示继续向外抛出
对于抛出异常的方法的调用者来讲,应当处理它(若不处理,则继续向外抛出)
2. throws层层抛出异常
向外抛出异常,调用者也不处理,继续抛给下一个
3. throw自行抛出异常对象
public static int div(int a, int b) throws Exception {
if(b == 0){
//自行抛出异常:使用throw+抛出的异常对象
throw new Exception("除法错误:b不能为0!");
}
return a / b;
}
三、抛出异常与方法覆盖
对于方法的覆盖(Override),抛出异常的规定:
若父类方法抛出异常,则子类方法:
1.可以不抛出异常
2.可以抛出与父类方法一样的异常
3.可以抛出父类方法抛出的异常的子类异常