2013-08-30 136 views
1

两个例外,我有以下的Java方法投掷同时

public static double realDivision(Integer num, Double denom) { 
    double result = 0.0; 
    try{ 
     result=(double)num/(double)denom; 
    } 
    catch (ArithmeticException e){ 
    System.err.println("Smart up Goof"); 
    e.printStackTrace(System.err); 
    } 
    return result; 

} 

我想在这里实现是例外更具描述。我怎样才能使Java变得更聪明一点,当其中一个数字为空时抛出一个NullPointerException异常,并且当两个输入都等于零时抛出类似未定义数字异常的东西。用非零分子来除零也应该更有表现力。我该怎么做?

EDITED 我不想要一堆条件,如空检查或零检查。我希望Java知道为什么会发生算术异常或NPE,并抛出那个精确的异常。如果我可以让java做到这一点,我可以按照它的方式编写错误处理代码。

+0

你可以编写你自己的例外,然后手动抛出那些... – Kon

+1

你不能增加Java的智能。你将不得不为此编码。 –

+0

另外要指出的是,两个异常不会在同一时间抛出,只会抛出其中一个异常 –

回答

0

您可以通过简单地在try - catch块内添加支票来完成。 喜欢的东西:

if ((num == null) || (denum == null)) 
{ 
    throw new NullPointerException("Argument is null"); 
} 

不过,我应该是一个有点担心使用unchecked异常这样的,因为它们会泡了你的筹码,而不强迫调用者抓住它。

也许创建自己的异常并声明你的方法抛出它会更好。

UPDATED问题编辑完成后。

为什么不能简单地把它改成这样:

public static double realDivision(int num, double denom) 
{ 
    return (double) num/denom;  
} 

的参数现在是原始类型不是对象,所以他们不能null。您传递给函数的参数仍然可以是IntegerDouble的实例,Java的自动装箱功能将为您执行翻译(如果它们是null,则抛出Exception)。

在这种情况下,您需要手动进行的唯一检查是否需要denom0。因为在double的情况下Java返回Infinity而不是抛出一个ArithmeticException,因为实际上这是答案,它在某些双精度计算中很有用。如果你使用整数,你会得到ArithmeticException

1

您需要区分两个变量为空,且为零。 如果你运行你的程序是这样,这里的两个变量是空的,你有你想要的例外:

public class Arithmetics {  
     public static double realDivision(Integer num, Double denom) { 
      double result = 0.0; 
      try{ 
       result=(double)num/(double)denom; 
      } 
      catch (ArithmeticException e){ 
      System.err.println("Smart up Goof"); 
      e.printStackTrace(System.err); 
      } 
      return result; 

     } 

    public static void main(String[] args) {    
     double results=Arithmetics.realDivision(null, null); 
     System.out.println(results); 

    } 

} 

Exception in thread "main" java.lang.NullPointerException 
    at Arithmetics.realDivision(Arithmetics.java:7) 
    at Arithmetics.main(Arithmetics.java:19) 

EDITED 和...如果你使用值

double results=Arithmetics.realDivision(new Integer(0), new Double(0)); 

结果

NaN 

如果使用

double results=Arithmetics.realDivision(new Integer(1), new Double(0)); 

的结果是

infinite 
+0

如果你想处理这个问题,请在***之前使用逻辑***。例如,如果(num.intValue()== 0){} ... – azzurroverde

0

的Java已经抛出两个不同的例外,不同时,但据此发生一次。也许你的意思是如何捕捉两个可能不同的例外? 例如像:然而,在这种情况下ArithmeticException

public static double realDivision(Integer num, Double denom) { 
      double result = 0.0; 
      try{ 
       if(num.intValue()==0){ 

       } 
       result=(double)num/(double)denom; 
      } 
      catch (ArithmeticException e){ 
      System.err.println("Smart up Goof"); 
      e.printStackTrace(System.err); 
      } 
      catch (NullPointerException e){ 
       System.err.println("One of the numbers is null. I am smart. Java"); 
       e.printStackTrace(System.err); 
       } 
      return result; 

     } 

注意,因为使用的是浮动点不会被抛出。如果你使用整数,你会有例外。