Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么OSGI BundleActivator方法声明为;抛出异常“;?_Java_Exception_Osgi_Throws - Fatal编程技术网

Java 为什么OSGI BundleActivator方法声明为;抛出异常“;?

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

OSGI的
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框架将处理它

请注意,您永远不需要自己调用这些方法