第九章 异常
在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(\ num2.setText(\
info.setText(\测试题目数:\道\
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(\ num2.setText(\ 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 else op.setText(\进行减法运算 else if(n1>50) if(n2>10) op.setText(\进行减法运算 else op.setText(\进行除法运算 else if(n2>50) if(n1>10) op.setText(\进行加法运算 else op.setText(\进行乘法运算 else if(n1>n2&&n2<10) op.setText(\进行除法运算 else if(n1<10||n2<10) op.setText(\或n2<=10 进行乘法运算 else op.setText(\其他进行加法运算 } /**********成员方法:运算及答案处理***********/ public void compute() { float x=0; //定义变量 try //本题正确结果的计算与实际答题结果的比较 { if(op.getText().equals(\ else if(op.getText().equals(\ else if(op.getText().equals(\ else if(op.getText().equals(\ 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,\总题目数\答对\道,花费时间\秒!!!\ System.exit(0); } n1=rand.nextInt(100)+1; //产生下一题 n2=rand.nextInt(100)+1; num1.setText(\ num2.setText(\ 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 9-1a 选择测试题目数对话框 9-1b 答题屏幕界面 的答题界面,可以输入题目答案,然后按“Enter”或单击“下一题”按钮进入下一题,若在答题时没输入答案或输入非数字字符,则会出现如图9-1c的消息对话框,此时,可单击“确定”按钮,返回到应答栏,重新输入应答数据。最后在完成答题后,会出现如图9-1d的结果对话框。 9-1c 异常信息对话框 9-1d 结果信息对话框 自由练习9.1 修改上一章自由练习8.1建立的输入学生信息程序,捕捉并处理当输入入学成绩时的数据错误。 实验示例9.1.2 编写程序,实现如图9-2的用户界面,完成一个简单的计算器应用程序。要求:可以进行+、=、*、/四种运算;为了操作方便,输入运算数后按“Enter”键连续进行下一数运算,并保留用鼠标单击“下一个”按钮连续 图9-2 实验示例9.1.2屏幕界面 进行下一数运算;并要求输入的运算数在0~1000之间。按“清零”按钮,结束当前的运算过程,开始一个新的运算。 实现该示例的步骤如下: ⑴ 简要分析 和实验示例9.1.1类似,使用awt和swing的组件(JLabel、JTextField、JPanel、JBurron等)构建用户界面。实现ActionListener接口完成按钮的功能;建立一个继承KeyAdapter适配器类的内部类KeyPressListener,在类中重写 keyPressed()方法完成按键功能的实现,同样只需关注“Enter”键。为保证输入的运算数在0~1000之间,可以使用自定义异常实现,对输入0~1000之外的数据将视为数据超界。 ⑵ 根据上述简要分析,给出如下参考程序代码。 首先给出自定义异常类: class DefException extends Exception { DefException() //构造方法 { super(\数据超界错误!!!\ } public String toString() //返回信息方法 { return \数据超界错误!要求数字范围0~1000之间!!!\ } } 计算器应用程序代码如下: /*这是一个简单的计算器应用程序 *程序的名称:Calculator.java */ import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Calculator extends JFrame implements ActionListener { float f1=0; float f2=0; JLabel num1=new JLabel(\ Choice op=new Choice(); JTextField num2=new JTextField(10); JLabel result=new JLabel(); JButton ok = new JButton(\下一个\ JButton next = new JButton(\清零\ JButton exit = new JButton(\退出\ JPanel jp1=new JPanel(); JPanel jp2=new JPanel(); public Calculator() { this.setTitle(\简单计算器应用\ this.setLayout(new GridLayout(3,1)); this.add(new JLabel(\请选择运算并输入运算数:\ op.add(\