我有以下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做到这一点,我就会按照应该的方式编写错误处理代码。
答案 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
。您传递给函数的参数仍然可以是Integer
和Double
的实例,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,因为您使用的是浮点数。如果使用整数,则会有例外。