[Java 面试] Java SE(异常)

1.Java中throw和throws的区别

在 Java 中,throwthrows都与异常处理相关,但它们的用法和作用有明显区别:

作用不同

  • throw:用于主动抛出一个具体的异常对象,在方法体内使用
  • throws:用于声明方法可能会抛出的异常类型,在方法声明处使用

语法不同

  • throw后面跟异常对象(需要创建异常实例)
if (age < 0) {
    throw new IllegalArgumentException("年龄不能为负数");
}
  • throws后面跟异常类型(可以是多个,用逗号分隔)
public void readFile() throws IOException, FileNotFoundException {
    // 方法体
}

数量不同

  • throw每次只能抛出一个异常对象
  • throws可以声明多个异常类型

目的不同

  • throw:实际触发异常,中断当前流程,将异常传递给上层调用者
  • throws:告知方法的调用者该方法可能会抛出哪些异常,让调用者做好处理准备

简单来说,throw是 "行动派",实际抛出异常;throws是 "声明派",提前告知可能会出现的异常

2.在异常中 finally 中的语句一定会被执行吗

在 Java 中,finally语句块中的代码通常会在trycatch块执行之后无论是否发生异常都执行。但在某些特殊情况下,finally块中的代码可能不会被执行,具体如下:

  • 程序提前终止:如果在进入try块之前程序就已经结束,例如通过return语句直接退出方法,或者调用了System.exit()Runtime.getRuntime().halt()等方法使 JVM 终止,那么finally块将不会执行。

  • 无限循环或死锁:如果try块或catch块中的代码进入了无限循环或者死锁状态,导致程序无法正常跳出try块,那么finally块中的代码也无法被执行。

  • 外部强制终止:如果在运行 Java 程序时,操作系统或外部进程强制终止了程序,比如操作系统出现故障、内存不足或管理员手动终止进程等情况,finally块中的代码同样不会执行。

  • 线程死亡:如果当前执行的线程在try块或catch块中因为某些原因死亡,而没有进入到finally块,那么finally块中的代码也不会执行。

  • JVM 崩溃:如果 Java 虚拟机(JVM)崩溃,例如遇到内部错误或严重的内存问题等导致 JVM 无法继续运行,那么任何finally块中的代码都不会执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值