第九章异常
在Java应用程序中,异常处理是保证程序正常、可靠运行的一个重要方面,在前边已经遇到了简单的异常处理。本章实验将主要针对程序中常用的异常的处理及异常的应用。
实验一:异常处理及应用
实验目的
(1). 了解异常的基本概念、异常的的产生和异常处理的过程。
(2). 基本掌握异常在应用程序中的应用。
实验要求
编写应用程序,在程序中对常见的异常进行捕捉并作相应的处理。
实验内容
实验示例9.1.1 在上一章的实验示例测试中,若没有输入答案或输入非数字字符,则在处理过程中会出现数据格式异常,修改实验示例创建的Exercises类,添加捕获并处理异常的程序代码。
—
实现该示例的步骤如下:
⑴简要分析
根据题意,首先需要确定会产生异常的程序段,然后使用try~catch结构进行捕捉和处理异常地处理。由于主要处理数据格式异常,它由输入时的错误引起,所以,在处理异常时,就是返回到输入处,重新输入数据。
⑵根据上述简要分析,给出如下修改后的参考程序代码:
/*这是一个小学生综合训练题测试的应用程序
*程序的名称:
*程序中捕捉处理数据格式异常(NumberFormatException)
*/
import .*;
import .*;
。
import .*;
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)
图9-2 实验示例9.1.2
屏幕界面
{ 、 =total; (""+(100)); (""+(100)); ("测试题目数:"+total+"道"); (false); quals("+")) x=n1+n2; else if().equals("-")) x=n1-n2; else if().equals("*")) x=n1*n2; else if().equals("/")) x=n1/n2; if(x==())) right++; } … catch(NumberFormatException e) { (null,"数据格式错误,请重新输入数据!!!"); (); return; } catch(Exception e1) { (null,()); return; } count++;
~ if(count==total) ;
public class TestExercises extends JFrame
{
TestExercises()
{
add(new Exercises(30)); -1a-1c 9.1.29.1.1;
import .*;
import .*;
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();
9-1a 选择测试题目数对话框 9-1b 答题屏幕界面
9-1c 异常信息对话框 9-1d 结果信息对话框
JPanel jp2=new JPanel();
public Calculator()
{
("简单计算器应用");
|
(new GridLayout(3,1));
(new JLabel("请选择运算并输入运算数:"));
("+");
("-");
("*");
("/");
(num1);
(op);
(num2);
(result);
!
(ok);
(next);
(exit);
(jp1);
(jp2);
(this); //委托监听对象
(new KeyPressListener()); //………
(new KeyPressListener());//………
(new KeyPressListener());//………
(this); //委托监听对象
%
(this);
();
(true);
;
();
}
/**********判断数据是否合法***********/
public boolean isNumber() throws DefException
{
try
·
{
f2=()); //获取运算数
}
catch(NumberFormatException e)
{
(null,"数据格式错误,请重新输入数据!!!");
();
return false;
}
catch(Exception e1)
—
{
(null,());
return false;
}
if(f2<=0||f2>1000) throw new DefException();
return true;
}
/**********成员方法:运算处理***********/
public void compute()
{
¥
try
{ if(!isNumber()) { (); return; } }
catch(DefException e2) //处理自定义异常
{
(null,());
();
return;
}
switch ())
{
^
case 0: f1=f1+f2; break;
case 1: f1=f1-f2; break;
case 2: f1=f1*f2; break;
case 3: f1=f1/f2; break;
}
(""+f1);
(" = "+f1);
("");
();
}
'
/********ActionListener接口方法************/
public void actionPerformed(ActionEvent e)
{
if()==ok) compute(); //执行成员方法,继续下一数运算
else if()==next) //清零,开始新的运算
{ f1=0;
("");
("");
("");
(0);
】
();
}
else if()==exit) (); //结束程序
}
/*添加内部类KeyPressListener*/
class KeyPressListener extends KeyAdapter
{
public void keyPressed(KeyEvent e) //键盘按下事件
{
if()!= return; //如果不是按了Enter键,则不处理
@
if()==op) (); //选择运算后,准备输入运算数
else compute(); //执行成员方法,继续下一数运算
}
} //内部类结束
}
⑶分别编译、程序,生成、类文件,以供其他应用程序所用。
⑷程序及分析
本程序是一个简单计算器程序,除了界面组件外,在类中还定义了几个成员变量:f1和f2(float) 两个运算数,其中f1记录运算的结果,并作为运算数参与运算,f2是输入的运算数。
两个方法:
isNumber() 该方法用于确定输入的运算数是否合格,合格才能参与运算。在方法中捕捉并处理数据格式异常。当数据在0~1000之外时,创建并抛出自定义异常DefException 对象
compute() 方法用于计算处理。在方法中捕捉并处理了自定义的数据超界异常,在确保输入的数据合格后,方能进行运算数的运算。
程序实现了两个接口ActionListener和KeyListener,其中KeyListener接口以内部类的方式实现。当输入运算后,单击按钮“下一个”和按“Enter”键,其目的是一样的,都表明已输入运算数,可以进行运算,将这一功能处理放在compute()方法中完成。
⑸编写测试程序,测试Calculator类的功能。测试程序代码如下:
public class Test Calculator
{
public static void main(String [] args)
{
new Calculator();
}
}
编译执行程序,测试程序的功能。
自由练习仿照上述实验示例,修改自由练习,创建自定义异常类,当输入的入学成绩超出599~700时,视为超界数据,添加捕捉自定义异常的功能。