java异常 笔试面试考点2: 异常处理语法

 

java异常处理本质

Java的异常处理本质上是抛出异常和捕获异常

  • 抛出异常:明确异常类型,创建异常对象,并抛出交给上层环境处理。
  • 捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。

       潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。
 

异常处理语法

Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。

try用来指定一块预防所有异常的程序。

catch子句紧跟在try块后面,用来指定你想要捕获的异常的类型;

throw语句用来明确地抛出一个异常;

throws用来声明一个方法可能抛出的各种异常;

finally为确保一段代码不管发生什么异常状况都要被执行,在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。

一般情况下是用try来执行一段程序,如果系统会抛出(throw)一个异常对象,可以通过它的类型来捕获(catch)它,或通过总是执行代码块(finally)来处理。

throw明确抛出异常语法示例:

​if(stu == null){
    throw new NullPointerException();
}

声明方法可能抛出异常语法:

public void info() throws Exception
{
   //body of method
}

捕捉异常语法如下:

try{
  // 程序代码
}catch(异常类型1 异常的变量名1){
  // 程序代码
}catch(异常类型2 异常的变量名2){
  // 程序代码
}finally{
  // 程序代码
}

// catch 不能独立于 try 存在。
// 在 try/catch 后面添加 finally 块并非强制性要求的。
// try 代码后不能既没 catch 块也没 finally 块。
// try, catch, finally 块之间不能添加任何代码。

注意点与考点

1. final、finally、finalize的区别

final用于声明变量、方法和类的,分别表示变量值不可变,方法不可覆盖,类不可以继承

finally是异常处理中的一个关键字,表示finally{}里面的代码一定要执行

finalize是Object类的一个方法,在垃圾回收的时候会调用被回收对象的此方法。

2. throw和throws区别

throw:

    (1)throw语句用在方法体内,表示抛出异常,由方法体内的语句处理

    (2)throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw一定是抛出了某种异常

throws:

    (1)throws语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常处理。

    (2)throws主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。

    (3)throws表示出现异常的一种可能性,并不一定会发生这种异常。

3.  多重catch语句

Java通过异常类描述异常类型。对于有多个catch子句的异常程序而言,应该尽量将捕获底层异常类的catch子句放在前面,同时尽量将捕获相对高层的异常类的catch子句放在后面。否则,捕获底层异常类的catch子句将可能会被屏蔽。

4. try语句的嵌套

一个try语句可以在另一个try块的内部。每次进入try语句,异常的前后关系都会被推入堆栈。如果一个内部的try语句不含特殊异常的catch处理程序,堆栈将弹出,下一个try语句的catch处理程序将检查是否与之匹配。这个过程将继续直到一个catch语句被匹配成功,或者是直到所有的嵌套try语句被检查完毕。如果没有catch语句匹配,Java运行时系统将处理这个异常。

5. 关于finally的执行顺序

首先会执行try里面的代码,执行完了会查找有没有finally,如果没有,直接执行return或者是throw,如果有finally,先执行finally里面的代码,再执行try里面的 return或者是throw;一般来讲finally里面不会写return或者是throw,如果写了,会覆盖掉try里面的return和throw。

public static void main(String[] args) {  
    int i=getInt();  
    System.out.println(i);  
}  
  
private static int getInt() {  
    // TODO Auto-generated method stub  
    try {  
        return 0;  
    } catch (Exception e) {  
        // TODO Auto-generated catch block  
        e.printStackTrace();  
    }finally{  
        return 1;  
    }  
}  

上面的代码输出结果为 1, try块中的return语句被finally语句中的return覆盖。 

6.关于异常链

“异常链”是Java中异常处理重要概念,是指在进行一个异常处理时抛出了另外一个异常,由此产生了一个异常链条。该技术大多用于将“ 受检查异常” ( checked exception)封装成为“非受检查异常”(unchecked exception)或者RuntimeException。顺便说一下,如果因为因为异常你决定抛出一个新的异常,你一定要包含原有的异常,这样,处理程序才可以通过getCause()和initCause()方法来访问异常最终的根源。

 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值