有没有办法自动捕获异常?

时间:2012-12-12 17:05:54

标签: java exception-handling

假设我有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来逐行捕获异常。但这种方式使我的来源非常复杂。

5 个答案:

答案 0 :(得分: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();
}

修改

既然您已使用代码段更新了问题,那么有两种常规方法可以处理null s:

1。禁止他们不应该在

的地方

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

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

2。允许它们有意义,并提供空值检查

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

在这种情况下,你不能忽视NPE的可能性,你必须做一些空检查。但同样, NPE不是你的敌人。它会告诉你,你忘了考虑你应该拥有的所有可能情况。

当然,重复的空检查会使代码变得混乱和嘈杂,因此您可以创建一些方法来为您推广空检查。我无法想出一个明智的例子,所以请将此方法仅用于说明:

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

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


这个问题也是关于处理空值的非常好的解读: Avoiding != null statements

答案 1 :(得分:6)

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

答案 2 :(得分:3)

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

答案 3 :(得分: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)
{
}
...

答案 4 :(得分:1)

NullPointerException是一个运行时(未经检查)的异常,Java不会被重新命名以捕获未经检查的异常。你应该有一个防止它的解决方案。