gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:39:25 27 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

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

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

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

    受检查的异常旨在被捕获,因为它们应该指示您可以从中恢复的情况,因此您需要知道它们发生了。例如IOException:如果稍后重试,文件可能存在,磁盘可能有空间,网络可能已备份(等等)。

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

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

关于java - 我可以阻止java抛出某些异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36628113/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com