实验五异常处理.docx
《实验五异常处理.docx》由会员分享,可在线阅读,更多相关《实验五异常处理.docx(8页珍藏版)》请在冰豆网上搜索。
实验五异常处理
实验五异常处理
一、实验目的
1.学会利用Try-catch-finally语句来捕获和处理异常;
2.掌握自定义异常类的方法。
二、实验要求
1.通过编程理解系统异常处理的机制和创建自定义异常的方法。
2.掌握基础类。
三、实验内容
(一)异常处理机制
1.编写使用try…catch语句处理异常的程序文件Demo4_1.java,
源代码如下:
publicclassDemo3_1{
publicstaticvoidmain(String[]arg3){
System.out.println("这是一个异常处理的例子\n");
try{
inti=10;
i/=0;
}
catch(ArithmeticExceptione){
System.out.println("异常是:
"+e.getMessage());
}
finally{
System.out.println("finally语句被执行");
}
}
}
编译并运行程序。
注意:
如果在catch语句中声明的异常类是Exception,catch语句也能正确地捕获,这是因为Exception是ArithmeticException的父类。
如果不能确定会发生哪种情况的异常,那么最好指定catch的参数为Exception,即说明异常的类型为Exception。
2、源文件是Demo3_2.java。
要捕捉的异常是除数为零和数组下标越界。
通过修改a和c[]下标值体验程序。
publicclassDemo3_2{
publicstaticvoidmain(String[]args){
inta,b;
intc[]={1,2,3};
try{a=10;
b=100/a;
System.out.println("当前a值:
"+a);
c[2]=200;
System.out.println("当前数组长:
"+c.length);
}
catch(ArithmeticExceptione){
System.out.println("除零错误:
"+e);}
catch(ArrayIndexOutOfBoundsExceptione){
System.out.println("数组下标越界:
"+e);}
finally{
System.out.println("我是finally");}
System.out.println("我能被正常执行到");
}
}
【思考】
①先运行上面程序,观察运行结果。
②按下条件分别修改数据,编译后运行,观察输出结果,分析在try…catch块里那些语句没有被执行,为什么?
块外那些语句可被执行到,为什么?
修改a=0,保持c[2]=200;
保持a=10,修改c[3]=200,
修改a=0,修改c[3]=200;
再添加一个catch{Exceptione}{},位置在最前面,观察编译信息,说明什么?
3、编写Demo3_3.java程序,计算两数相除并输出结果。
使用两个catch子句,分别捕捉除数为0的异常和参数输入有误异常。
源代码如下:
importjava.io.*;
classDemo3_3{
publicstaticvoidmain(Stringargs[]){
try{
BufferedReaderstrin=newBufferedReader(newInputStreamReader(System.in));
System.out.print("请输入除数:
");
Stringcl=strin.readLine();
inta=Integer.parseInt(cl);
System.out.print("请输入被除数:
");
cl=strin.readLine();
intb=Integer.parseInt(cl);
intc=b/a;
System.out.println("商为:
"+c);
}
catch(NumberFormatExceptione){
System.out.println("请输入整数!
");//e.printStackTrace();
}
//捕获除数为0的异常
catch(ArithmeticExceptione){
System.out.println("除数不可以0!
");
//e.printstackTrace();
}
//捕获与I/O有关的异常
catch(IOExceptione){e.printStackTrace();}
//捕获数值转化时的异常,如不能将字符转化成数值
}
}
编译并运行,当输入除数为0时,将有异常出现,当输入的不是整数时,如将30输成了3o,出现的是另一种异常。
(二)自定义异常类
4、注意throw、throws的使用。
源文件是Demo3_4.java。
packagesy3;
classMyExceptionextendsException{
publicStringtoString(){
return"除数等于零";
}
}
classDIV{
doublediv(doublex,doubley)throwsMyException{
if(y==0)thrownewMyException();
elsereturn(x/y);
}
}
publicclassDemo3_4{
publicstaticvoidmain(String[]args){
doublez;
DIVd=newDIV();
try{
z=d.div(100,0);
System.out.println("当前z值:
"+z);
}catch(MyExceptione){
System.out.println(e.toString());
}
}
}
【思考】
1修改try...catch中语句z=div.DIV(100,0)入口参数,观察运行结果。
z=d.div(100,10);
z=d.div(100,0);
2将try...catch语句注释掉,观察编译信息。
3上面条件保持,在main函数后面加上throwsMyException再重新编译,能否通过?
然后运行观察结果,得到什么结论?
2.编写程序Demo3_5.java,包含自定义异常,当输入数值为13和4时抛出该异常。
源代码如下:
classEx3_5extendsException{
Ex3_5(Stringmsg){
super(msg);
}
}
classDemo3_5{
privateintx;
voidsetX(intx){
this.x=x;
}
voidf1()throwsEx3_5{
if(x==13)
thrownewEx3_5("Idon’tlike13!
");
elseif(x==4)
thrownewEx3_5("Idon’tlike4!
");
else
System.out.println(100/x);
}
publicstaticvoidmain(Stringargs[]){
Demo3_5a=newDemo3_5();
try{
a.setX(5);
//a.setX(13);
//a.setX(4);
//a.setX(0);
a.f1();
}
catch(Ex3_5e){
System.out.println("getmessage:
"+e.getMessage());
}
}
}
【思考】编译并运行,分别取消注释上面程序中被注释的语句。
当释放a.setX(13)语句后,查看运行结果,当释放a.setX(4)语句后,查看运行结果,当释放a.setX(0)语句后,查看运行结果。
四、实验练习题
1、编写Java程序,创建数组后,对数组访问时发生的数组越界.实验使用try-catch语句处理该异常。
运行结果如图所示。
importjava.io.*;
publicclassDemo3_6{
publicstaticvoidmain(String[]arg3){
try{
BufferedReaderstrin=newBufferedReader(newInputStreamReader(System.in));
System.out.println("请输入创建数组的个数:
\n");
Stringcl=strin.readLine();
inta=Integer.parseInt(cl);
System.out.println("数组创建完毕!
!
您要查找那个元素?
\n");
Stringc2=strin.readLine();
intb=Integer.parseInt(c2);
}
catch(ArrayIndexOutOfBoundsExceptione){
System.out.println("这里出现的错误类型是:
数组下标越界!
"+e);
}
finally{
System.out.println("主程序正常结束!
");
}
}
}