2023年11月29日发(作者:)

Java——异常(Exception

A.异常错误

1. 异常分类 所有异常都是由Throwable继承⽽来,但在下⼀层⽴即分解为两个分⽀:ErrorException Error异常:该层次异常描述了系统运⾏时内部错

误和资源耗尽错误。应⽤程序不该抛出这种类型的对象,如果出现这种错误,除了通 告给⽤户,并尽⼒使程序安全推出,再也⽆能为了。这种情况很少

出现。 Exception异常:该层次异常⼜分解为两个分⽀,⼀个派⽣于RuntimeException;另⼀个分⽀包含其他异常。划分为两个分⽀的规则是:由程序

错误导致的异常属于RuntimeException;⽽程序本⾝没问题,但是由于像I/O错误这类问题导致的异常属于其他异常。

Java语⾔规范将派⽣于Error类或RuntimeException类的所有异常称为⾮受(unchecked)查异常,所有其他的异常称为受查(checked)异常。

2. 声明受查异常

下⾯四种情况应该抛出异常:

1. 调⽤⼀个抛出受查异常的⽅法,例如,FileInputStream构造器。

2. 程序运⾏过程中发现错误,并且利⽤throw语句抛出⼀个受查异常。

3. 程序出现错误。

4. java虚拟机的运⾏时库出现的内部错误。

如果出现前两种情况之⼀,则必须告诉调⽤这个⽅法的程序员有可能抛出异常。

ss

对于那些可能被别⼈使⽤的java⽅法,应该根域异常规范,在⽅法的⾸部声明这个⽅法可能抛出的异常。

如果有可能抛出多个异常,应该逗号分开

例如:

throws FileNotFoundException,EOFException

但是不需要声明Error错误,任何程序都有抛出那些异常的潜能,⽽我们对其没有任何控制能⼒。

同样也不该声明从RuntimeException继承的那些⾮受查异常。

警告: 如果在⼦类中覆盖了超类的⼀个⽅法, ⼦类⽅法中声明的受查异常不能⽐超类⽅法中声明的异常更通⽤ (也就是说, ⼦类⽅法中可以抛出更特

定的异常, 或者根本不抛出任何异常)。特别需要说明的是, 如果超类⽅法没有抛出任何受查异常, ⼦类也不能抛出任何受查异常。例如, 如果覆盖

omponent ⽅法, 由于超类中这个⽅法没有抛出任何异常,所以, ⾃定义的 paintComponent 也不能抛出任何受查异常。Java

核⼼技术第⼗版_269页)

如果类中的⼀个⽅法声明将会抛出⼀个异常, ⽽这个异常是某个特定类的实例时,则这个⽅法就有可能抛出⼀个这个类的异常, 或者这个类的任意⼀个

⼦类的异常。 例如,FilelnputStream 构造器声明将有可能抛出⼀个 IOExcetion 异常, 然⽽并不知道具体是哪种 IOException 异常。它既可能是

IOException 异常,也可能是其⼦类的异常, 例如,FileNotFoundException

3. 如何抛出异常

throw new EOFException();

EOFException e = new EOFException();

throw e;

下⾯是将代码放到⼀起:

String aaa(Scanner in) throws EOFException{

...

while(...){

if(...){

if(...)

throw new EOFException();

}

...

}

return s;

}

EOFException类还有含有⼀个字符串型参数的构造器,可以更加细致的描述异常出现情况

throw new EOFException(String data);

在这种情况下⼀旦⽅法抛出异常,这个⽅法就不可能返回调⽤者,也就是说,不必为返回的默认值或错误代码担忧:

1. 找到更合适的异常类

2. 创建这个类的⼀个对象

3. 将对象抛出

4. 创建异常类

package Method;

import ption;

class Method extends IOException { //创建异常类

Method(){}

Method(String data){

super(data);

}

}

package Method;

public class MethodTest {

public static void main(String[] args) throws Method {

test(1);

}

private static void test(int a) throws Method {

if(a>3){

throw new Method();

}else{

throw new Method("异常");

}

}

}

运⾏结果:

Exception in thread "main" : 异常

at (:11)

at (:5)

Throwable() 构造⼀个新的 Throwabie 对象, 这个对象没有详细的描述信息。

Throwable(String message ) 构造⼀个新的 throwabie 对象, 这个对象带有特定的详细描述信息。习惯上,所有派⽣的异常类都⽀持⼀个默认的构造器和⼀个带有详细描述信息的构造器。

String getMessage() 获得 Throwabie 对象的详细描述信息。

B. 捕获异常

捕获异常必须设置语句块。最简单的try语句块如下:

try/catch

try{

code

more code

more code

}

catch(ExceptionType e){

handler for this type

}

如果在try语句块中的任何代码抛出了⼀个在catch⼦句中说明的异常类,那么程序