4 处理异常
-
我们调用其他工具类时,传递了一些信息。
-
工具类在使用我们提供的信息执行功能时出现了问题,不知道该如何处理
-
就会将问题形成一个异常对象描述,并抛给我们(此时我们是调用者)
-
这个时候我们应该如何处理异常呢?
-
异常处理的过程是:要么我们在当前的方法中处理,要么就继续向上抛,抛给我们的调用者处理
如果一直都没有方法处理,最终会抛给JVM。JVM会打印错误信息并停止程序
过程中如果一个方法无法处理这个异常
1.重新创建一个异常对象,手动throw抛给调用者
2.不做任何处理,会自动抛给调用者
-
我们如何处理异常?
在方法中,使用try{}包裹可能产生异常对象的代码
运行时一旦产生了异常对象,try就会对其进行捕获
会将异常对象交给对应的catch来处理
public void t1(int age){
if(age < 0 || age > 150){
throw new AgeOutOfBoundsException();
}
}
//----------------------------
public void t2(){
int age =scanner.nextInt();
try{
t1(age);
}
}
在try{}代码块后面跟着catch{}来处理指定的异常问题
在try的后面跟多个catch,来处理不同的异常情况
public void t2(){
int age =scanner.nextInt();
try{
t1(age);
。。。。
}catch(NullPointerException e){
//根据空指针异常情况来处理异常
}catch(ArrayIndexOutOfBoundsException e){
//根据数组下标越界异常情况来处理异常
}catch(AgeOutOfboundsException e){
//根据年龄越界异常情况处理异常
}
}
注意:如果多个catch处理的异常对象存在继承关系
要求对父类异常情况的处理必须在catch、列表的后面
try{
}catch(NullPointerException e){
}catch(Exception e){
}
在try和catch的后面,可以跟有finally{}块,作为try和catch的统一出口
如果有一段代码,在try中也要执行,在catch也要执行,就可以将其写在finally中。
try{
a
b
c
}catch(){
a1
a2
a3
dddd
}finally{
dddd
}
注意 try-catch-finally组合
-
try-catch-finally可以通过使用,按照上述的顺序
- try的后面可以没有catch,但需要紧跟finally
try{
}finally{}
try-catch不能单独存在,catch必须跟在try的后面
- 一旦有finally,无论执行try,还是执行catch,finally中代码一定执行。哪怕try和catch中有
return
try{
return 10 ;
}catch(){
return 20 ;
}finally{
System.out.println("--------------------------");
}
如果try,catch和finally中都有return,最终返回的finally中的值。
try{
return 10 ;
}catch(){
return 20 ;
}finally{
return ;
}
5 受检异常与非受检异常
-
所有继承RuntimeException的类,都称为非受检异常
在编码时,对可能产生异常的代码不必须提前做处理或声明,但可以做处理或声明
-
其余的异常类,都称为受检异常,要求在编码的时候:
-
如果方法能处理异常,必须对可能产生异常的代码提前做try-catch处理
-
如果方法不能处理异常,会抛给调用者,由调用者处理,就需要调用者提前try-catch处理,当前方法需要使用throws关键字声明(告诉调用者),当前方法有可能产生一个无法处理的受检异常,你的try-catch
-
FileNotFoundException就是一个受检异常
public void t1(){ t3(); try{ t2(); }catch(FileNotFoundException e){ } } public void t2()throws FileNotFoundException{ new FileInputStream("c:/z/1.txt"); } public void t3(){ try{ //这可能会抛出一个FileNotFoundException 受检异常 }catch(FileNotFoundException e){} }
-
注意
-
一个方法可以使用throws声明多个受检异常,使用逗号隔开
public void t1()throws Exception1 , Exception2 , ...{}
那么今天的内容就到这里啦,如果存在哪些疑问或问题欢迎大家指出,我们下期再见~