如何处理Java程序中的错误
2010-08-15高荣芳
高荣芳
(波鸿大学数学系,德国 波鸿 44801)
【理工园地】
如何处理Java程序中的错误
高荣芳
(波鸿大学数学系,德国 波鸿 44801)
编写Java程序时,不可避免的会出现这样或那样的错误。本文介绍处理和修改Java程序的方法和技巧,并着重对“try-程序段”和“catch-程序段”的应用作了详细的阐述。
Java;Java程序;try-程序段;catch-程序段
Java程序的编写,对于学计算机语言的专业人员而言并不是一件很难的事情,但是在编写程序的过程中,经常会出现这样或那样的错误,譬如:第一类情况,程序编写虽然正确,但计算机并不执行命令。第二类情况,程序在执行的过程中自行中断或不出结果。第三类情况,程序在执行过程中输出错误的结果等。所以,寻找一个程序的错误所在处和错误的原因所在以及如何处理、解决程序中的问题就显得比较重要,但这并不是件容易的事情,尤其在规模较大、篇幅较长的大型程序中。
下面主要介绍怎样寻找一个程序中的错误以及消掉错误的基本方法。
一、错误的基本类型
总体上来说,在一个Java程序的编写过程中,所在可能会出现的问题大致可分为两大类,即:Exception和Error。
Exception,是一种普通的错误,它是可以被程序检控的;Error是一异常的错误,它是不可以被程序检控的,也是不应该出现的。下面依据具体例题详细解释之。
例1
class Ex01{
public static void main(String[]args){
int tastenCode;
tastenCode=System.in.read();
System.out.println(tastenCode);
}
}
虽然这个程序看起来是完全正确的,但是计算机在编辑的过程中给出了错误的声明:
Ex01.java:4:unreported exception java.io.IOException;must be
caught or declared to be thrown
tastenCode=System.in.read();
导致这个程序错误的原因在于方法read的声明,也就是说,一个错误可能直接或间接的在方法read内出现。这是一种在输入操作或输出操作时出现的错误,例如:由于输入了错误的数据,或者是意想不到的问题发生,象例1,等等。不过这些问题都是可以被检控的。
例2:
class Ex02{
public static void main(String[]args){
String s1="24",s2="25",s3="x";
//(1)
int number1,number 2,number 3;
number1=Integer.parseInt(s1);
//(2)
number2=Integer.parseInt(s2);
number3=Integer.parseInt(s3);
}
}
仔细观察一下我们的程序:
在程序里的(1)处我们定义了三个符号串,他们的类型(Typ)是数字串(String),可是在它们中只有两个定义的是数字串。
再看程序里的(2)处,在符号串中S1,S2将被输出,可是成功的前提是:所有符号串都必须由数字组成,而不是象在S3中定义了一个变量。这也就是导致程序错误的原因。
例3:
//file:account.java
public class Account{
private int accountnumber;
private double balance;
public Account(){}
public Account(int accountnumber){
this.accountnumber=accountnumber;
}
public Account(int accountnumber,double balance)
throws AccountException{
if(blance<0)
throws new AccountException("Negative Blance:"+blance);
this.accountnumber=accountnumber;
this.balance=blance;
}
public int getAccountnumber(){
限幅机构主支撑架拟选取的材料为LW-2改性聚酯亚胺,该材料的抗拉强度为145 MPa,屈服强度为89 MPa。由图8可知,在该仿真负载下,主支撑架的最大位移量为0.47 μm,最大应力为2.44 MPa,即在300 N横向负载的作用下,限幅机构主支撑架具有较大的静力裕度,满足强度和刚度要求。
return accountnumber;
}
public void setAccountnumber(int nr){
accountnumber=nr;
}
public double getBlance(){
return blance;
}
public void setBlance(double amount)throws AccountException{
if(amount<0)
throw new AccountException("Negative Blance:"+amount);
blance=amount;
}
public void numberIn(double amount)throws AccountException{
if(amount<0)
throw new AccountException("Negative Amount:"+amount);
blance+=amount;
}
public void numberOut(double amount)throws AccountException{
if(amount<0)
throw new AccountException("Negative Amount:"+amount);
if(balance<amount)
throw new AccountException("A-mount>Blance")
blance-=amount;
}
}
//file:Test.java
public class Test{
public static void main(String[]args)throw AccountException{
Account acc=new Account(4711,500);
acc.numberOut(1000);
System.out.println(acc.getBlance());
}
}
这个程序在执行中自行中断,计算机给出了以下声明:
Exception in thread“main”AccountException
Amount>balance
导致计算机在编辑过程中错误声明的原因是:throws-clause的不完善。
二、错误的处理与修改
例1的修改方案较简单,这里略去。
修改以后的例2的新程序如下:
class Ex02’{
public static void main(String[]args){
String s1="24",s2="25",s3="x";
int number1,number2,number3;
number1=number2=number3=0;
try{
//(1)
number1=Integer.parseInt(s1);
number2=Integer.parseInt(s2);
number3=Integer.parseInt(s3);
}
catch(
java.lang.NumberFormatException e){ //(2)
System.out.println("Uups");
//(3)
}
System.out.println(number 1*number 2);
System.out.println(number 1+number 3);
}
}
输出结果为:
Uusp
600
24
详细解释如下:
(1)在新程序中,关键词try引导了一个程序段,它被限定在一对花括号之内。这个程序段确定了程序的范围。
(2)由于在(1)处我们定义了一个try-程序段,那么按照Java的规则,我们必须紧接着在这个try-程序段的后边最少定义一个catch-程序段,而且在catch-程序段内定义的程序指示命令是针对一定类型错误的。根据例2的具体情况,我们在修改此程序时只定义了一个catch-程序段,在这个catch-程序段中我们给出了一个参量e,它就是针对错误的对象而给出的。通过说明,不仅参量的类型被声明了,而且确定了这个程序段负责处理怎样的错误。
(3)每个有效的Java-code都可以存在在一个catch-程序段内,通过此种途径和方法,编程序的人可以尝试着将错误消除。
例3修改方案有好几种,这里我们仅介绍一种。
修改以后的例3新程序为:
//file:account.java
public class Account{
private int accountnumber;
private double balance;
public Account(){}
public Account(int accountnumber){
this.accountnumber=accountnumber;
}
public Account(int accountnumber,double balance)
throws AccountException{
if(blance<0)
throws new AccountException("Negative Blance:"+blance);
this.accountnumber=accountnumber;
this.balance=blance;
}
public int getAccountnumber(){
return accountnumber;
}
public void setAccountnumber(int nr){
accountnumber=nr;
}
public double getBlance(){
return blance;
}
public void setBlance(double amount)throws AccountException{
if(amount<0)
throw new AccountException("Negative Blance:"+amount);
blance=amount;
}
public void numberIn(double amount)throws AccountException{
if(amount<0)
throw new AccountException("Negative Amount:"+amount);
blance+=amount;
}
public void numberOut(double amount)throws AccountException{
if(amount<0)
throw new AccountException("Negative Amount:"+amount);
if(balance<amount)
throw new AccountException("A-mount>Blance")
blance-=amount;
}
}
//file:Test.java
public class Test{
public static void main(String[]args){
Account acc=zero;
try{
acc=new Account(4711,500);
//(1)
for(int i=0;i<3;i++){
System.out.println("BEGINN STEP"+i);
try{
//(2)
switch(i){
case 0:
acc.numberOut(100);
break;
case 1:
acc.numberOut(700);
break;
case 2:
acc.numberOut(200/0);
break;
}
}
catch(accountException e){
//(3)
System.out.println("Error:"+e.getMessage());
}
finally{
System.out.println("Issue in finally-block:"
+acc.getBalance());
}
System.out println("END STEP"+i);
System.out println();
}
}
catch(accountException e){
//(4)
System.out println(e.getMessage());
}
}
}
具体说明如下:
在例3程序(Test部分)的修改过程中,我们利用了try—程序段和catch—程序段,他们的作用这里不再赘述,不同前边例2的修改方法是,它们是互相套在一起的。
详细解释如下:
catch—程序段(4)是和try—程序段(1)配对的,catch—程序段(3)是和try—程序段(2)配对的,而try—程序段(2)和catch—程序段(3)这一对是镶嵌在try—程序段(1)和catch—程序段(4)这一对里面的。
我们在修改例3这个程序时利用了Java的一个优点,即:在一个成套的try—程序段和catch—程序段内允许完整组合的try—程序段和catch—程序段套在里边应用。这是修改Java—程序必不可少的技巧。
另外,在一个try—程序段内允许完整组合的try—程序段和catch—程序段套在里边应用。同样,在一个catch—程序段内也允许完整组合的try—程序段和catch—程序段套在里边应用。要注意的原则是,有try—程序段的出现,就有catch—程序段的出现,而且一个try—程序段可以引导多个catch—程序段。也就是说,在一个try—程序段的后边可以跟随多于一个以上catch—程序段。那么,到底多少为宜,要根据具体情况以及程序的需要而确定。
Literatur(参考文献):
[1]Dirk Louis.Jetzt lerne ich Java[M].Germany:vieweg,2001.
[2]Christian Welff.Einfuerung in Java[M].Germany:Teubner,1999.
[3]Gao Rong Fang(高荣芳).Grundkurs Java[M].Germany:Script,2002.
[责任编辑 王爱萍]
TP311
A
1008-4649(2010)02-0092-07
2009-11-25
高荣芳(1958— ),女,西安市人,德国波鸿大学教授,数学博士。