java程序员面试(四)

异常处理

  1. finally块中的代码什么时候被执行
  • try{}里面有一个return语句,那么紧跟在这个try后面的finally{}中的代码是否会被执行?如果会的话,是什么时候被执行,在return之前还是在return之后呢?
public class Test{
    public static int testFinally(){
        try{
            return 1;
        }catch(Exception e){
            return 0;
        }finally{
            System.out.println("execute finally");
        }
    }
    public static void main(String [] args){
        int result = testFinally();
        System.out.println(result);
    }
}

执行结果:

execute finally

1

public class Test {
    public static int testFinally(){
        try{
            return 1;
        }catch(Exception e){
            return 0;
        }finally{
            System.out.println("execute finally");
            return 3;
        }
    }
    
    public static void main(String [] args){
        int result = testFinally();
        System.out.println(result);
    }
}

执行结果:

execute finally

3

对于基本类型的数据,在finally语句中改变return的值对返回值没有任何影响,而对引用类型的数据会有影响。

public calls Test {
    public static int testFinally() {
        int result = 1;
        try {
            result = 2;
            return result;
        }catch(Exception e){
            return 0;
        }finally {
            result = 3;
            System.out.println("execute finally1");
        }
    }
    
    public static StringBuffer testFinally2(){
        StringBuffer s = new StringBuffer("Hello");
        try {
            return s;
        }catch(Exception e){
            return null;
        }finally{
            s.append("  World");
            System.out.println("execute finally2");
        }
    }
    public static void main(String[] args) {
        int resultVal = testFinally1();
        System.out.println(resultVal);
        StringBuffer resultRef = testFinally2();
        System.out.println(resultRef);
    }
}

程序执行结果:

execute finally1

2

execute finally2

Hello World

程序在执行到return时会首先将返回值存储在一个指定的位置,其次去执行finally块,最后再返回。

出现在java程序中的finally块是不是一定会被执行?

不一定

  • 当程序在进入try语句块之前就出现异常时,会直接结束,不会执行finally块中的代码。
  • 当程序在try块中强制退出时也不会去执行finally块中的代码。
  1. 异常处理的原理是什么?
  • 异常是指程序运行时(非编译时)所发生的非正常情况或错误,当程序违反了语义规则时,JVM就会将出现的错误表示为一个异常并抛出。这个异常可以在catch程序块中进行捕获,然后及逆行处理。而异常处理的目的则是为了提高程序的安全性和鲁棒性。
  • java.lang.Throwable作为所有异常的弗雷。java api中已经定义了许多异常类,这些异常类分为Error和Exception两大类。
  • 违反语义规则的两种情况:

    • 一种时Java类库内置的语义检查,例如当数组下标越界时会引发IndexOutOfBoundsException
    • 另一种情况是Java允许开发人员扩展这种语义检查,开发人员会创建自己的异常类。
  1. 运行时异常和普通异常有什么区别

    • Error表示程序在运行期间出现了非常严重的错误,并且该错误是不可恢复的,由于这是JVM层次的严重错误,因此这种错误是会导致程序终止执行的。
    • Exception 表示可恢复的异常,是编译器可以捕捉到的。他包含两种类型:检查异常和运行时异常。
    • 检查异常: 检查异常时在程序中最经常碰到的异常。所有继承自Exception并且不是运行时异常的异常都是检查异常,比如常见的IO异常和SQL异常。
    • 运行时异常不同于检查异常,编译器没有强制对其进行捕获并处理。
  2. 异常处理时需要注意的几个问题:

    • Java异常处理用到了多态的概念,如果在异常处理过程中,先捕获了基类,然后再捕获子类,那么捕获子类的代码块将永远不会被执行。
    • 尽早抛出异常,同时对捕获的异常进行处理,或者从错误中恢复,或者让程序继续执行。
    • 可以根据实际的需求自定义异常,这些自定义的异常类只要继承自Exception类即可。
    • 异常能处理就处理,不能处理就抛出。

本文链接:

https://heyzen.club/index.php/J/298.html
1 + 9 =
快来做第一个评论的人吧~