【问题标题】:How to ensure that catch return value differs from try return value when returning integers or doubles返回整数或双精度时如何确保catch返回值与try返回值不同
【发布时间】:2017-10-12 21:11:20
【问题描述】:

大家好,这是我的第一个问题,如果之前有人回答过这个问题,我深表歉意,但我找不到问题的答案,所以我在这里发布。

如果你的方法的返回值可以是正数也可以是负数,而你又不确定返回值的范围,遇到异常应该返回什么值?

例如在下面的方法中-

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

假设score和average score的范围很大,如果我catch中的返回值等于没有异常时返回的值呢?

比如score=2,平均score=3,所以我会得到-1作为返回值。

当我得到该返回值时,我不确定是否捕获到异常。

我想问的是,是否有办法在被捕获时返回一个不会与其他可能的返回值冲突的唯一双精度值。

【问题讨论】:

  • 在调用方法之前检查空值可能更简单。
  • @patrick-hainge 感谢您的及时回复,这是真的。但是,我正在做一个作业,我必须遵循序列图,因此只能在 calculateDifference 方法中调用 getStudent 方法

标签: java return double try-catch


【解决方案1】:

简单:NullPointerExceptions错误

你没有抓住他们。

您调试它们以了解它们的原因,然后解决问题。故事结局。

是的,当您有一个非常庞大的应用程序时,您的顶层可以捕获RuntimeException - 但只是记录该信息并向您的用户提供某种有用的消息。

是的,您可以捕获某些 RuntimeExceptions,例如解析应该是数字的输入字符串时的 NumberFormatException。但如前所述,捕捉 NPE 返回 -1 是完全错误的。它隐藏了一个错误条件,并且几乎不可能预测您的代码将如何从那里继续。

在您的特定情况下:只需确保您不使用空参数调用该方法。或者,如果你真的想允许传递空参数,你可以放一些类似

Objects.requireNonNull(var, "var must not be null) 

在方法的第一行(检查每个可能为空的参数)。然后你至少明确地表明传递 null 将使该方法抛出一个 npe,即使有一个很好的清晰错误消息。

【讨论】:

  • 谢谢!在这种情况下,如果 quiz 或 student 为空,我可以执行类似向调用方方法传播异常的操作吗?然后从那里使用 getMessage 。它编译并且工作正常。
  • 也许我的最后一次更新有帮助。但不确定我是否收到了您的问题。
【解决方案2】:

而不是在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;
}

但是,使用RuntimeExceptions (如NullPointerExceptionIllegalArgumentException)的缺点是,即使它们被声明为由方法抛出,它们也不会被强制执行,因此调用者不必在全部。因此,如果您愿意自己编写Exception 的子类,最好将其抛出,因为那时该方法的用户将不得不处理异常。

【讨论】:

    【解决方案3】:

    根据Effective Java 书,您不应该捕获 NullpointerException。这通常是一个编程错误。另见此处:Should I always not catch 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;
    }
    

    【讨论】:

    • 还是不太好。您没有给出消息,因此稍后在调试时,您不知道这两个参数中的哪一个为空。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    相关资源
    最近更新 更多