同时抛出两个例外

时间:2013-08-30 22:09:01

标签: java exception exception-handling division

我有以下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;

}

我在这里想要实现的是异常更具描述性。如果其中一个数字为null,我怎么能让Java智能化并抛出NullPointerException,当两个输入等于零时抛出类似未定义数字异常的东西。用非零分子除零也应该更具表现力。我该怎么办呢?

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

3 个答案:

答案 0 :(得分:1)

您需要区分两个变量为null且为零。 如果您运行这样的程序,其中两个变量为null,则会出现您想要的异常:

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

答案 1 :(得分:0)

您只需在try - catch块内添加检查即可。 类似的东西:

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

但是我应该对使用未经检查的异常保持警惕,因为它们会在不强制调用者捕获它的情况下冒泡你的堆栈。

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

问题被编辑后

更新

为什么不简单地改为:

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

参数现在是基元而不是对象,所以它们不能是null。您传递给函数的参数仍然可以是IntegerDouble的实例,Java的Autoboxing功能将为您进行翻译(如果Exception则抛出null )。

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

答案 2 :(得分:0)

Java已经抛出两个不同的异常,而不是同时抛出,但是根据哪个异常发生。也许你的意思是如何捕获两个可能不同的异常? 例如:

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;

        }

但请注意,在这种情况下,不会抛出ArithmeticException,因为您使用的是浮点数。如果使用整数,则会有例外。