2012-01-07 72 views
5

我想做绕过Java异常规范...?

public class Settings 
{ 
    static final URL logo = new URL("http://www.example.com/pic.jpg"); 
    // and other static final stuff... 
} 

,但我得到告诉我,我需要处理MalformedURLException。规格说MalformedURLException

抛出这一异常指示出现了错误的URL。在规范字符串中找不到合法协议,或者无法解析字符串。

现在,我知道我给的URL不是格式错误,所以我宁愿不处理我知道不会发生的异常。

有没有办法避免不必要的try-catch-block堵塞我的源代码?

回答

12

最短的回答是没有。但是您可以创建一个静态实用程序方法为您创建URL。

private static URL safeURL(String urlText) { 
    try { 
     return new URL(urlText); 
    } catch (MalformedURLException e) { 
     // Ok, so this should not have happened 
     throw new IllegalArgumentException("Invalid URL " + urlText, e); 
    } 
} 

如果你需要从几个地方这样的东西,你应该把它放在一个实用程序类。

+0

简洁明了。 +1 for'//好吧,所以这不应该发生' – Perception 2012-01-07 15:41:43

4

尝试以下操作:

public class Settings 
{ 
    static final URL logo; 

    static 
    { 
     try 
     { 
      logo = new URL("http://www.example.com/pic.jpg"); 
     } 
     catch (MalformedURLException e) 
     { 
      throw new IllegalStateException("Invalid URL", e); 
     } 
    } 
    // and other static final stuff... 
} 
+0

是的,谢谢,我知道try-catch的语法和语义,这不是问题。我的问题是我**知道异常不会发生,这就是为什么我想避免用不必要的try-catch-clause来阻塞我的源代码的原因。在C++中,我只是无视异常,编译器不会纠缠我,对吧?在Java中......我真的认为,应该有一种说服编译器在这种情况下不强制执行异常规范的方法,即编译器指令,如果没有别的... – OppfinnarJocke 2012-01-07 18:06:04

+0

@OppfinnarJocke哦,我并不打算冒犯你 - 虽然你只是不知道静态初始化器。不幸的是,没有办法说Java“只是在这里闭嘴”:如果有这样的特性,异常会比现在更加混乱。要点是,每个功能与几乎所有其他功能交互。如果奇迹般关闭异常,则意味着相同的代码可以根据您甚至没有看到的内容编译或不编译。 – alf 2012-01-07 18:09:02

+0

谢谢alf。我没有冒犯,如果遇到这种情况,我很抱歉...是的,我明白完全关闭异常检查可能会搞砸了,但编译指示说,就像你说的那样,“闭嘴”似乎很有用在这些罕见的(?)情况下。无论如何,我会用String代替,并在代码中的其他地方创建URL(try-catch似乎更适合我)。非常感谢。 – OppfinnarJocke 2012-01-07 18:28:43