首页 实验6_异常

实验6_异常

举报
开通vip

实验6_异常实验6异常实验内容实验(1)除数为零异常实验目的:(1)掌握基本异常的处理机制;(2)熟悉try语句与catch语句的搭配使用;(3)了解有异常处理与没有异常处理的差别;(4)多重catch语句的使用;(5)使用Throws声明异常和Throw抛出异常。实验任务:在这个实验里会通过3个练习来开发一组相应的异常处理程序,以巩固对异常处理的理解。这几个程序都是围绕着一个典型的除数为0和数值格式异常问题而展开的,用户将从一个最简单的控制台输出的除数为0异常程序开始,然后建立一个GUI环境下的除数为0异常的多catch块处...

实验6_异常
实验6异常实验内容实验(1)除数为零异常实验目的:(1)掌握基本异常的处理机制;(2)熟悉try语句与catch语句的搭配使用;(3)了解有异常处理与没有异常处理的差别;(4)多重catch语句的使用;(5)使用Throws声明异常和Throw抛出异常。实验任务:在这个实验里会通过3个练习来开发一组相应的异常处理程序,以巩固对异常处理的理解。这几个程序都是围绕着一个典型的除数为0和数值格式异常问题而展开的,用户将从一个最简单的控制台输出的除数为0异常程序开始,然后建立一个GUI环境下的除数为0异常的多catch块处理,直到最后建立一个GUI环境下自己Throw抛出异常的处理程序。所有这些程序都将建立在同一个Project项目中,依次开发,各自独立运行。实验步骤:1.练习1普通控制台下的除数为O异常程序这个练习可以让用户比较有无异常处理时的情况。(1)首先建立一个空项目命名为Exception,然后为该项目选择合适的路径Directory存放它,比如:C:\Programming\JavaProject,用户将在这个项目中开发本实验的所有程序。(2)现在在该项目中创建第1个程序命名为DivideByZero.java,这个程序中包含了一个Public类DivideByZero.java,不使用Package,请按照程序清单6-1输入该程序。程序清单6-1DivideByZero.java//DivideByZero.javapublicclassDivideByZero{privateintdenominator,numerator,quotient;publicDivideByZero(){denominator=3;numerator=12;quotient=quotient(numerator,denominator);System.out.print("Quotientis"+quotient);}publicintquotient(intnumerator,intdenominator){returnnumerator/denominator;}publicstaticvoidmain(Stringargs[]){DivideByZeroapplication=newDivideByZero();}}(3)编辑好源程序并保存,编译并运行,看到的结果是多少?接下来修改源程序中的denominator值,以评估12/7,12/0时的情况。当12/0时,观察到了什么?是否有异常发生,输出结果是什么?(4)现在请在 工程 路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理 中创建第2个程序命名为DivideByZeroTryCatch.java,该程序在上面的程序中加入以下的一组try/catch语句块,以处理除数为0时才发生的异常。try{quotient=quotient(numerator,denominator);System.out.print("Quotientis"+quotient);}catch(ArithmeticExceptionex){System.out.print("Ifoundexception"+ex.toString);}(5)编译并运行这个程序,观察运行结果。|点评|由于加入了try/catch语句,因此由函数quotient(numerator,denominator)所产生的异常被捕获并进行了处理,记住try/catch语句必须搭配使用,如仅仅有try语句而无catch语句会导致编译错误。2.练习2GUl图形环境下的多catch块异常处理上面的程序是普通控制台环境下发生除数为0异常的情况,现在我们要看看GUI图形环境下的除数为0时的异常情况。(1)现在在工程中创建第3个程序命名为DivideByZeroGUI.java,这个程序运行时会弹出图形化窗口,要求用户输入数值进行除法运算。请按程序清单6-2输入该程序。程序清单6-2DivideByZeroGUI.java//DivideByZeroGUI.javaimportjava.awt.*;//Container,GridLayoutimportjava.awt.event.*;//ActionListenerimportjavax.swing.*;//JFramepublicclassDivideByZeroGUIextendsJFrameimplementsActionListener{privateJTextFieldnumeratorField,denominatorField,outputField;privateintdenominator,numerator,quotient;publicDivideByZeroGUI(){super("除数为0异常");Containercontainer=getContentPane();container.setLayout(newGridLayout(3,2));container.add(newJLabel("输入被除数",SwingConstants.RIGHT));numeratorField=newJTextField(10);container.add(numeratorField);container.add(newJLabel("输入除数并回车",SwingConstants.RIGHT));denominatorField=newJTextField(10);container.add(denominatorField);denominatorField.addActionListener(this);container.add(newJLabel("结果",SwingConstants.RIGHT));outputField=newJTextField();container.add(outputField);setSize(425,100);setVisible(true);}publicvoidactionPerformed(ActionEventevent){outputField.setText("");numerator=Integer.parseInt(numeratorField.getText());denominator=Integer.parseInt(denominatorField.getText());quotient=quotient(numerator,denominator);outputField.setText(Integer.toString(quotient));}publicintquotient(intnumerator,intdenominator){returnnumerator/denominator;}publicstaticvoidmain(Stringargs[]){DivideByZeroGUIapplication=newDivideByZeroGUI();application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}(2)编译并运行这个程序,观察运行结果。思考(1)评估12/3,12/7的结果,有异常吗?(2)评估12/0,12/2.2,12/a的结果,看到了什么?是异常吗?若是异常请解释原因,并分别指出导致异常发生的语句。|点评|这个程序会因为除数为0和数值格式而导致异常,不过与前面的练习l程序不同的是,尽管产生了异常,这个基于GUI的程序仍然可以继续运行而不会退出,这使用户可以继续进行其他的除法运算。接下来创建程序DivideByZeroGUIMultiTryCatch.java以处理上面程序中所产生的异常,该程序应包含两个catch语句块,一个用于处理除数为0的异常,另一个用于处理数值格式输入的异常。由于在程序中使用了Integer.parseInt() 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 以获得用户输入的数值,因此当用户输入非整数时就会产生NumberFormatException异常,这个异常同样应该处理。catch(NumberFormatExceptionex){System.out.print("Idetectedexception"+ex.toString);}编译并运行这个DivideByZeroGUIMultiTryCatch.java程序,确保已经处理了上述的两个异常。评估12/0,12/1.5,12/e,并写下所观察到的程序运行结果。3.练习3Throws声明异常与Throw抛出异常在这个练习中我们要自己使用Throws和Throw来声明和抛出除数为0异常,而不是让系统去探测并抛出异常。首先在工程中创建一个程序文件命名为DivideByZeroThrow.java,这个程序与前面DivideByZeroGUIMultiTryCatch.java程序基本一致,不过要把方法quotient(intnumerator,intdenominator)的返回类型改为double,并修改返回语句return(double)numerator/denominator;修改后,编译运行程序,评估12/6,12/7,12/0,看到的结果是什么?有异常发生吗?若没有,请解释原因。当评估12/7时,因为己转化为double型运算,其输出结果的小数位数可能很多,因此可以想办法只输出4位小数,为此需要在合适的位置加入以下语句,其中DecimalFormat是一个控制小数输出格式的类。importjava.text.DecimalFormat;DecimalFormatprecision=newDecimalFormat(“0.0000”);outputField.setText(precision.format(quotient));修改之后当运行l2/7和12/0时,观察结果,其中∞代 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf Infinity。由于当前的程序除0时不会产生异常,因此现在用户必须自己设法Throw抛出一个异常,为此要试着修改quotient()方法如下:publicdoublequotient(intnumerator,intdenominator)throwsArithmeticException{if(denominator=0)thrownewArithmeticException;return(double)numerator/denominator;}编译运行修改好的程序,当再次运行12/0时,看到异常了吗?屏幕的输出是否准确地告诉用户这是一个什么异常,如果不能,请再稍微修改程序,以明确显示出这是一个除数为0异常。实验(2)创建自己的日期错误异常类实验目的:(1)学会创建自己的异常类;(2)掌握如何使用自己的异常类;(3)了解简单的对话框JOptionpane类的用法。实验任务:要求设计一个GUI图形窗口程序,该程序让用户输入一个星期中的任意一天的数字1到7,然后输出该数字所对应的是星期几。但是当用户输入的数字不在l到7范围内时,程序应该弹出一个对话框以显示发生了异常。实验步骤:(1)分析实验任务,尽管Java中有ArithmeticException,NumberFormatException等异常类,但并没有这里想要的异常类,因此用户必须设计自己的异常类BadDataException以处理上述情况。同时还要设计一个主类BadDataDays以运行这个程序,该主类应包含一个getDayName(intdayNumber)方法以根据输入值返回星期几,在这个方法中应该使用一个switch语句来判断,并在switch块的default语句处Throw抛出用户的BadDataException异常。(2)程序清单6-3是主类BadDataDays的程序 模板 个人简介word模板免费下载关于员工迟到处罚通告模板康奈尔office模板下载康奈尔 笔记本 模板 下载软件方案模板免费下载 ,请完成|代码1|~|代码6|的程序部分,并输入这个程序以运行它。程序清单2-3BadDataDays.java//BadDataDays.javaimportjava.awt.*;//Container,GridLayoutimportjava.awt.event.*;//ActionListenerimportjavax.swing.*;publicclassBadDataDaysextendsJFrameimplementsActionListener{privateJTextFielddayNumberField,dayNameField;privateintdayNumber;privateStringdayName;publicBadDataDays(){super("代码1");Containercontainer=getContentPane();container.setLayout(newGridLayout(2,2));container.add(newJLabel("输入数字",SwingConstants.RIGHT));代码2//创建一个JTextField控件dayNumberFieldcontainer.add(dayNumberField);dayNumberField.addActionListener(this);container.add(newJLabel("星期几",SwingConstants.RIGHT));dayNameField=newJTextField(10);代码3//将控件dayNameField加入到容器中代码4//设置窗口的大小为(425,100)setVisible(true);}publicvoidactionPerformed(ActionEventevent){dayNameField.setText("");try{dayNumber=Integer.parseInt(dayNumberField.getText());dayName=getDayName(dayNumber);代码5//在控件dayNameField中输出结果}catch(BadDataExceptionex){JOptionPane.showMessageDialog(BadDataDays.this,ex.toString(),"无效日期",JOptionPane.WARNING_MESSAGE);}catch(NumberFormatExceptionex){System.out.println("IdetectedException"+ex.toString());}}publicStringgetDayName(intdayNumber)throwsBadDataException{代码6//此处加入switch语句块以根据输入值dayNumber判断星期几,//并在default处Throw抛出BadDataException异常}publicstaticvoidmain(Stringargs[]){BadDataDaysapplication=newBadDataDays();application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}点评该程序的关键是用户设计了自己的异常类BadDataException,它继承自运行期异常类RuntimeException,通常自定义的异常类都是继承自Exception或RuntimeException,当异常发生时,通过Throw语句抛出这个异常的实例,然后就像捕获一般异常一样进行处理。记住,对自定义异常系统是不会自动抛出的,必须由程序员手动抛出。实验(3)异常处理的链式搜索实验目的:(l)理解异常处理的搜索机制;(2)学会使用finally语句;(3)知道如何重新抛出一个异常。实验任务:本实验是要创建一个程序,该程序包含多个方法methodA,methodB,methodC,这些方法形成三级调用,主方法main调用methodA,methodA调用methodB,methodB调用methodc,最后methodC会抛出一个异常,用户的任务是观察这个异常是如何被截获和处理的,在这个过程中用户会被要求对原始程序进行适当的修改,并观察修改后程序运行的结果,从而加深对异常处理机制的理解。实验步骤:(1)首先在前面实验的项目中加入一个新的程序命名为SearchForExceptionHandler.java,代码如程序清单6-4所示(当然也可以为此而创建一个新的工程)。程序清单6-4SearchForExceptionHandler.java//SearchForExceptionHandler.javaclassMyExceptionextendsThrowable{publicMyException(){System.out.println("ExceptionthrowninMyException");}}publicclassSearchForExceptionHandler{staticpublicvoidmain(String[]args){try{System.out.println("Methodmaincalled");methodA();}catch(MyExceptionex){System.out.println("ExceptioncaughtinMain");}}//endmainstaticvoidmethodA()throwsMyException{System.out.println("MethodAcalled");methodB();}staticvoidmethodB()throwsMyException{System.out.println("MethodBcalled");methodC();}staticvoidmethodC()throwsMyException{System.out.println("MethodCcalled");thrownewMyException();}}//endSearchForExceptionHandler编译并运行这个程序,观察得到的效果。|点评|在这个程序中,从主函数main()开始,依次按顺序嵌套调用methodA,methodBmethodC,而在methodC中由thrownewMyException()语句抛出一个MyException异常,于是该异常便开始沿着一条搜索链搜寻它的处理器,最终在main()函数中捕获了这个异常并进行相应的处理以输出ExceptioncaughtinMain。(2)现在请将methodA中对methodB的调用加上一组try/catch语句。修改后,观察程序运行结果。为什么程序输出最后一行从ExceptioncaughtinMain变成了ExceptioncaughtinMethodA呢?请分析其中的原因。现在请在main()方法和methodA()方法中分别加入如下两个finally语句,然后运行这个程序,这两个finally语句都会输出吗,还是仅仅输出其中的一个呢?|点评|在异常处理中,finally语句的作用就是不论异常是否发生,在try/catch块之后都要执行finally块中的语句,以完成一些必要的操作,如关闭打开着的文件。因此在本例中两个finally语句都会输出,尽管对main()方法来说并未发生异常。(3)如果现在要求程序中的main()方法仍能捕获该异常,并且有如下的输出形式,请问应该如何修改程序?|点评|纵观整个例子,事实上程序进行了层层的嵌套调用,即main()→methodA→methodB→methodC,这时一旦methodC中发生异常,程序便开始沿着先前的调用顺序依次在methodC→methodB→methodA→main()中搜索异常处理器catch块,一旦找到了对应的catch块,便停止向前搜索,并进行相应的处理,此时对于搜索链中尚未搜索到的部分来说,一切都很正常,就像没有异常发生一样,因为该异常已经被截获并处理了,所以说一个异常一旦被截获就不会自动向外抛出了,除非于动重新抛出。
本文档为【实验6_异常】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
老张师傅
20余年电工实际工作经验,目前在国企担任电工工程师
格式:doc
大小:84KB
软件:Word
页数:12
分类:管理学
上传时间:2023-03-19
浏览量:3