Java 为什么OSGI BundleActivator方法声明为;抛出异常“;?
OSGI的Java 为什么OSGI BundleActivator方法声明为;抛出异常“;?,java,exception,osgi,throws,Java,Exception,Osgi,Throws,OSGI的start和stop方法都是通过抛出异常来声明的。同时,Joshua Bloch在他的书《有效Java,第二版,第62项》中说 永远不要声明方法“抛出异常” 那么,在BundleActivator中,这是一个糟糕的设计决策,还是这种通用性在这种情况下是合理的?为什么?请注意,您可以声明您的开始和停止方法,而无需任何抛出子句。(也可以使用任何java.lang.Exception子类声明这些方法。) 另一方面,一个特定的,例如 void start(BundleContext conte
start
和stop
方法都是通过抛出异常来声明的。同时,Joshua Bloch在他的书《有效Java,第二版,第62项》中说
永远不要声明方法“抛出异常”
那么,在BundleActivator
中,这是一个糟糕的设计决策,还是这种通用性在这种情况下是合理的?为什么?请注意,您可以声明您的开始
和停止
方法,而无需任何抛出
子句。(也可以使用任何java.lang.Exception
子类声明这些方法。)
另一方面,一个特定的,例如
void start(BundleContext context) throws BundleActivatorException
方法不会改变太多。它只会让实现者捕获他们的异常,并将其包装在BundleActivatorException
中重新播放。由于每个异常都会使捆绑包激活变得毫无意义,因此这个try-catch
块实际上是不必要的,因此抛出java.lang.exception
更容易,请注意,您可以声明您的start
和stop
方法,而不需要任何throws
子句。(也可以使用任何java.lang.Exception
子类声明这些方法。)
另一方面,一个特定的,例如
void start(BundleContext context) throws BundleActivatorException
方法不会改变太多。它只会让实现者捕获他们的异常,并将其包装在BundleActivatorException
中重新播放。由于每个异常都会使捆绑包激活变得毫无意义,因此该try-catch
块实际上是不必要的,因此从start()
或stop()
方法抛出异常更容易,捆绑包生命周期的改变不应该发生。由于我们将检测情况(通过bundle)和处理情况(通过框架)的关注点分开,因此抛出异常是唯一合理的做法。从start()
或stop()
方法抛出异常表明有严重错误,捆绑包生命周期的改变不应该发生。因为我们把检测情况(由捆)分离出来,并处理它(由框架来处理),抛出<代码>异常< /代码>是唯一合理的事情。 < P>我认为Josh Bloch的建议是错误的。抛出异常
没有问题。它为您提供了抛出任何您喜欢的异常的选项,并且OSGi框架将处理它
请注意,你不需要自己调用这些方法。 < P>我认为Josh Bloch的建议是错误的。抛出异常
没有问题。它为您提供了抛出任何您喜欢的异常的选项,并且OSGi框架将处理它
请注意,您永远不需要自己调用这些方法