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

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

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甚至做广告!),但实际上由于“ return”语句中的return语句,实际上丢弃了“始终抛出”异常。 finally挡住了。 这是一个潜在的令人讨厌的问题,可能仅在运行时而不是在编译时才明显。 幸运的是,NetBeans 7.4 beta包含有关此潜在问题的提示,如以下屏幕快照所示:

上面的屏幕快照演示了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

在“最终”块内“抛出”

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警告。

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

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

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

结论

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

参考: NetBeans 7.4 Beta提示警告我们的JCG合作伙伴 Dustin Marx在Inacted by Actual Events博客上进行了无效的异常处理 。

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

NetBeans 7.4 Beta提示警告无效的异常处理相关推荐

  1. netbeans7.4_NetBeans 7.4 Beta提示警告无效的异常处理

    netbeans7.4 有许多例子说明Java异常处理可能比首次出现时要困难得多,Josh Bloch专门将一整章的< Effective Java> (两个版本)专门用于异常处理. Ja ...

  2. netbeans7.4_使用NetBeans 7.4 beta提示进行更好的基于JUnit的单元测试

    netbeans7.4 在上一篇文章中 ,我写了NetBeans 7.4 beta中提供的提示 ,这些提示提高了开发人员避免Java异常处理带来的讨厌的运行时问题的能力. 在本文中,我将探讨如何使用N ...

  3. 使用NetBeans 7.4 beta提示进行更好的基于JUnit的单元测试

    在上一篇文章中 ,我写了NetBeans 7.4 beta中提供的提示 ,这些提示提高了开发人员避免Java异常处理带来的讨厌的运行时问题的能力. 在本文中,我将研究如何使用NetBeans 7.4 ...

  4. c语言启动程序句柄无效,电脑中玩英雄联盟提示“句柄无效”是怎么回事

    电脑中玩英雄联盟提示"句柄无效"是怎么回事?一位用户反馈自己在玩英雄联盟游戏时,突然遇到警告音提示,将游戏进行最小化后,看到桌面上不停的出现提示"句柄无效",感 ...

  5. NetBeans 7.2 beta:更快,更有用

    NetBeans 7.2的beta版本引起了极大的兴奋. 在本文中,我将简要介绍一下此版本令人兴奋的原因(包括更好的性能,提供更多的提示以及集成FindBugs). NetBeans 7.2 beta ...

  6. requests库提示警告:InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate ver

    相信你们肯定遇到过这样的问题: requests库提示警告:InsecureRequestWarning: Unverified HTTPS request is being made. Adding ...

  7. python messagebox弹窗退出_python 弹窗提示警告框MessageBox的实例

    需要安装pywin32模块,pip install pywin32 ##pip install pywin32 import win32api,win32con ##提醒OK消息框 win32api. ...

  8. XP的用户账户使用了HTML界面,XP系统点击用户账户显示参数无效怎么办?WinXp下点击用户账户提示参数无效解决方案...

    XP系统开机后,我们通常需要点击用户账户,然后输入账号密码后才能真正进入系统.不过,最近却有一些 原因分析: WinXP用户帐户的主界面是一个基于HTML界面的程序,例如"用户帐户" ...

  9. python requests 提示警告 InsecureRequestWarning

    在Python3中使用以下代码报错: import requestsresponse = requests.get(url='', verify=False) 错误代码如下: InsecureRequ ...

最新文章

  1. 使用OpenVINO加速Pytorch表情识别模型
  2. 大数据可视化模板_最佳大数据可视化技术
  3. 解决Windows7 Embedded连接手机问题
  4. 关于汽车领域的知识图谱实战入门
  5. Palindromic Numbers LightOJ - 1205 数位dp 求回文数
  6. 标签插入两一个html,一个类下有很多a标签,给第二个a标签添加样式,怎么写才能不用再给第二个a添加类_html/css_WEB-ITnose...
  7. TCP之Nagle算法延迟ACK
  8. c语言组成整数的最大数字,c语言 编写程序将一个正整数中的所有偶数数字取出来并用这些数字构成一个最大数。...
  9. 金三银四,那浏览器兼容你知多少?
  10. (转自孟岩的CSDN)理解矩阵
  11. 惠普服务器做虚拟化,节省成本立竿见影 惠普虚拟化技术详解
  12. 鸿蒙 usb调试,usb调试助手
  13. Efficient Low-rank Multimodal Fusion with Modality-Specific Factors 论文
  14. 【Python】使用分隔符拆分字符串
  15. 苏宁易购开放平台_发力内循环,苏宁易购开放平台商品交易规模大增56.83%
  16. 怎样去掉“交互式服务对话框检测”提示对话框
  17. 2020南京大学软件工程考研上岸感想
  18. xray和burp联动
  19. 读《Linking Convolutional Neural Networks with Graph Convolutional Networks: Application in Pulmonary》
  20. 系统巡检指令之db2数据库表空间使用情况检查

热门文章

  1. vo listVO paggerHelper mapper使用原则
  2. java面试设计模式
  3. 基于springboot+vue的前后端分离商城系统
  4. junit 测试执行顺序_JUnit 5中的测试执行顺序
  5. jvm jstat_使用jstat的JVM统计信息
  6. 字节流和字符流哪个不刷新_不喜欢节流吗?
  7. 序列化加密字段_自动加密可序列化的类
  8. 只读副本和Spring Data第1部分:配置数据库
  9. 通过MicroProfile上下文传播增强了CDI上下文和隔板
  10. Java线程的不同状态