java异常面试的问题

1.throw 和 throws 的区别?

throw:定义在函数内部,后面只能跟一个异常对象,抛出具体问题,让调用者去处理。
throws:定义在函数上,后面可以跟多个异常类,用于声明函数,告诉调用者该功能可能具备的问题,并让调用者给出预定义的处理方式。

2.final、finally、finalize 有什么区别?

final:定义在类,方法,变量上,修饰类不能被继承,修饰方法,方法不能被覆盖,修饰变量,变量不能被改变。
finally:一般使用在try-catch-finally中,通常在finally中写资源释放的代码
finalize:垃圾回收器调用的方法,当我们执行System.gc(),垃圾回收器就会调用finalize()回收垃圾。

3.try-catch-finally 中哪个部分可以省略?

catch:可以省略,表示没异常需要处理 try-finally
finally:表示没有资源需要释放 try-catch 

4.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

会执行,会在return前执行
在try-catch-finally,return遇到finallyreturnfinally无效,即:
     1.try catch块里return的时候,finally也会被执行。
     2.finally里的return语句会把try catch块里的return语句效果给覆盖掉。
/*
 * catch中存在return,而finally中不存在
 */
public class FinallyDemo2 {
    public static void main(String[] args) {
        System.out.println(getInt());
    }

    public static int getInt() {
        int a = 10;
        try {
            System.out.println(a / 0);
            a = 20;
        } catch (ArithmeticException e) {
            a = 30;
            return a;
            /*
             * return a 在程序执行到这一步的时候,这里不是return a 而是 return 30;这个返回路径就形成了
             * 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
             * 再次回到以前的路径,继续走return 30,形成返回路径之后,这里的a就不是a变量了,而是常量30
             */
        } finally {
            a = 40;
        }
    }
}
//分析:catch中会return 30,但是发现后面还有finally,所以转去执行finally,finally中执行完毕后,再次回到catch的return 30,返回结果30常量。

结果:30

package com.java_02;

/*
 * java面试题--如果catch里面有return语句,finally里面的代码还会执行吗?
 */
public class FinallyDemo2 {
    public static void main(String[] args) {
        System.out.println(getInt());
    }

    public static int getInt() {
        int a = 10;
        try {
            System.out.println(a / 0);
            a = 20;
        } catch (ArithmeticException e) {
            a = 30;
            return a;
            /*
             * return a 在程序执行到这一步的时候,这里不是return a 而是 return 30;这个返回路径就形成了
             * 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
             * 再次回到以前的路径,继续走return 30,形成返回路径之后,这里的a就不是a变量了,而是常量30
             */
        } finally {
            a = 40;
            return a; //如果这样,就又重新形成了一条返回路径,由于只能通过1个return返回,所以这里直接返回40
        }

    }
}
//分析:catch中会return 30,但是发现后面还有finally,所以转去执行finally,finally在执行的过程中,发现有return 40;又因为函数只能有一个返回值,所以直接返回40.

结果:40

5.常见的异常类有哪些?
RuntimeException

序号异常名称异常描述
1java.lang.ArrayIndexOutOfBoundsException数组索引越界异常。
2java.lang.ArithmeticException算术条件异常。譬如:整数除零等。
3java.lang.SecurityException安全性异常
4java.lang.IllegalArgumentException非法参数异常
5java.lang.ArrayStoreException数组中包含不兼容的值抛出的异常
6java.lang.NegativeArraySizeException数组长度为负异常
7java.lang.NullPointerException空指针异常。

CheckedException子类

序号异常名称异常描述
1IOException操作输入流和输出流时可能出现的异常
2EOFException文件已结束异常
3FileNotFoundException文件未找到异常

6什么情况下,finally中的语句不会执行

try执行之前,程序已经返回
try执行之前,程序发生异常
finally之前,程序执行了System.exit(0);
在后台执行的线程中,当前台线程终止时,后台线程中的fianlly不会被执行。(可以使用Sleep()函数来进行时间的等待)

1.在执行异常处理代码之前程序已经返回

public static boolean getTrue(boolean flag) {
        if (flag) {
            return flag;
        }
        try {
            flag = true;
            return flag;
        } finally {
            System.out.println("我是一定会执行的代码?");
        }
    }

2.在执行异常处理代码之前程序抛出异常

public static boolean getTrue(boolean flag) {
        int i = 1/0;
        try {
            flag = true;
            return flag;
        } finally {
            System.out.println("我是一定会执行的代码?");
        }
    }

3.finally之前执行了System.exit()

public static boolean getTrue(boolean flag) {
        try {
            flag = true;
            System.exit(1);
            return flag;
        } finally {
            System.out.println("我是一定会执行的代码?");
        }
    }

4.所有前台线程终止时,后台线程会突然终止

public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(5);
                } catch (Exception e) {
                }finally{
                    System.out.println("我是一定会执行的代码?");
                }
            }
        });
        t1.setDaemon(true);//设置t1为后台线程
        t1.start();
        System.out.println("我是主线程中的代码,主线程是非后台线程。");
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值