1

假设我有 10 行代码。任何行都可能引发 NullPointerException。我不想关心这些异常。如果一行抛出异常,我希望执行程序跳转到下一行并继续前进。我可以在 Java 上做到这一点吗?如果是,请给我一些示例代码。

更新:(添加示例源以获得更清晰的问题)

first.setText(prize.first);
second.setText(prize.second);
third.setText(prize.third);
fourth.setText(prize.fourth);
fifth.setText(prize.fifth);
sixth.setText(prize.sixth);
seventh.setText(prize.seventh);
eighth.setText(prize.eighth);

假设我上面有 8 行代码。我想要的是:如果第 4 行(或第 5、6、...)行抛出异常,则所有其他代码行都正常工作。当然,我可以使用 try...catch 逐行捕获异常。但是这种方式使我的来源非常复杂。

4

5 回答 5

7

这是不可能的。如果你想一想,你会发现这也是无稽之谈。以这段代码为例:

String s = getSomeString(); // assigns null
int length = s.length; // throws NPE

if (length > 10) { // what would you do here?? length is un-initialized
    domeSomething();
}

编辑

现在您已经使用代码片段更新了您的问题,有两种处理s 的通用方法:null

1. 在不应该出现的地方禁止他们

在您的代码片段中,您提供了一个EditTexts 列表,其中任何一个都可能为空。好吧,在我看来,如果你Activity在 Android 中有一个应该有一些视图的视图,那么如果其中任何一个出于某种原因,那就是编程错误。null没有其某些视图的活动无法正常工作,因此抛出 NPE 并退出应用程序是一件非常明智的事情。

NPE 告诉你“嘿,你犯了一个错误,你必须改正它”。在那之前,处于不可预测状态的应用程序继续执行是不安全的,因为没有人知道会发生什么,什么数据会损坏。

2. 在有意义的地方允许他们,并提供空检查

在某些地方,您可以拥有值可以为空的变量。有几种方法可以表达一个空值,并且null是最明显的一种。

在这种情况下,您不能忽略 NPE 的可能性,您必须进行一些空值检查。但同样,NPE 不是你的敌人。它会告诉您,您忘记了考虑所有可能出现的情况。

当然,重复的 null 检查会使代码变得混乱和嘈杂,因此您可以创建一些方法来为您概括 null 检查。我想不出一个合理的例子,所以用这个方法只是为了说明:

public void clearEditTexts(EditText... editTexts) {
    for (EditText e : editTexts) {
        if (e != null) {
            e.setText("");
        }
    }
}

此方法清除所有传递的 EditText 的内容。它们中的任何一个都可以为空,但此方法在内部进行这些空检查,因此您不必为每个都手动进行。


这个问题也是关于处理空值的一个很好的阅读: 避免!=空语句

于 2012-12-12T17:13:38.733 回答
6

这是不可能的。如果您的变量可以为空,您只需要检查它,或防止它们为空。创建一个覆盖的方法什么都不做的虚拟对象实现很少有用,因此它可以用来代替有效对象而不是 null。

于 2012-12-12T17:09:21.427 回答
3

变量为 null 的事实是值得注意的,不应被忽略。因此,你会想要这样的东西:

...
if(first != null && prize.first != null)
{
    first.setText(prize.first);
}
...

如果出于某种原因,您绝对需要抛出 NPE,则需要用自己的 try/catch 包围每一行;没有办法自动捕获异常并让它前进到下一行。但是,不建议这样做。

...
try
{
    first.setText(prize.first);
}
catch(NullPointerException e)
{
}
try
{
    second.setText(prize.second);
}
catch(NullPointerException e)
{
}
...
于 2012-12-12T17:18:28.183 回答
3

不,你不能,你应该关心,他们试图告诉你什么是错的。

于 2012-12-12T17:09:18.993 回答
1

NullPointerException 是运行时(未经检查的)异常,Java 不建议捕获未经检查的异常。你应该有一个解决方案来防止它。

于 2012-12-12T17:14:16.033 回答