【问题标题】:Loop with repeated exception catching循环重复异常捕获
【发布时间】:2014-09-30 10:43:37
【问题描述】:

我需要这样做:

while(prot.getProcessedTranscriptPositionFromAA(start) == null) start++;

但是因为prot 抛出NullPointerException 我不能这样循环。如何创建一个循环来捕获NullPointerException,递增开始,然后再次执行getProcessedTranscriptPositionFromAA,依此类推,直到getProcessedTranscriptPositionFromAA 不会抛出NullPointerException(“没关系”循环有可能成为无限)。

我从未使用过goto,我什至不知道如何使用 is,但是这样的东西会以某种方式工作吗?:

        *here*
        try{
            prot.getProcessedTranscriptPositionFromAA(start);
        }
        catch (NullPointerException e){
            start++;
            goto *here*
        }

【问题讨论】:

  • 只是为了增加清晰度 - 在 Java 中 goto 没有做任何事情..

标签: java loops nullpointerexception goto


【解决方案1】:

您不需要goto - 在Java 中没有实现goto。您可以将try/catch 放入循环中。当异常被捕获时,循环可以继续,一件事与另一件事无关。

int start = 0;
boolean isNotNull = false;

while (!isNotNull) {
    try {
        prot.getProcessedTranscriptPositionFromAA(start);
        isNotNull = true;
    }
    catch (NullPointerException e) {
        start++;
    }
}

我写这篇文章的前提是你对getProcessedTranscriptPositionFromAA() 的实现方式没有发言权。但是,如果您确实控制了此方法,或者知道控制此方法的人,请确保在将索引传递到空位置时它不会抛出 NullPointerException - 这不是好的 API 设计。相反,它应该返回指示该位置为空的内容。 There is a lot of lively disagreement 是否应该是 null 或表示空虚的非空对象;但无论哪种方式,都不要抛出异常。

【讨论】:

  • +1 - 虽然,您可能希望删除其他过时的答案。
  • 糟糕,不知道我是如何制作 2 的。感谢您发现 - 已删除。
【解决方案2】:

您应该首先防止NullPointerException 被抛出。 NullPointerException 通常表示您的代码中存在错误。

while (prot != null && prot.getProcessedTranscriptPositionFromAA(start) == null) start++;

如果getProcessedTranscriptPositionFromAA 本身可能抛出NullPointerException,您也应该修复该方法。

【讨论】:

    【解决方案3】:

    通常你在类名的同一行写 throws NullPointerException。用于在单个类中处理多个 NullPointerException。

    【讨论】:

      【解决方案4】:

      您可以构建一个为您捕获 NPE 的包装器方法。

      类似:

      public static boolean getSomething(ProtClass prot){
          try{
              //do something
              return true;
          }catch(NullPointerException e){
              return false;
          }
      }
      

      并在 while 表达式中使用此函数。

      【讨论】:

        猜你喜欢
        • 2020-07-01
        • 2016-05-30
        • 2012-07-13
        • 2011-12-07
        • 2011-02-07
        • 1970-01-01
        • 1970-01-01
        • 2015-02-19
        • 1970-01-01
        相关资源
        最近更新 更多