Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在返回整数或双精度时,如何确保catch返回值与try返回值不同_Java_Return_Double_Try Catch - Fatal编程技术网

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。