【问题标题】:Is there any way to auto catch exception?有没有办法自动捕获异常?
【发布时间】:2012-12-12 17:05:54
【问题描述】:

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

【问题讨论】:

  • 为什么要忽略 NPE 而不是检查空值?
  • 每一行都会是try / catch...
  • 不应使用异常来隐藏您不想查找/修复的错误。你应该确定为什么你会得到 NullPointerExceptions 并修复它,而不是隐藏它。
  • 该示例代码看起来很适合替换为循环和数组。
  • @Tomas - 提到了!如果你不介意,如果你对我的回答有更多的意见,请评论我的回答

标签: java exception-handling


【解决方案1】:

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

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

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

编辑

现在您已经使用代码 sn-p 更新了您的问题,有两种通用方法可以处理nulls:

1。在不应该出现的地方禁止它们

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

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

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

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

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

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

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

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


这个问题也是一个很好的关于处理空值的阅读: Avoiding != null statements

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      ...
      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】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-06-18
            • 1970-01-01
            • 1970-01-01
            • 2012-12-14
            • 2021-10-26
            • 1970-01-01
            • 1970-01-01
            • 2020-09-20
            相关资源
            最近更新 更多