第九章异常在Java应用程序中,异常处理是保证程序正常、可靠运行的一个重要方面,在前边已经遇到了简单的异常处理。
本章实验将主要针对程序中常用的异常的处理及异常的应用。
9.1 实验一:异常处理及应用实验目的(1). 了解异常的基本概念、异常的的产生和异常处理的过程。
(2). 基本掌握异常在应用程序中的应用。
实验要求编写应用程序,在程序中对常见的异常进行捕捉并作相应的处理。
实验内容实验示例9.1.1 在上一章8.2.1的实验示例测试中,若没有输入答案或输入非数字字符,则在处理过程中会出现数据格式异常,修改实验示例8.2.1创建的Exercises类,添加捕获并处理异常的程序代码。
实现该示例的步骤如下:⑴简要分析根据题意,首先需要确定会产生异常的程序段,然后使用try~catch结构进行捕捉和处理异常地处理。
由于主要处理数据格式异常,它由输入时的错误引起,所以,在处理异常时,就是返回到输入处,重新输入数据。
⑵根据上述简要分析,给出如下修改后的参考程序代码(Exercise.java):/*这是一个小学生综合训练题测试的应用程序*程序的名称:Exercise.java*程序中捕捉处理数据格式异常(NumberFormatException)*/import java.awt.*;import java.awt.event.*;import java.util.*;import javax.swing.*;public class Exercises extends StudentScreen implements ActionListener,KeyListener { int count = 0;int n1=0,n2=0;int total=0;int right=0;long timenum=0;Random rand=new Random();public Exercises(int total){this.total=total;num1.setText(""+rand.nextInt(100));num2.setText(""+rand.nextInt(100));info.setText("测试题目数:"+total+"道");answer.setEnabled(false); //在没开始答题之前,不得答题start.addActionListener(this);next.addActionListener(this);next.addKeyListener(this);answer.addKeyListener(this);}/***ActionListener接口方法实现***/public void actionPerformed(ActionEvent e){if(e.getSource()==start){start.setEnabled(false); //使开始按钮失效answer.setEnabled(true); //开始答题answer.requestFocus();count=right=0;n1=rand.nextInt(100);n2=rand.nextInt(100);num1.setText(""+n1);num2.setText(""+n2);timenum=System.currentTimeMillis();}else if(e.getSource()==next) compute(); //调用compute()成员方法}/***KeyListener接口方法实现***/public void keyPressed(KeyEvent e) //当按一个键时调用它{if(e.getKeyCode()!=e.VK_ENTER) return; //如果不是按了Enter键,则不处理 compute(); //调用compute()成员方法}public void keyReleased(KeyEvent ke) //当一个键被释放时调用它{/*当需要时,输入相关处理代码*/}public void keyTyped(KeyEvent ke) //当输入一个字符键时调用它{/*当需要时,输入相关处理代码*/}/**********成员方法设置运算符***********/public void setOperator() //设置运算符方法{if(n1>50&&n2>50) if(n1<n2)op.setText("+");//n1,n2>50,n1<n2进行加法运算 else op.setText("-") ; // n1>n2进行减法运算else if(n1>50) if(n2>10) op.setText("-"); //n1>50,n2>10进行减法运算 else op.setText("/"); // n1>50,n2<10进行除法运算else if(n2>50) if(n1>10) op.setText("+"); //n2>50,n1>10进行加法运算 else op.setText("*"); //n2>50,n1<=10进行乘法运算else if(n1>n2&&n2<10) op.setText("/"); // n1>n2,n2<10进行除法运算else if(n1<10||n2<10) op.setText("*"); //n1<=10或n2<=10 进行乘法运算else op.setText("+"); //其他进行加法运算}/**********成员方法:运算及答案处理***********/public void compute(){float x=0; //定义变量try //本题正确结果的计算与实际答题结果的比较{if(op.getText().equals("+")) x=n1+n2;else if(op.getText().equals("-")) x=n1-n2;else if(op.getText().equals("*")) x=n1*n2;else if(op.getText().equals("/")) x=n1/n2;if(x==Float.parseFloat(answer.getText())) right++;}catch(NumberFormatException e){ JOptionPane.showMessageDialog(null,"数据格式错误,请重新输入数据!!!");answer.requestFocus();return;}catch(Exception e1){ JOptionPane.showMessageDialog(null,e1.toString());return;}count++;if(count==total) //测试结束{JOptionPane.showMessageDialog(null,"总题目数"+total+";答对"+right+"道,花费时间"+(System.currentTimeMillis()-timenum)/1000+"秒!!!");System.exit(0);}n1=rand.nextInt(100)+1; //产生下一题n2=rand.nextInt(100)+1;num1.setText(""+n1);num2.setText(""+n2);setOperator(); //设置运算符号answer.setText("");answer.requestFocus();}}⑶编译Exercise.java程序,生成Exercise.class类文件,以供其他应用程序所用。
⑷程序及分析在compute()方法中使用了try~catch结构捕捉并处理可能出现的数据格式异常(NumberFormatException)和其他异常(Exception),当在结果栏中没有输入内容或输入非数字字符按“Enter”键或单击“下一题”按钮时,获取结果栏中的字符串并将它转换为数值时会产生数据格式异常(NumberFormatException),处理的办法是使用对话框提示错误信息,并定位到结果栏让训练者重新输入题目答案。
⑸编写测试程序,测试Exercise类的功能。
测试程序代码如下:import javax.swing.*;public class TestExercises extends JFrame{TestExercises(){add(new Exercises(30)); //选30道题进行训练setVisible(true);pack();setDefaultCloseOperation(3);}public static void main(String [] args){new TestExercises();}}编译并运行测试程序,会出现如图9-1a的对话框,单击“开始”按钮,进入如图9-1b的答题界面,可以输入题目答案,然后按“Enter”或单击“下一题”按钮进入下一题,若在答题时没输入答案或输入非数字字符,则会出现如图9-1c的消息对话框,此时,可单击“确定”按钮,返回到应答栏,重新输入应答数据。
最后在完成答题后,会出现如图9-1d的结果对话框。
自由练习9.1 修改上一章自由练习8.1建立的输入学生信息程序,捕捉并处理当输入入学成绩时的数据错误。
实验示例9.1.2 编写程序,实现如图9-2的用户界面,完成一个简单的计算器应用程序。
要求:可以进行+、=、*、/四种运算;为了操作方便,输入运算数后按“Enter”键连续进行下一数运算,并保留用鼠标单击“下一个”按钮连续9-1a 选择测试题目数对话框9-1b 答题屏幕界面9-1c 异常信息对话框9-1d 结果信息对话框进行下一数运算;并要求输入的运算数在0~1000之间。