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 稍微智能一点,并在其中一个数字为 null 时抛出 NullPointerException,并在两个输入都为零时抛出类似未定义数字异常的东西。用非零分子除以零也应该更具表现力。我该怎么做?

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

4

3 回答 3

1

您需要区分两个变量为 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)

已编辑 并且...如果您使用值

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

结果是

NaN

如果你使用

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

结果是

infinite
于 2013-08-30T22:27:57.913 回答
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,因为您使用的是浮点数。如果你使用整数,你会有例外。

于 2013-08-30T23:33:32.850 回答
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. 您传递给函数的参数仍然可以是 and 的实例IntegerDoubleJava 的自动装箱功能将为您进行翻译(Exception如果它们是 则抛出一个null)。

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

于 2013-08-30T22:14:15.550 回答