Java 抛出私有异常有意义吗?

Java 抛出私有异常有意义吗?,java,exception,visibility,runtime-error,invariants,Java,Exception,Visibility,Runtime Error,Invariants,我想抛出一个运行时异常,以防我的类不变量无效。因为这是一个编程错误(类似于NullPointerException),所以客户端不应该捕获该异常 异常类应该声明为private还是public(或其他什么) P>是否有关于自定义运行时异常和可见性的指南?< P>您可以考虑使用现有的异常,除非您期望以不同的方式捕获此异常。如果不希望捕获,我认为不需要自定义异常。有些例外情况可以重复使用 -对我来说,这意味着存在不确定类型的不可恢复编程错误 -对我来说,这意味着只有方法的参数无效 -对我来说,这

我想抛出一个运行时异常,以防我的类不变量无效。因为这是一个编程错误(类似于NullPointerException),所以客户端不应该捕获该异常

异常类应该声明为private还是public(或其他什么)


<> P>是否有关于自定义运行时异常和可见性的指南?

< P>您可以考虑使用现有的异常,除非您期望以不同的方式捕获此异常。如果不希望捕获,我认为不需要自定义异常。有些例外情况可以重复使用

  • -对我来说,这意味着存在不确定类型的不可恢复编程错误
  • -对我来说,这意味着只有方法的参数无效
  • -对我来说,这意味着对象的状态(例如值的组合)对此操作无效

如果您想要自定义异常,您可以考虑扩展这些异常,或者使用扩展这些异常的异常之一。

< P>我相信,为了<代码>抛出< /代码>任何东西,该对象必须实现<代码>可抛出的接口,这意味着它必须是<代码>错误< /代码>或<代码>异常< /代码>。由于您不希望您的客户机捕捉到该事件,因此您可能应该使用
错误。从:

错误是Throwable的一个子类 这表明严重的问题 合理应用不应尝试 抓住


这样,您就可以避免一些程序员倾向于使用的可怕的
异常
捕获所有错误-大多数时候,这些程序员根本不考虑捕获
错误

我不会手动抛出断言错误,但是使用断言检查不变量是一件好事。
assert
需要打开才能正常工作。您可能希望这种检查一直都在进行。事实上,我考虑过
IllegalStateException
,但它的文档中说“表示在非法或不适当的时间调用了某个方法”。事实并非如此。请看一下IllegalBlockingModeException、IllegalComponentStateException、,InvalidMarkException,它扩展了IllegalStateException。这表示对象处于非法状态,无法使用。我想这可能包括一个
validate()
方法。我建议一个断言错误适用于编程错误。这就是为什么我们在应用程序中使用
Throwable
catch all;-)
class Foo
{
    // ...

    private static class InvariantsViolated
    {
        // ...
    }
}