异常、异常捕获、自定义异常

异常是导致程序中断执行的一种指令流。程序之中如果出现异常并且没有合理处理的话就会导致程序终止执行。

为了保证程序在出现之后可以正常执行完毕,就需要进行异常处理。

先来看一下异常的继承类结构:

所有的异常都是由Throwable继承而来。其中Error类描述了Java运行时内部错误和资源耗尽错误。应用程序不抛出此类异常,这种内部错误一旦出现,除了告知用户并使程序安全终止之外,再无能为力。这种情况很少出现。

我们需要关心的是Exception以及其子类。在Exception之下又分为两个分支,RuntimeException和IOException。

RuntimeException:由于程序错误导致的异常

IOException:程序本身没有问题,由于向像I/O错误这类问题导致的异常

非受查异常(无须强制处理):所有继承于Error或RuntimeException的异常类称为非受查异常。

受查异常(必须强制处理):所有继承于Exception与IOException的类称为受查异常。

范例:异常产生(被除数为0)

现在程序之中产生了异常,可以看出在异常语句之前的语句可以正常执行完毕,而异常产生之后程序直接结束。为了保证程序出现异常后还可以继续向下执行,就需要异常处理。

try{
    有可能出现异常的语句 ;
}[catch (异常类 对象) {
    异常处理
} ... ]
[finally {
    异常的出口(无论会不会出现异常都会执行finally块)
}]

[ ]内的为可选项。catch块捕获异常并进行处理。

对于以上三个关键字,可以出现的组合:try...catch... , try...finally... , try...catch...finally...

对异常进行处理

  • 关键字throws,关键字throw

throws:作用于方法上。在进行方法定义时,如果要明确告诉调用者本方法可能产生哪些异常,可以使用throws关键字进行声明,表示将异常拋回给调用方。并且当方法出现问题后可以不进行处理。

注意:如果调用了throws声明的方法,那么在调用时必须明确的使用try...catch...进行捕获,因为该方法有可能产生异常,所以必须按照异常的方式来进行处理。***主方法本身也是一个方法,所以主方法上也可以使用throws进行异常抛出,这个时候如果产生了异常就会交给JVM处理。

throw:用在方法中,一般与自定义的异常类搭配使用。throw语句直接写在方法之中,表示人为进行异常的抛出。如果异常类对象不希望由JVM产生而通过用户产生,就可以使用throw语句来完成。

一般而言,throw和break,continue都要和if结合使用。

  • RuntimeException类(*****)

先看一个例子

这是parseInt的源码定义:

public static int parseInt(String s) throws NumberFormatException;

这个方法上已经明确抛出异常,但是在进行调用的时候发现,即使没有进行异常处理也可以正常执行。这个就属于
RuntimeException的范畴。

面试题请解释Exception与RuntimeException的区别,请列举几个常见的RuntimeException。

区别:首先Exception类是RuntimeException类的父类。使用Exception定义的异常都要求必须使用异常处理(受查异常),而使用RuntimeException定义的异常可以由用户选择性的来进行异常处理(非受查异常)。

常见RuntimeException:ClassCastException、NullPointerException等。

  • 自定义异常

自定义异常类可以继承两种父类:Exception、RuntimeException。

范例:实现自定义异常(当两数相加等于5时,抛出异常)

猜你喜欢

转载自blog.csdn.net/Sun_GLL/article/details/86528743