netbeans使用教程_NetBeans 7.4 Beta提示警告无效的异常处理

netbeans使用教程

netbeans使用教程

有许多例子说明Java异常处理可能比首次出现时要困难得多,Josh Bloch专门将一整章的《 Effective Java》 (两个版本)专门用于异常处理。 Java中的检查异常模型仍然有争议” 。 我很高兴看到我最近下载的NetBeans 7.4 beta有一些提示,至少可以帮助您处理Java异常处理的一些细微差别。

我最近下载了NetBeans 7.4 Beta,并在笔记本电脑上安装了此最新版本的NetBeans 。 我下载了“所有”的NetBeans IDE下载捆绑包(包括GlassFish Server开源版4.0Apache Tomcat 7.0.41Groovy支持)并将其安装在我的机器上。

NetBeans的“当前开发版本”中“可能的错误”类别中的两个新提示是“'最终'块抑制异常”和“'抛出'在'最终'块中”。 在此博客文章中,我将演示这些提示,并简要讨论为什么这些提示有助于改善异常处理。

'finally'块抑制异常

正如James Stauffer的不要在finally子句中返回”之类的帖子中所记录的,以及Java的try-finally返回设计问题之类的论坛中所记录的那样,通常都认为从finally块中返回方法是一个坏主意。 接下来显示这种不良Java编码实践的示例。

最终阻止异常的示例
private void throwException() throws Exception
{
   throw new Exception("A checked exception!");
}

/**
 * Demonstrate NetBeans hint "The 'return' statement in the 'finally' block
 * discards unhandled exceptions" by returning a value from the "finally"
 * block.
 * 
 * @return Integer value that is really meaningless in this case.
 * @throws RuntimeException This exception is always thrown.
 */
public int demonstrateReturnFromFinallyBlock()
{
   int value = 5;
   try
   {
      value = 7;
      throwException();
   }
   catch (Exception exception)
   {
      throw new RuntimeException(exception);
   }
   finally
   {
      return value;
   }
}

当执行上述代码片段中的方法demonstrateReturnFromFinallyBlock()时,输出如下所示:

返回值:7

尽管可能有人期望demonstrateReturnFromFinallyBlock()方法抛出运行时异常,而不是返回7的整数值(因为该方法的Javadoc甚至做了广告!),但实际上,“始终抛出”的异常会被丢弃,因为finally挡住了。 这是一个潜在的令人讨厌的问题,可能仅在运行时而不是在编译时才明显。 幸运的是,NetBeans 7.4 beta包含有关此潜在问题的提示,如以下屏幕快照所示:

演示ReturnFromFinallyExample

上面的屏幕快照展示了NetBeans 7.4 beta通过在黄色块中加下划线来警告finally块中的return语句的情况。 它还显示,当将鼠标悬停在带有黄色下划线的代码上时,NetBeans编辑器将提示“ finally”块中的“ return”语句将丢弃未处理的异常。”

通过将-Xlint:finally传递给javac编译器,也可以找到相同的条件。 显然,这可以在命令行上完成,就像我以前在javac的-Xlint Options中javac.compilerargs=-Xlint:finally的一样,但是下一个屏幕快照显示了通过-Xlint:finally规范在NetBeans中所做的相同操作-Xlint:finally通过project.properties设置javac.compilerargs=-Xlint:finally

xlintFinallyWarningForReturnFromFinally

在“最终”块内“抛出”

finally块内部引发异常通常是一个坏主意,因为它将隐藏在该finally块的关联try块中引发的任何异常。 下一个代码清单显示了这种错误形式的示例。

/**
 * Demonstrate NetBeans hint warning that throwing an exception from a
 * 'finally' block is a bad idea because it hides the original exception.
 */
public void demonstrateThrowFromFinallyBlock()
{
   Integer twoDividedByZero = null;
   try
   {
      twoDividedByZero = 2 / 0;
   }
   finally
   {
      if (twoDividedByZero == null)
      {
         throw new RuntimeException("Cannot calculate quotient with division.");
      }
   }
}

有人可能会认为执行上述方法会导致引发ArithmeticException异常,而当引发更一般的(和父项) RuntimeException异常时,可能会感到有些惊讶。

下一个屏幕快照显示此情况的NetBeans 7.4 beta警告。

describeThrowFromFinallyHint

将鼠标悬停在带有黄色下划线的代码上会导致显示NetBeans警告:“'finally'块中的'throw'语句可能会隐藏原始异常。” 上面的屏幕快照显示,这正是在这种情况下发生的情况: ArithmeticException及其堆栈跟踪被finally块抛出的RuntimeException隐藏了。

如果我注释掉从finally块引发异常的行,则原始异常将再次可用。 下一个屏幕快照对此进行了演示。

describeThrowFromFinallyHintGone

即使启用-Xlint:all (或仅启用-Xlint )也不会警告从finally块引发异常的不良形式。 在这个特定的示例中, -Xlint:devzero (或-Xlint:all-Xlint )将显示代码中被零除,但是通常没有-Xlint警告让javac从您抛出时警告您finally块隐藏了原始异常。 这使该特定的NetBeans提示特别有用。

结论

Java异常处理中有许多细微差别和特殊情况。 NetBeans 7.4 Beta引入了两个新的“可能的错误”提示,警告与异常相关的finally块中的危险做法。 这两种情况特别隐蔽,因为它们通常不会被编译器捕获(尽管可以选择将其作为警告捕获),直到运行时才被发现,并且不太可能通过阅读和查看代码来发现。

翻译自: https://www.javacodegeeks.com/2013/09/netbeans-7-4-beta-hints-warn-of-ineffective-exception-handling.html

netbeans使用教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值