【问题标题】:Java: Try-Catch-Continue?Java:尝试-捕捉-继续?
【发布时间】:2010-12-20 03:28:10
【问题描述】:

假设我可以一组语句:

try {
  String a = getProperty("a");
  String b = getProperty("b");
  String c = getProperty("c");
} catch(Exception e) {

}

现在,假设没有找到属性 b 并且函数抛出异常。在这种情况下,我将如何继续或将 b 设置为 null 而不必为每个属性编写一个 try-catch 块?我的意思是,a,b,c 存在,但有时可能根本找不到它们,在此期间会引发异常。

【问题讨论】:

    标签: java exception-handling try-catch


    【解决方案1】:

    您必须在每个语句周围放置一个 try-catch。没有 continue (就像 VB 中的 ON ERROR ... RESUME 块一样)。而不是:

    String a = null;
    try {
      a = getProperty("a");
    } catch(Exception e) {
      ...
    }
    String b = null;
    try {
      b = getProperty("b");
    } catch(Exception e) {
      ...
    }
    String c = null;
    try {
      c = getProperty("c");
    } catch(Exception e) {
      ...
    }
    

    你可以写:

    public String getPropertyNoException(String name) {
      try {
        return getProperty(name);
      } catch (Exception e) {
        return null;
      }
    }
    

    就我个人而言,我认为 getProperty() 不适合仅针对所需的所有这些额外样板而引发异常

    【讨论】:

    • 是的...... getProperty 来自不同的库,我真的不想碰那个部分。
    【解决方案2】:

    由于您每次都使用相同的函数,因此您可以将其放入循环中:

    String[] abc = new String[3];
    String[] param = {"a", "b", "c"};
    for (int i = 0; i < 3; i++) {
        try {
          abc[i] = getProperty(param[i]);
        } catch(Exception e) {
    
        }
    }
    

    但这是相当人为的,并且仅对大量属性有用。我怀疑您将不得不简单地编写 3 try-catch。

    【讨论】:

      【解决方案3】:

      假设您无法更改函数以使其在未找到属性时返回 null,那么您有点卡住了将所有内容包装在其自己的 try catch 块中 - 特别是如果您想要每个可以检索的值被检索(而不是让第一个失败的值取消整个操作。)

      如果您有很多这些属性要检索,也许编写一个辅助方法来使用会更简洁:

      String getPropertySafely(String key) {
         try {
            return getProperty(key);
         } catch (Exception e) {
            return null;
         }
      }
      

      【讨论】:

      • 这看起来很有趣!谢谢
      • 我将其命名为“getPropertyQuietly”只是因为他们使用 Jakarta Commons IO 中的命名约定(IOUtils 类中的 closeQuietly 方法)
      • +1 Ravi - 我的一个主要烦恼是吞下异常。如果您要这样做,至少要根据方法的名称使其显而易见。 (清洁代码)
      • 使用 try-catch 还是从方法中抛出错误更好?我从来没有完全确定过这个事实。在大多数情况下,我希望始终处理具有 try-catch 的类或方法中的所有错误。我不想让其余的实现类必须在方法存根中添加一个 throws 来捕获错误。
      • @Doug Hauf:在您能够 1) 恢复或 2) 正确处理例外。换句话说,你的方法的调用者甚至不需要知道异常被抛出了。在所有其他情况下,您应该将异常提升到下一个级别,即方法调用者可能想知道发生了异常,并可能自己处理该异常。
      【解决方案4】:

      如果您打算使用其中的许多 getProperty,则应该重新考虑如何处理它们,因为没有简单的方法来做到这一点。

      您可以利用finally 语句,但每次调用仍需要try-catch

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-02
        • 1970-01-01
        • 2010-11-23
        • 2013-08-04
        • 2014-12-27
        • 1970-01-01
        相关资源
        最近更新 更多