我可以阻止java抛出某些异常吗?

时间:2016-04-14 15:52:49

标签: java exception

我有来自两个不同类的2个对象,它们共享一个共同类型的属性(IpAddress,其中包含有关子网的所有信息)。现在,IpAddress是用户定义类型,我有一个函数setSecondaryRouter(),它可以改变这种类型的属性。为了使程序按预期运行,我需要一个不变的(或2个不变量)来保持。这在功能setSecondaryRouter()中进行了检查。但是,我想将此属性secondaryRouter设置为与第一个对象在第二个对象中相同。这种意味着第一次使用setSecondaryRouter()时,不变量已经存在。由于这个原因,我知道该函数不会抛出。

问题是我的编译器"帮助"除非我添加一个try-catch子句或添加一个throws声明调用函数(因此有助于解决一个不存在的问题),以确保我没有未编译的未编译异常。我想要做的是告诉Java不会抛出此异常。将其与c ++中的nothrow关键字进行比较。我知道已经发布了类似的问题,如下面的

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

但我的问题不同之处在于我不想将throw或try-catch子句添加到我知道不会抛出的特定异常中!

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

3 个答案:

答案 0 :(得分:2)

必须区分checked and unchecked exceptions才能回答这个问题:

  • 如果某个方法没有声明它会抛出一个已检查的异常,就不能抛出该类型的异常(或其子类型之一):

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

    因此,如果未声明抛出该异常,您知道方法不会抛出检查异常

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

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

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

答案 1 :(得分:1)

java.lang.IllegalArgumentException是运行时异常,因此编译器不会考虑它。

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

也许您可以声明一个新方法cloneFirstRouterToSecondRouter,类似于关注,捕捉您的例外。

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

答案 2 :(得分:0)

不可能阻止方法引发异常。这是因为JVM可能导致方法throw a VirtualMachineError at anytime。特别是,即使方法本身不直接或间接分配内存(使用OutOfMemoryError运算符),方法也可能抛出new 。这不仅是理论上的问题:如果垃圾回收线程花费的时间太长,一些并发的垃圾回收器会这样做。