如何确保返回整数或双精度浮点数时,catch返回值与try返回值不同?

3

大家好,这是我的第一个问题,如果这个问题已经在其他地方得到了解答,我很抱歉,但我找不到答案,所以我在这里发帖。

在方法返回值可能为正或负且您不确定返回值范围的情况下,如果出现异常,应该返回什么值?

例如,在以下方法中-

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;
  }
}

假设分数和平均分数的范围很大,如果我的catch中的返回值等于没有异常时的返回值怎么办?
例如,分数为2,平均分数为3,那么我将得到-1作为返回值。
当我得到这个返回值时,我不确定是否捕获了异常。
我的问题就是,当捕获异常时,是否有一种方法可以返回一个与其他可能的返回值不冲突的唯一双精度浮点值?

1
在调用方法之前检查空值可能更简单。 - user7953532
@patrick-hainge 感谢您的及时回复,确实如此。但是,我正在完成一个任务,必须遵循一个序列图,因此只能在calculateDifference方法中调用getStudent方法。 - Cerulean Koh
3个回答

2
简单来说,NullPointerExceptions错误。你不需要捕获它们。你需要调试来了解其原因,然后修复问题。故事结束。当你有一个真正巨大的应用程序时,你的顶层可以捕获RuntimeException,但只是记录信息并向用户提供一些帮助信息。是的,有一些RuntimeExceptions可以捕获,例如在解析输入字符串(应该是数字)时出现NumberFormatException。但是像捕获NPE并返回-1这样的行为是错误的。它隐藏了一个错误条件,并使得几乎无法预测代码将如何从那里继续执行。对于你的具体情况:确保不要使用空参数调用方法。或者,如果你真的想允许传递空参数,你可以添加类似于
Objects.requireNonNull(var, "var must not be null) 

在你的方法的第一行(每个可能为空的参数都要检查一次),然后至少明确表示传递null将使该方法抛出NPE,即使有一个漂亮而清晰的错误消息。


谢谢!在这种情况下,我可以做一些像是将异常传播到调用方法,如果quiz或student为空的操作吗?然后从那里使用getMessage。它编译并且运行良好。 - Cerulean Koh
也许我的最后一次更新有所帮助。但我不确定我是否理解了你的问题。 - GhostCat

0
根据《Effective Java》书籍,你不应该捕获NullpointerException。这通常是一个编程错误。此外,请参见这里:我是否总是不捕获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;
}

还不太好。你没有提供任何消息,所以当以后调试时,你不知道这两个参数中的哪一个是 null。 - GhostCat

0

不要在 calculateDifference() 方法内捕获 NullPointerException。最好声明该方法抛出某些异常,以便方法的用户知道可能会出现问题。

也许您应该考虑使用 IllegalArgumentException,并检查您的方法中的 null 值。

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;
}

然而,使用像NullPointerExceptionIllegalArgumentException这样的RuntimeException的缺点是,尽管它们被声明为方法抛出的异常,但它们并没有被强制执行,因此调用者根本不需要捕获它们。因此,如果您愿意费心编写自己的Exception子类,则最好抛出此异常,因为方法的用户将不得不处理该异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接