回 帖 发 新 帖 刷新版面

主题:请分析Java异常的问题

学习到Java异常时见到如下范例:

 /*
  * 这个程序演示引发异常
  */

 /*
  * 这个类创建用户自定义异常类
  */
class numberofdigits{

    protected numberofdigits(){
    }

     /*
      * 类和应用程序的唯一入口
      * @param args字符串参数
      */
    public static void main(String args[]){
    try{
        long num;
        int count=0;
        num=Integer.parseInt(args[0]);
        args[0]=args[53];
        for(int i=0;num>0;i++){
        count+=1;
        num=num/10;
        }
        System.out.println(args[0]+"的位数是"+count);
      
    }catch(NumberFormatException ne){
        System.out.println("输入的数字无效!");
    }catch(ArrayIndexOutOfBoundsException ae){
        System.out.println("数组索引越界!");
    }
    }
}

    以上本是求数字位数的程序,但我对这一句感到不解:
       args[0]=args[53];  /* 起什么作用? */
 

    另外我在做习题时运行程序时达不到预期效果,
  题目:为一家保险公司编写程序InsuranceCalculater,用2008年减去某人的出生年份来计算其年龄。然后用年龄减去16来计算其他驾驶年数。驾驶年数少于4的人每年需字符1000元保险额,其他人支付600元。如果未满16岁,则无需保险,而应印发异常(年龄太小,无需保险!) 

我编写的程序如下:

 /*
  * 这个类用于自定义异常
  */
class youngerException extends Exception{

    youngerException(){
        System.out.println("年龄太小,无须保险!"); 
   }
}
 /*
  * 这个类演示应缴纳的保险
  */
public class insurance{

    insurance(){
    }

     /*
      * 类和程序的唯一入口
      * @param args字符串参数的数组
      */
    public static void main(String args[]){
        int year=2008-Integer.parseInt(args[0]);
    try{
        if(year<16){
        throw new youngerException();
        }else if((year-16)<4){
        System.out.println("年龄"+year+"需支付保险1000元.");
        }else {
        System.out.println("年龄"+year+"需支付保险600元.");
        }
    }catch (youngerException ye){
        System.out.println("未满16岁!");
    }catch (NumberFormatException ne){
        System.out.println("输入的不是年份!");
        }catch (ArrayIndexOutOfBoundsException ae){
        System.out.println("数据越界!");
    }catch (IllegalArgumentException ie){
        System.out.println("非法参数!");
    }
    }
}
        
 如果命令行参数为字符串或1982  123之类,程序运行根本捕捉不到错误.

以上问题请帮忙解答,能详细最好,谢谢.          
    

回复列表 (共3个回复)

沙发

首先当被输入者年龄小于16时程序会抛出异常youngerException(){
        System.out.println("年龄太小,无须保险!"); 
   }从而程序跳过这段代码故
catch (youngerException ye){
        System.out.println("未满16岁!");
不能在捕捉到异常异常。
本人认为另外的三个捕捉异常的catch()语句只需写catch (IllegalArgumentException ie){
        System.out.println("非法参数!");就行了把他归为非法参数这一类就行。
为了捕捉到这个异常还需在建立一个异常类比如illegalException()就行了。当输入非法数据时抛出这个类的一个对象就行。

板凳

class youngerException extends Exception{

    youngerException(){
        System.out.println("年龄太小,无须保险!"); 
   }
}
class illegalException extends Exception{
illegalException(){ System.out.println("非法参数!");
}

 /*
  * 这个类演示应缴纳的保险
  */
public class insurance {

    insurance(){
    }

     /*
      * 类和程序的唯一入口
      * @param args字符串参数的数组
      */
    public static void main(String args[]) throws Exception{
        int year=2008-Integer.parseInt(args[0]);
        int bornyear=Integer.parseInt(args[0]);
    try{
        if(bornyear>2008||bornyear<1900){
throw new illegalException();
}
       else  if(year<16){
        throw new youngerException();
        }
else if((year-16)<4){
        System.out.println("年龄"+year+"需支付保险1000元.");
        }
 else     {
          System.out.println("年龄"+year+"需支付保险600元.");
         }
    }
finally{}
    }
}

3 楼

args[0]=args[53];  起的作用就是当你输入args数组中的字符串个数少于53是产生数组索引越界的异常。53也可改成别的数字比如4 6等

我来回复

您尚未登录,请登录后再回复。点此登录或注册