备战BAT面试:查漏补缺——关于异常

学习记录,知识点零散,如有错误,欢迎指出!

Java学习记录


关于异常

备战BAT面试:查漏补缺——关于异常_第1张图片


运行时异常,非运行时异常和error

注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。

  • Error
    是程序无法处理的错误,表示运行应用程序中较严重问题。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。

例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。

  • Exception
    是程序本身可以处理的异常。Exception 类有一个重要的子类 RuntimeException。RuntimeException 类及其子类表示“JVM 常用操作”引发的错误。异常是可以被捕获的。
    • 运行时异常
      这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。(但是到了运行时就会报错)
    • 非运行时异常(编译异常)
      是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。

编译期和运行期的典型操作

编译时期 运行时期
静态绑定 动态绑定
使用private,static,final修饰变量或方法使用静态绑定 可以被子类重写的方法则会根据运行时的对象进行动态绑定
使用类信息来完成 需要使用对象信息来完成
重载(Overload)的方法 重写(Override)的方法

捕获异常

在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。

try{}catch{}finally{}

容易忽略的点

  1. 在java的一个异常处理中,可以包含多个的语句块是catch,try只有一个catch可以有很多个。
  2. 如果try,finally语句里均有return,忽略try的return,而使用finally的return.

finally语句一定会执行吗?
官方说明:try块退出时,finally块始终执行。 这样可以确保即使发生意外异常,也可以执行finally块。 但是,最后,它不仅对异常处理有用,它还使程序员避免因return,continue,break而意外跳过清理代码。 将清理代码放在finally块中始终是一个好习惯,即使没有例外的情况也是如此。

以上的说明是基于程序正常运行的情况下,如果在try或者catch语句执行时JVM退出了finally就不会被执行,例如运行中的线程被打断或者杀死,这样即使程序继续运行,finally也不会执行


finally确实是一个很有意思的点,值得我们深入的了解一下,例如下面的例子:

public class Test {
public static void main(String[] args) {
       System.out.println("return value of getValue(): " + getValue());
    }

public static int getValue() {
       int i = 1;
       try {
       		return i;
       } finally {
            i++;
       }
    }
}

这是我在网上看到的网友的求助帖。这里给出答案,输出的值是1。那为什finally没有执行呢?究其原因,是当程序执行到try{}语句中的return方法时,它会干这么一件事,将要返回的结果存储到一个临时栈中,然后程序不会立即返回,而是去执行finally{}中的程序, 在执行a = 2时,程序仅仅是覆盖了a的值,但不会去更新临时栈中的那个要返回的值 。执行完之后,就会通知主程序“finally的程序执行完毕,可以请求返回了”,这时,就会将临时栈中的值取出来返回。

那什么情况会返回2呢?特殊情况,在语句块中只有return和throw时会返回1,如果语句块中只有break和continue时会返回2。因为return和throw会带有返回值而其他两个没有。


自定义异常

使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常。用户自定义异常类,只需继承Exception类即可。
在程序中使用自定义异常类,大体可分为以下几个步骤。
(1)创建自定义异常类。
(2)在方法中通过throw关键字抛出异常对象。
(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
(4)在出现异常方法的调用者中捕获并处理异常。

你可能感兴趣的:(备战BAT面试)