1.Java中throw和throws的区别
在 Java 中,throw和throws都与异常处理相关,但它们的用法和作用有明显区别:
作用不同
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语句块中的代码通常会在try或catch块执行之后无论是否发生异常都执行。但在某些特殊情况下,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块中的代码都不会执行。
20万+

被折叠的 条评论
为什么被折叠?



