我有来自两个不同类的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。这个例外可以成为我必须处理异常的原因吗?
答案 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
。这不仅是理论上的问题:如果垃圾回收线程花费的时间太长,一些并发的垃圾回收器会这样做。