2016-04-14 117 views
0

我有两个不同的类共享一个共同类型的属性(IpAddress,其中也包含有关该子网的所有信息)。现在,IpAddress是一个用户定义类型,我有一个函数setSecondaryRouter(),它可以改变这种类型的属性。为了让程序按预期运行,我需要一个不变量(或者2个不变量)。这在功能setSecondaryRouter()中检查。但是,我想将此属性secondaryRouter设置为与第一个对象相同。这种暗示不变已经在我第二次使用setSecondaryRouter()。由于这个原因,我知道这个函数不会抛出。我可以防止java抛出某些异常吗?

问题是我的编译器“帮助”确保没有未编译的未捕获的异常,除非添加try-catch子句或添加一个throws声明调用者函数(从而帮助解决一个不存在的问题)。我想要做的是告诉Java,这个异常不会被抛出。将此与C++中的nothrow关键字进行比较。我知道类似的问题都已经发布,像下面

Is there any standard annotation to indicate nothrow semantics in Java?

但我的问题的不同点在于,我不希望添加一抛,或尝试-catch子句,而我知道会不会被抛出特定的异常!

另外一个表达式是IllegalArgumentException。这个例外可以成为我必须处理例外的原因吗?

+1

使它们检查异常。然后,它没有被方法抛出的事实意味着它不会被方法抛出。 –

+0

@AndyTurner所以即使我知道运行时异常将不得不处理它? – patrik

+0

没有。您不必处理未检查的异常;你不能保证他们不会被抛出。 –

回答

2

必须区分checked and unchecked exceptions之间绘制来回答这个问题:

  • 如果方法不声明它抛出检查异常,不能抛出类型的异常(或之一其亚型):

    void doSomething() { 
        throw new Exception(); // Illegal, without throws Exception on doSomething(); 
    } 
    

    这样,你知道,检查异常不是由一个方法抛出如果没有宣布它扔那EXCE ption。

    检查异常意图被捕获,因为它们是假定指示您可以恢复的条件,因此您需要知道它们发生了。例如IOException:如果稍后再试,文件可能存在,磁盘上可能有空间,网络可能会备份(等)。

  • 一个方法可以抛出一个未经检查的异常而不会声明它的确如此;但同样,如果你不想要(例如因为你知道它不可能被抛出),你不需要做任何工作来捕捉它。因此,永远不能保证某个特定的RuntimeException不是通过某种方法抛出 - 也许它不是通过您调用的方法直接抛出,而是可能由调用的方法抛出(现在或将来的实现) 。

    未经检查的异常并非真正意图被捕获,因为它们是假定为以指示不可恢复的错误,如编程错误。例如NullPointerException:您可以使用相同的参数调用相同的方法,但它仍然会失败,因为您运行的是相同的代码。

+0

啊,好吧,我看,它是另一个检查异常(未提及,称为“InternalException”,它意味着什么是无关的),这会导致麻烦。所以你的意思是说,没有办法告诉java来__not处理一个检查的异常,因为我知道这是之前处理的?回答,我会接受(这意味着我将支付我不使用的东西......)。 – patrik

+0

这是正确的。你总是必须通过捕获或传播检查异常。 –

1

java.lang.IllegalArgumentException是运行时异常,所以编译器不考虑它。

如果第一次使用setSecondaryRouter()时可能引发异常,则必须声明它。

也许你可以声明一个新方法cloneFirstRouterToSecondRouter,像下面这样,捕捉你的异常。

public void cloneFirstRouterToSecondRouter(){ 
     try{ 
     setSecondaryRouter(); 
     catch(Exception e){ 
     // should never occur 
     } 
    } 
+0

请注意,对于“永远不应该发生”的情况,代码路径应该始终做某些事情,以防万一。 '抛出新的AssertionError(e);',所以你知道[他们在实践中怎么“永远不会发生”)(https://en.wikipedia.org/wiki/Murphy%27s_law)。 –

+0

:(好吧,我看,这很烦人,我猜在Java中不存在“这是你自己的错误”,即使我们知道“错误的事情永远不会发生”,大哥哥oracle会强制我们做正确的事情,从而强制执行处罚。无论如何感谢您的建议 – patrik