异常相关概念

  • [x] Error 和 Exception有什么区别
  • [x] 什么是受检查的异常,什么是运行时异常
    运行时异常与一般异常有何异同
  • [ ] 什么是异常链
  • [x] throw 和 throws 有什么区别?
  • [ ] 简述一个你最常见到的runtime exception(运行时异常)

一、Error和Exception有什么区别?

联系

  • Error和Exception都继承自Throwable,RuntimeException继承自Exception。Throwable从Object直接继承而来,并且实现了Serializable接口。

  • Error和RuntimeException及其子类称为未检查异常(Unchecked Exception),其他异常称为受检查异常(Checked Exception)。

区别:

  • Error用于标记严重错误,一般是指与虚拟机相关的问题,如系统崩溃、内存空间不足、方法调用栈溢出等。如java.lang.StackOverFlowError和java.long.OutOfMemoryError。
    这类错误导致应用程序中断,程序不必处理,建议让程序终止。

  • Exception类表示程序可以处理的异常,可以捕获且可能恢复。

二、运行时异常和受检查的异常

Exception又分为运行时异常(Runtime Exceptin)和受检查的异常(Checked Exception)。

  • RuntimeException: 运行时异常是因为程序员执行了错误操作,Java编译器不会去检查。这类异常即使没有try/catch捕获,也没用throws抛出,编译还是会通过。如除数为零的ArithmeticException、错误的类型转换、数组越界和试图访问空指针等。

  • 受检查的异常:这类异常一般是应用环境中出现的外部错误,如果没有try/catch,也没有throws抛出,编译不会通过。如文件找不到、试图从文件尾后读取数据等。

三、什么是异常链?

异常链是一种面向对象编程技术,指将捕获的异常包装进一个新的异常并重新抛出的异常处理方式。该技术大多用于将“受检查异常”(checked exception)封装成为“非受检查异常”(unchecked exception)或者RuntimeException。

如果因为异常决定要抛出一个新的异常,一定要包含原有的异常,这样,处理程序才可以通过getCause()和initCause()方法来访问异常最终的根源。

四、throw和throws的区别

用户程序自定义的异常和应用程序特定的异常,必须借助于throw和throws语句来定义抛出异常。

  • throw是语句抛出异常,用在方法体内,抛出的是具体异常的实例,由方法体内的语句处理。
  • throws在方法的声明中抛出异常,用在方法声明后面,抛出的是可能出现的异常,自己不去处理,由方法的调用者处理。throw可以中断程序运行,因此可以用来代替return,最常见的例子是用throw在一个空方法中需要return的地方抛出UnSupportedOperationException。
private static void show() {
        throw new UnsupportedOperationException("Not yet implemented");
    }

参考资料

Java的Exception和Error面试题

你可能感兴趣的:(异常相关概念)