抛出异常或返回null

Blu*_*ell 5 java null coding-style exception

如果我有以下功能,有两个选择

private MyObject findBlank() {
    for (int i = 0; i < pieces.length; i++) {
        if(pieces[i].isBlank()){
            return pieces[i];
        }
    }
    return null;
}

private MyObject findBlank() {
    for (int i = 0; i < pieces.length; i++) {
        if(pieces[i].isBlank()){
            return pieces[i];
        }
    }
    throw new NoSuchFieldError("No blank piece found!");
}
Run Code Online (Sandbox Code Playgroud)

从这个方法我知道它应该总是返回一个对象,其中一个'件'总是isBlank() == true,最后的返回null只是为了取悦编译器.既然是这种情况,如果它返回null我的代码无论如何都不会工作,这是正确的请抛出异常吗?

我的选择是:

  1. 返回null,应用程序将在某些边缘情况下获得NullPointerException
  2. 返回null并使用(myObject!= null)检查包装方法
  3. 抛出一个异常会在运行时将其炸毁

我想我要问的是,这是抛出异常的正确位置吗?也就是说,如果遇到这种情况,我无能为力.这被归类为'例外'还是我应该检查我的方法返回什么(这使我的代码看起来很糟糕).如果我知道它不应该返回null那么我应该抛出异常吗?

另外,我如何选择什么异常,或者扩展一个并抛出我自己的异常呢?

K-b*_*llo 10

我想我要问的是,这是抛出异常的正确位置吗?

如果是特殊情况,那么是的.如果没有找到符合条件的任何东西的可能性预期那么情况并不特殊,你应该返回null.


Wor*_*mbo 4

关于你的选择,问问自己是否

  1. 在该方法返回意外值(即)之后的某个时刻让您的程序崩溃是个好主意吗null
  2. 如果屏蔽掉null返回值,到底会隐藏什么?
  3. 仅仅因为值错误就立即炸毁是个好主意吗?

就我个人而言,我会选择选项 2 或 3,具体取决于我是否更喜欢问题 2 或 3 的答案。选项 1 绝对是一个坏主意,特别是如果它不应该发生的话。如果程序在函数返回后抛出 NPE 方式,您将很难弄清楚它null来自哪里。特别是如果它发生在您完成此特定功能几个月后。

如果你选择抛出异常,你会立即看到哪里出错了,并且可以直接去那里找出出错的原因。在调用函数中返回null并检查它也可以工作,但前提是您不是默默地失败,而是实际采取一些措施来正确处理问题。