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

Sip*_*pka 0 java exception throw

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

例如Class.forName(String className)方法抛出ClassNotFoundException.如果被调用者想要通知我们为什么不返回null,我们可以用a检查结果if,而不必写try-catch块.

为什么不写这个:

try{
    Class<?> c = Class.forName("foo.Bar");
} catch(ClassNotFoundException e){
    ...
}
Run Code Online (Sandbox Code Playgroud)

像这样:

Class<?> c = Class.forName("foo.Bar");
if(c != null) {
    ...
} else {
    //handle that class wasn't found
}
Run Code Online (Sandbox Code Playgroud)

Exceptions当可能有特定值返回(最好null或有时-1)时,为什么要使用,以通知调用者操作失败?我知道,如果一个方法可能会失败更多的方式,调用者可以在反应中以错误信息分开来,但在这种情况下,ClassNotFoundException只有当类找不到抛出.

而且还有性能问题,返回的速度要快null于抛出Exception不是吗?

小智 5

从调用者的角度来看,通常在代码块中处理异常比检查返回代码更容易.例如,如果您想调用可能失败的两个函数,该怎么办?然后你有类似的东西:

if (functionAWorks()) {
  ...
  if (functionBWorks()) {
    ...
  }
  else {
    ...
  }
}
else {
  ...
}
Run Code Online (Sandbox Code Playgroud)

代替:

  try {
    functionA();
    functionB();
  } catch (Exception e) {
    ...
  }
Run Code Online (Sandbox Code Playgroud)

通常,构造返回代码处理的麻烦导致人们根本不检查返回代码.

从被调用者的角度来看,抛出异常通常是一种更简洁的方式来指示失败而不是返回代码,并且它提供了调用程序堆栈跟踪信息,这对于调试非常有用.

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