绕过Java异常规范...?

5

我想要做什么

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

但是我被告知需要处理 MalformedURLException。规范说明 MalformedURLException 表示 URL 格式错误,要么在规范字符串中找不到合法协议,要么无法解析该字符串。

抛出以指示发生了格式错误的 URL。在规范字符串中找不到合法协议,或者无法解析该字符串。

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

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

2个回答

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);  
     }
 }
如果你需要从几个地方获取这样的东西,你可能应该将它放在一个公用类中。

简单明了。+1 for // 好的,这不应该发生 - Perception

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...
}

是的,谢谢,我知道try-catch的语法和语义,这不是问题。我的问题是,我知道异常永远不会发生,这就是为什么我想避免在源代码中添加不必要的try-catch子句。在C++中,我会简单地忽略异常,编译器也不会打扰我,对吧?在Java中...我真的认为应该有一种方法来说服编译器在这种情况下不强制执行异常规范,即使只是一个编译器指令... - OppfinnarJocke
@OppfinnarJocke 哦,我并不是想冒犯你——只是你可能不了解静态初始化器。不幸的是,在Java中没有办法说“就在这里闭嘴”:如果有这样的功能,异常会比现在更加混乱。问题是,每个功能都与几乎所有其他功能交互。神奇地关闭异常意味着相同的代码可以基于你甚至看不到的东西编译或不编译。 - alf
谢谢 Alf。我没有被冒犯,如果有这种感觉很抱歉...是的,我明白完全关闭异常检查可能会弄乱事情,但编译器指令可以说,“在这里安静”似乎在这些罕见的情况下很有用。无论如何,我将使用String并在代码的其他地方创建URL(在我看来,那里使用try-catch更合适)。非常感谢。 - OppfinnarJocke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接