但是我不想用try / catch块来包围声明!

时间:2010-11-02 17:57:49

标签: java exception try-catch

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

我可以用一个没有任何作用的catch块来包围这个darn的东西,但是无论什么样的情况 导致异常被抛出,我都不会发现它。我不想在我的程序顶部创建一个throws UnsupportedEncodingException的大链。

我可以在这做什么?为什么我被迫处理一些例外,而其他人(例如IllegalArgumentExceptionNullPointerException)我被允许忽略?

5 个答案:

答案 0 :(得分:24)

我认为你需要更好地掌握已检查的例外情况及其目的,但那是another question and answer。在这种情况下,您所做的是:

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

答案 1 :(得分:4)

有两种类型的例外。

  • CheckedException:它强制您使用try-catch或抛到程序顶部。
  • UncheckedException:你可以绕过..它只会在运行时引发

我接受这样一个事实,即Java设计的方式使程序不易出错。

答案 2 :(得分:2)

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

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

在不包装它的情况下重新抛出已检查异常的另一种方法是抛出它,就像它是一个未经检查的异常一样。你可以试试这个。

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

答案 3 :(得分:1)

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

当然,由于某种原因,不推荐使用此方法 - 其行为取决于JVM的默认编码,该编码可能因操作环境而异。但如果您知道您的环境没有变化,这可能无关紧要。还有可能在将来的Java版本中删除该方法,但尚未删除任何已弃用的项目,我怀疑这种情况是否会发生。

答案 4 :(得分:1)

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

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

A good lesson on exceptions