面试3.5_Java_异常

本文详细讲解了Java中Error和Exception的区别,运行时异常与受检异常的区分,throw与throws的用法,以及JVM异常处理机制。此外,NoClassDefFoundError和ClassNotFoundException的剖析及ExampleA和ExampleB继承关系的应用实例也一并涵盖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


参考链接:

  1. Java异常 面试题](https://thinkwon.blog.youkuaiyun.com/article/details/104390689)

1 Error 和 Exception 区别是什么?

  1. Error:虚拟机相关错误,如系统崩溃,内存不足,堆栈溢出等;一旦发生,程序会被终止,仅靠程序本身无法恢复;
  2. Exception :可以在程序中进行捕获并处理

2 运行时异常、受检异常区别

  1. 运行时异常:RuntimeException 及其子类,表示 JVM 在运行期间可能出现的异常。 Java 编译器不会检查运行时异常
  2. Java 编译器会检查受检异常
  3. 区别是否强制要求调用者必须处理此异常。

3 throw 、throws 区别

  1. throw :方法内部,只能抛出一种异常,用来抛出方法或代码块中的异常,受查异常和非受查异常都可以被抛出。
  2. throws :方法声明,可抛出多个异常,用来标识该方法可能抛出的异常列表。一个方法用 throws 标识了可能抛出的异常列表,调用该方法的方法中必须包含可处理异常的代码,否则也要在方法签名中用 throws 关键字声明相应的异常。

4 JVM 是如何处理异常的?

  1. 在一个方法中如果发生异常,这个方法会创建一个异常对象,并转交给 JVM

    1. 该异常对象包含异常名称异常描述以及异常发生时程序的状态
    2. 创建异常对象并转交给 JVM 的过程称为抛出异常。
    3. 可能有一系列的方法调用,最终才进入抛出异常的方法,这一系列方法调用的有序列表叫做调用栈
  2. JVM 会顺着调用栈去查找看是否有可以处理异常的代码

    1. 如果有,则调用异常处理代码。当 JVM 发现可以处理异常的代码时,会把发生的异常传递给它。
    2. 如果没有,JVM 就会将该异常转交给默认的异常处理器(默认处理器为 JVM 的一部分),默认异常处理器打印出异常信息并终止程序

5 NoClassDefFoundError 、ClassNotFoundException 区别

区别NoClassDefFoundErrorClassNotFoundException
类型Error,由 JVM 引起,不应尝试捕获受查异常。需要显式地使用 try-catch 对其进行捕获和处理,或在方法签名中用 throws 关键字进行声明。
出现原因JVM 或 ClassLoader 尝试加载某类时在内存中找不到该类的定义1. Class.forName, ClassLoader.loadClassClassLoader.findSystemClass 通过传入的类路径参数动态加载类至内存时没有找到该类;
2. 某个类已经由一个类加载器加载至内存中,另一个加载器又尝试去加载它。

6 类 ExampleA 继承 Exception,类 ExampleB 继承ExampleA

  1. 根据里氏代换原则:能使用父类型的地方一定能使用子类型
try {
	throw new ExampleB("b")
} catchExampleA e){
	System.out.println("ExampleA");
} catchException e){
	System.out.println("Exception");
}

输出

ExampleA

抓取 ExampleA 类型异常的 catch 块能够抓住 try 块中抛出的 ExampleB 类型的异常

class Annoyance extends Exception {
}
class Sneeze extends Annoyance {
}
public class Solution {
    public static void main(String[] args) throws Exception {
        try {
            try {
                throw new Sneeze();
            } catch ( Annoyance a ) {
                System.out.println("Caught Annoyance");
                throw a;
            }
        } catch ( Sneeze s ) {
            System.out.println("Caught Sneeze");
            return ;
        } finally {
            System.out.println("Hello World!");
        }
    }
}

输出

Caught Annoyance
Caught Sneeze
Hello World!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值