24>
6-5Exer6_5.java
classmyExceptionextendsException
{
staticinta=0
myException(Strings)
{
super(s);
a++;
}
Stringshow()
{
return"自定义异常出现的次数:
"+a;
}
}
PublicclassExer6_5
{
staticvoidTest()throwsmyException
{
myExceptione;
e=newmyException("自定义异常\n");
throwe;
}
Publicstaticvoidmain(Stringargs[])
{
for(inti=0;i<3;i++)
{
try
{
Test();
}
catch(myExceptione)
{
System.out.println(e.show());
System.out.println(e.toString);
}
}
}
}
运行该程序后,输出结果如图所示:
D:
\JAVA\XT>javaExer6_5
自定义异常出现的次数:
1
myException:
自定义异常
自定义异常出现的次数:
2
myException:
自定义异常
自定义异常出现的次数:
3
myException:
自定义异常
5.简单回答题
6-1检测异常事件必须使用什么语句?
答:
try语句
6-2catch()方法的作用是什么?
该方法用户能否调用?
答:
用来处理try块中检测出的异常事件。
6-3catch()方法中异常类型应与什么相符?
答:
与生成的异常事件类型相符。
6-4异常示被捕获到将会出现什么现象?
答:
try语句后边的惯常处理代码将不被执行,通常使用finally语句提供一个统一出口。
6-5在一个try语句的程序代码块中可以捕获多个异常吗?
答:
可以
6-6使用throw语句抛出的是类型还是对象?
答:
抛出的是对象。
6-7捕获到的异常还可以再抛出吗?
答:
可以。
6-8Finally语句块中的代码何时被执行?
答:
在异常事件处理的方法catch()执行后执行。
6-9语句throw的作用是什么?
答:
抛出所检测到的异常。
6-10异常类Exception的父类是什么?
答:
是Throwable类。
6.编程题
6-1编程实现下述异常,并输出显示适当的错误信息。
(1)数组下标越界异常ArrayIndexOutOfBoundsException类型。
例如,
charch[]=newchar[5];
ch[5]='m';//产生该类型异常
(2)对象转换异常ClassCastException类型。
例如,将对象a1转换为对象a2时,如果a1和a2不是同类,并且a1也不是a2的子类对象时,则产生该类型异常。
(3)引用空对象的变量和方法时产生NullPointerException异常类型。
例如,
intar[]=null;
System.out.println(ar.length);//产生该类异常
(1)关于数组下标越界异常ArrayIndexOutOfBoundsException请参照本书本章例6.1的程序,请读者自行编写。
(2)下面关于对象转换的例子。
程序内容如下:
publicclasspro6_1
{
publicstaticvoidmain(Stringargs[])
{
try{
M();
}
catch(ClassCastExceptione)
{
System.out.println("对象转换异常");
}
}
staticvoidM()throwsClassCastException
{
Objectobj=newObject();
intarr[]=(int[])(obj);
}
}
(3)编写处理异常程序如下:
publicclasspro6_2
{
publicstaticvoidmain(Stringargs[])
{
try{
intar[]=null;
System.out.println(ar.length);
}
catch(NullPointerExceptione)
{
System.out.println("Exception:
"+e);
}
}
}
运行该程序后,输出显示结果如下:
Exception:
java.Lang.NullPointerException.
6-2定义一个circle类,其中有求面积的方法,当圆的半径小于0时,抛出一个自定义的异常。
编程实现之:
程序内容如下;
classCircleextendsException
{
doubler;
Circle()
{}
Circle(doublei)
{r=i;}
publicdoublegetr()
{returnr;}
publicdoubleArea()
{
return3.1415*r*r;
}
}
publicclasspro6_3
{
publicstaticvoidmain(Stringargs[])
{
Circlec=newCircle(-3.0);
try
{
if(c.getr()<0)
{
Circleee=newCircle();
throwee;
}
System.out.println(c.Area());
}
catch(Circlee)
{
System.out.println("自定义异常:
"+e);
}
}
}
运行该程序后,输出显示如下结果:
自定义异常:
Circle
如果将语句
Circlec=newCircle(-3.0);
必为
Circlec=newCircle(3.0);
输出结果如何?
请读者上机试试。
6.5测试题
1.单选题
6-1下列关于异常和异常类的描述中,错误的是()。
A.异常是某种异常类的对象
B.异常类代表一种异常事件
C.异常对象中包含有发生异常事件的类型等重要信息
D.对待异常和处理就是简单地结束程序
6-2下列关于异常处理的描述中,错误的是()。
A.程序运行时出现的异常是通过系统默认的异常处理程序进行处理的
B.在程序中可以使用try-catch语句捕捉异常和处理异常事件
C.对于捕获的异常只能在当前方法中处理
D.使用throw语句可将异常抛出到调用当前方法的方法中处理
6-3下列关于用户创建自己的异常的描述中,错误的是()。
A.为了保证系统的稳定性,用户可以创建自己的异常和异常类
B.创建的异常类必须是Exception类的子类
C.在创建的异常类的类体中可以定义或重载其的属性和方法、
D.用户自定义的异常必须使用throw语句进行抛出
2.判断题
6-1异常不是致命错误。
6-2异常类Exception是Throwable类的子类,该类还派生出许多子类。
6-3catch()方法是用来捕捉和处理异常的,可使用多个该方法,其异常类型的先后顺序是无关的。
6-4用户在创建自己的异常时,通常在通过throw语句抛出异常。
6-5finally语句的程序段无论发生异常事件与否,它都是被执行的。
3.分析程序的输出结果
6-1程序内容如下:
publicclasstest6_1
{
publicstaticvoidmain(Stringargs[])
{
intarr[]={1,3,5,7,9};
inti=0;
while(i<6)
{
try
{
System.out.println(arr[i++]+1);
}
catch(ArrayIndexOutOfBoundsExceptione)
{
System.out.println("下标越界");
}
finally
{
System.out.println("ok");
}
}
}
}
6-2程序内容如下:
classmyExceptionextendsException
{
myExcepiton(Strings)
{
super(s);
}
}
publicclasstest6_2
{
publicstaticvoidmain(Stringargs[])
{
try
{
thrownewmyException("我自定义的异常");
}
catch(myExceptione)
{
e.printStackTrace();
}
}
}
4.编程题
读者自己定义一种异常类,并编程捕捉某种异常,输出异常信息。
5.简答题
已知:
下列try-catch-finally语句块中<语句2>将会引起一个异常,试回答下述问题。
try{
<语句1>
<语句2>
<语句3>
}
catch(<异常类名>e1){…}
catch(<异常类名>e2){…}
finally
{…}
<语句4>
(1)<语句3>会执行吗?
(2)如果异常被捕捉了,finally语句被执行吗?
(3)如果异常没被捕捉,finally语句被执行吗?
(4)无论异常是否被捕捉,<语句4>都被执行吗?