实验4 异常处理
1 实验目的
(1)掌握异常处理的编程特点。
(2)了解Java异常分类层次,常见系统异常。 (3)了解自定义异常的定义及方法异常的抛出与处理。
2 知识要点
Java把异常加入Java语言的体系结构,为异常定义了类和关键字,简化了错误处理代码。将错误处理从正常的控制流中分离出来,对错误实施统一处理。
2.1异常处理结构
try { 语句块;
} catch (异常类名1 参变量名) { 语句块; }
catch (异常类名2 参变量名) { 语句块; } finally { 语句块; } 说明:
(1)finally总是执行,它是异常处理的统一出口,常用来实现资源释放,文件关闭等。
(2)发生异常时try块内的后续语句不再执行;
(3)catch按照次序进行匹配检查处理,找到一个匹配者,不再找其它;catch的排列要按照先个别化再一般化的次序。不能将父类异常排在前、子类异常排在后。
2.2 常见系统异常
常见系统异常如表12-1所示。
表12-1 常见系统异常
异常 ClassNotFoundException ArrayIndexOutOfBoundsException FileNotFoundException IOException NullPointerException ArithmeticException NumberFormatException InterruptedException 异常的解释 未找到要装载的类 数组访问越界 文件找不到 输入、输出错误 空指针访问 算术运算错误,如除数为0 数字格式错误 中断异常。 2.3 自定义异常
(1)定义异常类—继承Exception类 (2)在方法内抛出异常 throw new 异常类(); (3)声明方法存在异常
在方法头的尾部加上:throws 异常类列表
3 样例程序
样例1:从键盘输入一个十六进制数,将其转化为十进制输出。如果输入的不是一个有效的十六进制数数字则抛出异常。
提示:可以先编写一个方法将一个十六进制的数字转化为十进制对应的数值,方法在数字非法时产生异常。
【参考程序】
class MyException extends Exception { public String toString() { return \非十六进制字符\ } }
public class Hex2Dec {
public static void main(String[] args) { String hex; long dec; hex = args[0]; dec = 0;
for ( int i = 0; i < hex.length(); i++ ) { try {
int digit = hexValue( hex.charAt(i) ); //转化为10进制数字
dec = 16*dec + digit; } catch ( myException e) {
System.out.println(\不是一个十六进制数\ return; } }
System.out.println (\十进制为: \ }
/* 将一个16进制字符转换为10进制字符,
如果字符不是16进制范围内字符则抛出异常MyException */
static int hexValue(char ch) throws MyException{ switch (ch) {
case '0': return 0; case '1': return 1; case '2': return 2; case '3': return 3; case '4': return 4; case '5': return 5; case '6': return 6; case '7': return 7; case '8': return 8; case '9': return 9; case 'a':
case 'A': return 10; case 'b':
case 'B': return 11; case 'c':
case 'C': return 12; case 'd':
case 'D': return 13;
case 'e':
case 'E': return 14; case 'f': case 'F': return 15; default:
throw new MyException(); } } } 【编程技巧】
(1) 定义一个异常类,用来描述“非十六进制数”这一特殊异常。
(2) 定义一个方法将十六进制数字转换为十进制数字,方法内利用了switch语句来处理各种情形,其他情形,则抛出异常。利用if语句可缩短程序长度,如何修改程序。
(3) 在main方法中对一个十六进制的符号串逐位字符进行处理,拼接转化为十进制,要检测可能出现的异常。
样例2:编写一个程序计算两复数之和,输入表达式为:(2,3i)+(4,5i)则结果为(6+8i),如果输入错误则通过异常处理提示错误。
【参考程序】
class Complex {
double x,y;
public Complex(double x,double y) { this.x=x;this.y=y; }
public static Complex add(Complex a,Complex b) { return new Complex(a.x+b.x,a.y+b.y); } }
public class Complexadd {
public static void main(String args[]) { String s=args[0]; //整个输入式 double x,y; int p1,p2,len; try
{
p1=s.indexOf(\查找\号位置 if (p1!=-1) {
String one=s.substring(0,p1); //第一个复数部分 String two=s.substring(p1+1); //第二个复数部分
/* 以下分离出第一个复数部分的数据 */
p2=one.indexOf(\ len=one.length();
x=Double.parseDouble(one.substring(1,p2)); //取x部分 y=Double.parseDouble(one.substring(p2+1,len-2)); //取y部分 Complex c1=new Complex(x,y); //创建复数1 /* 以下分离出第二个复数部分的数据 */ p2=two.indexOf(\ len=two.length();
x=Double.parseDouble(two.substring(1,p2)); y=Double.parseDouble(two.substring(p2+1,len-2)); Complex c2=new Complex(x,y); //创建复数2
Complex c3=Complex.add(c1,c2); //计算结果 System.out.println(\结果为(\ } }
catch(NumberFormatException e) {
System.out.println(\数据格式错!\ }
} }
运行调试结果:
D:\\abc>java Complexadd (3,4i)+(5,8i) 结果为(8.0,0)
D:\\abc>java Complexadd (3,4i)+(5,8ai) 数据格式错! 【编程技巧】