Java 在返回整数或双精度时,如何确保catch返回值与try返回值不同
大家好,这是我的第一个问题,所以如果之前有人回答过这个问题,我很抱歉,但是我找不到这个问题的答案,所以我把它贴在这里 如果您的方法的返回值可以是正值或负值,并且您不确定返回值的范围,那么如果出现异常,您应该返回什么值 例如,在下面的方法中-Java 在返回整数或双精度时,如何确保catch返回值与try返回值不同,java,return,double,try-catch,Java,Return,Double,Try Catch,大家好,这是我的第一个问题,所以如果之前有人回答过这个问题,我很抱歉,但是我找不到这个问题的答案,所以我把它贴在这里 如果您的方法的返回值可以是正值或负值,并且您不确定返回值的范围,那么如果出现异常,您应该返回什么值 例如,在下面的方法中- public double calculateDifference(String studentName, String quizName) { try { Quiz quiz = quizDAO.retrieve(quizName);
public double calculateDifference(String studentName, String quizName) {
try {
Quiz quiz = quizDAO.retrieve(quizName);
double averageScore = quiz.getAverageScore();
Student student = quiz.getStudent(studentName);
double score = student.getScore();
return score - averageScore;
} catch (NullPointerException e) {
return -1;
}
}
假设分数和平均分数有一个很大的范围,如果我的捕获中的返回值等于在没有异常时返回的值,该怎么办
例如,分数=2,平均分数=3,所以我将得到-1作为返回值
当我得到返回值时,我不确定是否捕获了异常
我想问的是,当被捕获时,是否有一种方法可以返回一个唯一的double值,该值不会与其他可能的返回值冲突 简单:
NullPointerExceptions
是bug
你抓不到他们
您调试它们以了解其原因,然后修复问题。故事结束了
是的,当您有一个非常庞大的应用程序时,您的顶层可以捕获RuntimeException
——但只需要记录该信息并向您的用户提供某种有用的消息
是的,您可以捕获某些运行时异常,例如在解析假定为数字的输入字符串时出现NumberFormatException。但正如所说的,捕捉NPE返回-1是完全错误的。它隐藏了一个错误条件,并且几乎不可能预测代码将如何从那里继续
在您的特定情况下:只需确保不使用空参数调用该方法。或者,如果您真的想允许传递空参数,您可以
Objects.requireNonNull(var, "var must not be null)
在方法的第一行中(每个可能为null的参数检查一次)。然后,至少要明确传递null将使方法抛出npe,即使有一条清晰的错误消息 根据
effectivejava
一书,您不应该捕获NullpointerException。这通常是一个编程错误。另请参见此处:
我会:
public double calculateDifference(String studentName, String quizName)
{
if (studentName == null || quizName == null){
throw new IllegalArgumentException("Student name: " + studentName + ", quizName: " + quizName);
}
Quiz quiz = quizDAO.retrieve(quizName);
double averageScore = quiz.getAverageScore();
Student student = quiz.getStudent(studentName);
double score = student.getScore();
return score - averageScore;
}
而不是在
calculateDifference()
方法中捕获NullPointerException
。最好声明该方法抛出了某个异常,以便该方法的用户知道可能会出错
也许你应该考虑使用<代码> ILLalalAguMutExtExt[/Cuff],并在方法中检查<代码> null <代码>值。< /P>
public double calculateDifference(String studentName, String quizName)
throws IllegalArgumentException {
Quiz quiz = quizDAO.retrieve(quizName);
if(quiz == null)
throw new IllegalArgumentException("There is no such quiz!");
double averageScore = quiz.getAverageScore();
Student student = quiz.getStudent(studentName);
double score = student.getScore();
return score - averageScore;
}
但是,使用
RuntimeException
s,如NullPointerException
和IllegalArgumentException
的缺点是,即使它们被声明为由方法抛出,也不会强制执行,因此调用方根本不必捕获它们。因此,如果您愿意不辞辛劳地编写自己的Exception
子类,最好抛出它,因为该方法的用户将不得不处理该异常 在调用该方法之前检查空值可能更简单。@patrick hainge感谢您的及时回复,这是事实。但是,我正在做一个作业,我必须遵循一个序列图,因此只能调用calculateDifference方法中的getStudent方法谢谢!在这种情况下,如果quick或student为null,我是否可以向调用方方法传播异常?然后从那里使用getMessage。它编译的很好,也许我上次的更新会有所帮助。但我不确定我是否明白你的问题,还是不太好。您没有给出消息,因此在稍后调试时,您不知道这两个参数中的哪一个为null。