面试题:Java异常

Java 异常主要分为三类:

1. 检查异常(Checked Exception):在程序中必须显式处理,否则编译器将不允许代码通过编译。例如:

  1. IOException 及其子类:处理输入输出相关的异常,如文件读写错误、管道通信错误等。
  2. SQLException:数据库访问时可能发生的异常。
  3. ClassNotFoundException:类找不到异常,当试图通过字符串形式的类名加载类,但是找不到对应的类定义时抛出。
  4. FileNotFoundException:当试图打开一个不存在的文件时抛出。
  5. InterruptedException:线程等待时被中断的异常。
  6. URISyntaxException:处理URI字符串格式错误时抛出。
  7. ClassNotFoundException:尝试加载类时找不到对应的类定义。
  8. NoSuchFieldExceptionNoSuchMethodException:分别表示在反射操作中找不到指定的字段或方法时抛出。
  9. CloneNotSupportedException:当试图克隆一个没有实现Cloneable接口的对象时抛出。
  10. InstantiationException:当试图实例化一个抽象类或者接口时抛出。
  11. IllegalAccessException:当试图访问一个不允许访问的成员时抛出。
  12. IllegalArgumentException:传递给方法的参数不合法时抛出,尽管它是一个运行时异常,但在某些上下文中可能作为检查型异常对待。

这些只是众多检查型异常中的一小部分,实际上Java标准库中包含大量的检查型异常类,用于描述各种可能的错误情况。开发人员在编写代码时,应当根据具体的操作和上下文选择合适的异常类型进行处理或声明。

2. 运行时异常(Runtime Exception):在程序中可以不进行显示处理的异常。例如:

  1. NullPointerException:当试图访问或操作一个为 null 的对象引用时抛出。
  2. ClassCastException:尝试将对象强制转换为不是该对象实际类型的类或接口时抛出。
  3. IndexOutOfBoundsException 及其子类:
    • ArrayIndexOutOfBoundsException:当对数组的索引超出其界限时抛出。
    • StringIndexOutOfBoundsException:当对字符串的索引超出其界限时抛出。
  4. ArithmeticException:数学运算异常,比如除以零时抛出。
  5. IllegalArgumentException:传递给方法的参数不合法时抛出。
  6. NumberFormatException:将一个字符串转换为数字类型时,该字符串不符合数字格式要求时抛出。
  7. UnsupportedOperationException:当调用不支持的操作时抛出。
  8. IllegalStateException:当对象处于不适当的状态时调用方法,即方法调用时机不合适时抛出。
  9. ConcurrentModificationException:当迭代过程中集合被非法修改时抛出。
  10. NullPointerException:访问或操作 null 对象时触发。
  11. ArrayStoreException:试图将不兼容类型的对象存入数组时抛出。
  12. BufferOverflowException 和 BufferUnderflowException:在进行IO操作时,缓冲区溢出或下溢时抛出。
  13. NoSuchElementException:指示没有更多的元素,但是却被请求下一个元素时抛出。
  14. InputMismatchException:输入的数据与预期类型不匹配时抛出,常见于 Scanner 类的使用中。

这些运行时异常通常反映了程序逻辑的缺陷或不恰当的使用,开发者应当尽可能地避免这些情况的发生,通过代码审查和测试来提高程序的健壮性。

3. 错误(Error):表示系统级别的错误,程序无法处理,一旦出现此类错误,程序将立即停止运行。例如:

  1. Error:所有错误的基类,它本身是一个抽象类。

  2. VirtualMachineError:表示Java虚拟机发生了内部错误,如内存不足时的 OutOfMemoryError、请求栈深度过大时的 StackOverflowError、以及一般性的虚拟机错误 InternalError

  3. ThreadDeath:线程终止的一种特殊形式,虽然它是一个 "error",但在实践中通常像异常一样被捕获和处理。

  4. LinkageError:发生在链接过程中的错误,比如类之间版本不兼容导致的 VerifyError、类找不到所需的native库时的 UnsatisfiedLinkError

  5. ExceptionInInitializerError:当静态初始化器(static initializer)抛出异常时,这个错误会被抛出。

  6. NoClassDefFoundError:当Java虚拟机或类加载器在定义类时找不到相应的类定义时抛出。

  7. ClassNotFoundException:严格意义上讲,这是一个异常,但它经常与上述错误一起讨论,因为它也是类加载失败的一种表现,不过是在通过 Class.forName 等方式动态加载类时发生的。

总的来说,错误(Error)是Java异常体系中表示较为严重且通常不可恢复情况的一个分支,它们通常指示了JVM自身的问题或应用程序运行环境的重大故障。开发者在编写代码时,应关注于处理可恢复的异常(Exception),而对于错误,更多地是依赖于日志记录和系统级的监控来进行问题排查和恢复。

        需要注意的是, Error 与 Exception 不同。 Error 表示系统级别的错误或资源耗尽问题,对于这类错误,程序无法处理,只能选择终止程序的运行。而 Exception 表示由程序员编写的代码出现的异常情况,可以通过代码进行处理。 RuntimeException 是 Exception 的子类,是一种特殊类型的异常,也被称为“非检查异常”,这类异常可以不显式处理,但是建议在代码中进行处理以提高程序的健壮性和可读性。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值