Java 为什么方法抛出而不是返回null?

Java 为什么方法抛出而不是返回null?,java,exception,throw,Java,Exception,Throw,我想知道为什么有些方法会抛出Exception而不是返回null 例如Class.forName(字符串className)方法抛出ClassNotFoundException。如果被调用方想通知我们为什么不直接返回null,我们可以使用If检查结果,而不必编写try catch块 为什么不这样写: try{ Class<?> c = Class.forName("foo.Bar"); } catch(ClassNotFoundException e){ ... }

我想知道为什么有些方法会抛出
Exception
而不是返回
null

例如
Class.forName(字符串className)
方法抛出
ClassNotFoundException
。如果被调用方想通知我们为什么不直接返回
null
,我们可以使用
If
检查结果,而不必编写
try catch

为什么不这样写:

try{
    Class<?> c = Class.forName("foo.Bar");
} catch(ClassNotFoundException e){
    ...
}
试试看{
类别c=类别forName(“foo.Bar”);
}catch(classnotfounde异常){
...
}
像这样:

Class<?> c = Class.forName("foo.Bar");
if(c != null) {
    ...
} else {
    //handle that class wasn't found
}
Class c=Class.forName(“foo.Bar”);
如果(c!=null){
...
}否则{
//找不到该类的句柄
}
当可能返回特定值(最好是
null
或有时是
-1
)时,为什么要使用
异常
,通知调用方操作失败?我知道如果一个方法可能会以更大的方式失败,调用方可以根据错误消息分离对它的反应,但是在这种情况下,
ClassNotFoundException
仅在找不到类时抛出


还有一个性能问题,返回
null
比抛出
异常要快,不是吗?

从调用方的角度来看,通常在代码块中处理异常比检查返回代码更容易。例如,如果要调用两个可能失败的函数,该怎么办?然后你会有这样的情况:

if (functionAWorks()) {
  ...
  if (functionBWorks()) {
    ...
  }
  else {
    ...
  }
}
else {
  ...
}
而不是:

  try {
    functionA();
    functionB();
  } catch (Exception e) {
    ...
  }
通常,结构化返回代码处理的麻烦会导致人们根本不检查返回代码

从被调用方的角度来看,抛出异常通常比返回代码更清楚地指示失败,并且它为调用方堆栈提供了对调试非常有用的跟踪信息


表现是另一个问题。可以说,如果您选择为项目使用托管语言,那么您已经选择不担心微观性能问题。

请记住,该方法还可能引发
LinkageError
异常InInitializeError
。您可能需要决定对不同的异常执行不同的操作

我同意这样的评论,即返回一个异常比只返回null更能提供信息,而且您不应该担心性能

与此情况无关,但对于只引发一个异常的情况,可以改为返回null。找不到要求的东西是例外吗?异常情况?然后抛出一个异常。。。这只是正常情况吗?返回null。这是一种设计选择,在任何情况下,都应该很好地记录调用方法的预期结果。文档就像是实现方法的人和调用方法的人之间的契约


此外,在Scala这样的语言中,可以调用一个返回
选项的方法,该选项可以有值,也可以没有值,以防该方法找不到要返回的内容。

因为这是该方法的例外条件
null
信息量不大,而异常堆栈跟踪通常是非常有用的信息。异常可以提供更多关于错误的信息(错误消息)。性能参数是不相关的,这不可能成为任何程序的性能瓶颈。它抛出,因为正如Jigar所提到的,这是一个异常情况。接受这一点。“存在性能问题”与“在这里代替猴子叫声”一样有意义。Java语言是一种高级语言,一般来说,“high”的值比“我可以通过返回一个goofball值而不是抛出一个异常来节省12个cpu周期”的值更为重要,如果您经常抛出异常,则可以对其进行优化,大约需要一微秒。如文档中所示,“错误是Throwable的一个子类,表示合理的应用程序不应试图捕捉的严重问题。”,因此您无法真正做好准备。我同意您答案的第二部分。@Sipka我同意您的看法。但是我不知道OP正在做什么,也许他正在实现一个IDE,捕捉这些错误是有意义的:)