【问题标题】:But I don't _want_ to surround the statement with a try/catch block!但我不想_用 try/catch 块包围语句!
【发布时间】:2011-05-04 02:20:00
【问题描述】:

我正在编写一个使用java.net.URLDecoder.decode(String value, String encoding) 的程序。显然,这个方法可能会抛出一个UnsupportedEncodingException,我得到了。但我只是将“UTF-8”作为编码传递。它不会抛出异常。

我可以用一个什么都不做的 catch 块来包围这个该死的东西,但是在任何异常情况下 确实 导致异常被抛出,我不会发现它。我也不想在我的程序顶部创建一个 throws UnsupportedEncodingException 的大链。

我可以在这里做什么?为什么我必须处理一些异常,而其他(例如IllegalArgumentExceptionNullPointerException)我可以忽略?

【问题讨论】:

  • 附带说明,您可以忽略的异常通常是您应该忽略的异常,直到您用于日志记录和优雅终止的全部处理程序。 IllegalArgumentException 和 NullPointerException 等使用异常表示错误和不稳定的程序状态。另一方面,受检异常类型不一定是致命的,因此受检异常背后的哲学要求您明确阐明您希望如何处理它(即使这意味着断言失败),或者您是否将该责任留给调用者。
  • @DanBryant:这是经典案例之一。 99.99% 的调用者在这里传递一个常量。异常真的不可能发生。

标签: java exception try-catch


【解决方案1】:

我认为您需要更好地掌握检查异常及其一般用途,但这是针对another question and answer 的。在这种情况下,您要做的是:

 try {
      //etc.
 } catch (UnsupportedEncodingException e) {
      throw new RuntimeException(e.getMessage(), e);
 }

【讨论】:

  • +1。但附带说明:这假设您认为 UnsupportedEncodingException 对当前线程至关重要。否则,如果您的程序正在输出日志信息,您总是可以使用适当的级别来记录它。
  • +1 我的代码中填满了这段代码。这很乏味,但这是必要的。比让异常在堆栈中冒泡要好得多。
  • 这个解决方案很好,因为它明确表明,如果在这种情况下抛出检查的异常 UnsupportedEncodingException 应该被解释为一个错误(因此是致命的)。
  • 吹毛求疵:JVM 规范明确要求支持 UTF8。如果它不支持 UTF8,那就不是 JVM。因此,AssertionError 比普通的 RuntimeException 更合适。
【解决方案2】:

有两种类型的异常。

  • CheckedException:强制使用 try-catch 或 throw 到程序顶部。
  • UncheckedException: You can bypass.. 它只会在运行时引发

我只是接受 Java 设计这种方式以使程序不易出错的事实。

【讨论】:

  • 什么是代词?这是对第 9 区的某种参考吗? ;)
  • 只是补充一下,java中的所有异常都会被检查,除非它们扩展了RuntimeException。
【解决方案3】:

如果它让你很困扰,那么你总是可以使用 URLDecoder.decode() 的已弃用的单参数形式。这个不带encoding参数,也不会抛出checked异常。

当然,不推荐使用此方法是有原因的——它的行为取决于 JVM 的默认编码,这可能因操作环境而异。但是,如果您知道您的环境没有变化,这可能并不重要。还有一种风险是,该方法将在未来的 Java 版本中被删除,但尚未删除已弃用的项目,我怀疑这是否会发生。

【讨论】:

    【解决方案4】:

    有些人包装 RuntimeException 以避免检查异常。但是,在您的情况下,您知道不应发生此异常。在我看来,这是一个断言。

    try { 
         //etc. 
    } catch (UnsupportedEncodingException e) { 
         throw new AssertionError(e); 
    } 
    

    另一种在不包装的情况下重新抛出已检查异常的方法是将其作为未检查异常进行抛出。你可以试试这个。

    try { 
         // throws a checked exception
    } catch (Exception e) { 
         Thread.currentThread().stop(e);
    } 
    

    【讨论】:

      【解决方案5】:

      UnsupportedEncodingException 是 URLDecoder.decode 方法检查的异常,您必须捕获它或指定您的方法抛出它。

      public static String decodeUTF8String(String s) throws UnsupportedEncodingException 
      {
          return java.net.URLDecoder.decode(s, "UTF-8"); 
      }
      

      A good lesson on exceptions

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多