如何处理Java程序中的错误

2010-08-15 00:52高荣芳
陕西开放大学学报 2010年2期
关键词:程序段支撑架声明

高荣芳

(波鸿大学数学系,德国 波鸿 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— ),女,西安市人,德国波鸿大学教授,数学博士。

猜你喜欢
程序段支撑架声明
本刊声明
本刊声明
基于WinCC的物料小车控制系统设计与仿真
一种便于刮料的橡胶开炼机
扩散塔模板及支撑架施工浅析
数控系统手轮回退功能的研究与实现*
本刊声明
本刊声明
基于NC程序段的提高数控加工监控阈值与信号同步的方法*
一种塑料板周边抛光机