1

有一个类 X。X 类method()中的一个方法 throws SomeException

我想知道哪种处理异常的方法更好——更有效。如果它是围绕try-block方法抛出异常和所有依赖关系或将依赖关系保持在try-block之外,但在失败后从方法返回。

1.

public void test() {
     X x = new X();

     try {
          T temp = tx.method();
          temp.doWhatever();
     }

     catch(SomeException e) { handleException(e); }
}

或者

2.

public void test() {
     X x = new X();
     T temp = null;
     try {
          temp = tx.method();
     }

     catch(SomeException e) { 
          handleException(e);
          return;
     }

     temp.doWhatever();
}

编辑:(在您的注释之后)

更重要的是,我这样理解我的代码:

1. tx.method()会抛出一个异常,所以接下来要执行的是catch- 阻塞。temp仍然没有关系,null因为程序跳过了temp.doWhatever();行并且不会有NullPointerException.

2.这里我使用return指令是因为我不想执行temp.doWhatever()因为tempnull

4

6 回答 6

1

只有第一个是可能的,因为 temp 是在内部声明的。

我个人选择第一个,否则需要在尝试之前声明:T temp = null。


问题更正后:

专业优先

第一个代码的跳转指令较少,变量temp更局部,并且没有空初始化。

此外,编码风格更紧凑,没有空初始化,可能是错误点。

此外,应将例外情况排除在外;更容易阅读第一个版本。异常不应中断线性编码和读取过程。

临二

更清楚异常可能源于何处。

于 2012-07-12T17:31:54.113 回答
1

异常工作方式的关键点之一是您可以使用您的风格编号 1:让代码块安心地执行,无论它在哪里中断,流程都会被中断并处理错误。所以我总是建议第一种风格。

于 2012-07-12T17:34:16.230 回答
0

第二种情况甚至不会编译(甚至没有意义),因为在块temp之外是不可见的。try无论如何,我会这样做:

public void test() {
     X x = new X();

     try {
          T temp = tx.method();
          temp.doWhatever();
     }

     catch(SomeException e) { handleException(e); }
}

由于如果初始化失败,则不应执行temp其余操作。temp

于 2012-07-12T17:32:01.353 回答
0

在一个方法中有多个返回是不好的。但这只是为了有可理解的代码。您可以使用布尔值和 if 来避免返回。

我认为没有效率问题。如果第一个语句发生异常,则不执行第二个语句。如果没有例外,那么......嗯......我认为第二种方法应该没有开销。您可以通过 try catch 告诉您“汇编程序”代码的外观:D

在我看来,编写无法理解的代码更为重要。现在的编译器非常好,并且优化了大多数东西。

于 2012-07-12T17:42:52.320 回答
0

出于可扩展性的原因,选项二不好。假设后来有人决定 test() 应该在 test.doWhatever() 之后做某事,即使遇到异常情况也是如此。届时他们将不得不将代码重构为选项一。由于从一开始就使用选项一是没有成本的,因此他们没有理由必须这样做。

Further, the design principle of the try/catch block is violated by returning from the catch block, even though the compiler will still accept it. For the catch to be a return point, it should be throwing an exception, since the action is invoked because of an exceptional case.

于 2012-07-12T18:33:09.303 回答
-1

我看不出这两种方法有什么区别。

于 2012-07-12T17:29:43.680 回答