面试-java-异常-finally-try/catch/-throw-throws

异常概述

Error和Exception的区别?

Error类和Exception类的父类都是Throwable类。
Error类:严重错误,由虚拟机抛出,java程序无法解决该问题;
Exception类:指的是代码逻辑的异常,又分为运行时异常(RuntimeException)和受检异常(CheckedExceptio);

RuntimeException与CheckedException有何异同?

区分运行时异常
非受检异常
受检异常
名称RuntimeExceptionChecked Exception
异常出现的原因程序逻辑错误与程序运行的上下文环境有关
是否必须处理否,可以选择捕获处理也可以不处理是,必须处理,不处理编译不通过
如何处理解决程序逻辑错误使用try…catch捕获
使用throws声明抛出交给父类处理

常见的异常类有哪些?

类名说明
NullPointerException空指针异常,访问的当前对象为空对象
IndexOutOfBoundsException索引超出范围异常,比如数组、字符串等的索引
FileNotFoundException文件访问空异常,通过指定路径名访问文件的时候,文件不存在;
IOException当发生某种 I/O 异常时,抛出此异常。此类是失败或中断的 I/O 操作生成的异常的通用类
IllegalArgumentException抛出的异常表明向方法传递了一个不合法或不正确的参数
SQLException提供关于数据库访问错误或其他错误信息的异常
ClassCastException当试图将对象强制转换为不是实例的子类时,抛出该异常

异常处理

try-catch-finally

finally块中的代码什么时候执行?

finally块中的代码是在return之前执行。即使return出现在try或者catch中。
程序执行return表示结束对当前函数的调用并跳出这个函数体,任何语句的执行只能在return前执行。
finally块的作用是:为了保证无论出现什么情况,finally块里的代码一定会被执行。

finally是不是一定会被执行到?

不一定会被执行到。
不会执行finally块的三种情况:

  • 程序进入try块之前就出现异常时,会直接结束,不会执行finally块(没有进入try);
  • 程序在try块被强制退出时,不会去执行finally块中的代码,比如try块中执行exit方法(使用System.exit() 终止当前虚拟机)。
  • 守护进程被终止。守护线程停止的条件:其他线程执行结束,main线程也执行结束,此时jvm虚拟机会退出,相应的守护线程也会退出。

try-catch-finally中,如果catch中存在return,finally还会执行吗?

在try、catch中添加return,finally会执行。
程序执行到return时会首先将返回值存储到指定的位置,再去执行finally块,最后再返回。
如果finally中含有return语句,会覆盖掉其他地方的return。

返回值类型不同的影响:

类型影响
基本数据类型无影响
改变返回值且没有return→没有任何影响
改变返回值且有return→直接覆盖
引用数据类型有影响
返回的是在finally 对前面return语句返回对象的修改值,无论finally块中是否有return

return返回值类型是基本数据类型

  • return在try、catch、finally中都存在,finally中的result会覆盖try/catch中的result。
// idea_face-javaface2-finallyReturnDemo
public class ReturnDemo1 {
    public static void main(String[] args) {
        System.out.println(test());
    }
    public static int test(){
        int result = 0;
        try {
            result = 1;
            return result+1;
        }catch (Exception e) {
            return result;
        }finally {
            return result;
        }
    }
    // 输出结果是1 
   ** 首先进入try中,返回值是2,再执行finally,修改结果为1}
  • try、catch有return,finally没有return,但是对基本数据类型result进行了修改,返回值result依旧是try/catch中的值。
// idea_face-javaface2-finallyReturnDemo
public class ResultDemo2 {
    public static void main(String[] args) {
        System.out.println(test());
    }
    public static int test(){
        int result = 0;
        try {
            result = 1;
            return result;
        }catch (Exception e) {
            return result;
        }finally {
            result = 2 ;
        }
    }
    // 输出结果是1
   ** 因为进入try后,执行return,会将result的值1存放在栈中,然后去执行finally中的语句,最后再返回存储值1的栈地址。
}

return返回值类型是引用数据类型
无论finally中是否有return,finally修改后的result对象都会被输出。因为引用数据类型存入栈的是地址,所以修改地址对应的内容会改变返回对象的内容。

// idea_face-javaface2.finallyReturnDemo
public class ResultDemo4 {
    public static void main(String[] args) {
        System.out.println(test4());
    }
    public static StringBuilder test4() {
        StringBuilder result = new StringBuilder("A");
        try {
            return result;
        } catch (Exception e) {
            return result;
        } finally {
            result.append("B");
            return result;
        }
    }
    // 输出值是AB
}
// idea_face-javaface2.finallyReturnDemo
public class ResultDemo5 {
    public static void main(String[] args) {
        System.out.println(test4());
    }
    public static StringBuilder test4() {
        StringBuilder result = new StringBuilder("A");
        try {
            return result;
        } catch (Exception e) {
            return result;
        } finally {
            result.append("B");

        }
    }
    // 输出值是AB
}

try-catch-finally中那个部分可以省略?

catch和finally可以省略其中一个,但必须保留一个。

throw和throws

throw和throws的区别?

区别throwthrows
书写位置在方法内部在方法的定义上
表示什么具体向外抛出异常的动作,抛出某种异常对象(实例)
代码语句 throw new 异常类名()
可能抛出某种异常
异常由谁处理方法体内部的语句方法的调用者处理

主线程可以捕获到子线程的异常吗?

正常情况下,如果不做特殊的处理,在主线程中是不能够捕获到子线程中的异常。
原因:
如果主线程可以捕获子线程的异常,会违背线程设计的理念;
线程设计的理念:“线程的问题应该线程自己本身来解决,而不要委托到外部”。
要想在主线程中捕获子线程的异常,使用Thread的静态方法。

Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandle());

关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?

throws 出现在方法申明上,表示可能会抛出某个异常;
throw 出现在方法内容,表示抛出一个指定异常,throw new 异常类名();
try catch 在try中有可能会抛出某个异常,一旦抛出异常,会在catch中进行捕获;
finally 表示无论是否捕获到异常,都会执行;

五个你最常见到的runtime exception。

异常名字解释案例
ArrayIndexOutBoundsException数组越界异常数组长度是5,遍历数组的索引值大于5
NegativeArraySizeException数组长度为负异常由于创建数组必须指定数组长度,当数组长度误写为负数时,会产生异常
IllegalArgumentException非法参数异常创建线程并设置线程优先级,setPriority(参数),只能是1-10之间数,如果设置1000会报错误
NullPointerException空指针异常比如前后端传输和接收参数不匹配问题,后端需要3个参数,前端只传来2个参数
IllegalStateException非法状态异常比如启动项目的时候,项目中使用了es服务,但是es服务启动
ClassCastException类型转换异常不能强行转换的时候会引发错误,

扩展202/8/30
es服务 = 开源的分布式搜索引擎,可以提供存储和搜索功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值