`
TonyLian
  • 浏览: 396607 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【第44条】每个方法抛出的异常都要有文档

阅读更多

    虽然在【第40条】中说到了,Java的throws语法的一大好处是,即使没有文档也可以知道要调用的方法都会抛出哪些异常。但是,绝对不推荐你这么做。一定要写好文档。

 

    通过@throws标签,逐个地声明每一个被检查的异常,并写清每一个异常被抛出的条件(这个是通过throws语句所了解不到的)。如果一个方法可能抛出多个异常,不要用它们共通的父类异常来表示。甚至,有人连会抛出哪些异常都不关,就干脆 throws Exception (更有甚者 throws Throwable)。这种极端的做法,可能是初学者偷懒的做法,也可能是习惯了.Net,对Java的checkedException深恶痛绝的程序员。但无论如何,不要这么做

 

    这个恶习既不能让调用者知道此方法都会抛出哪些异常,也就更无法分别俘获这些异常,并根据不同状况做出不同的处理。但总有人会说,我并不关心哪里出了什么错,只要有错误,我的处理方式都是一样的:写日志,然后Down掉。面对这样的说辞我真的无言以对。碰巧,前些日我就碰到了这么一个项目组(我是这个项目的QA),还好(其实也没好到哪儿去)用的是.Net。

 

    对于RuntimeException,这就要有些“艺术”了。首先,throws声明中是不该包含它们的。其次,在文档的@throws标签中应该写出它们,并写好抛出条件。这对于写此方法的程序员来说又提高了要求,哪些RuntimeException可能出现,也不是可以“莫不关系”的了。这时候,你可能真的要让这该死的异常折磨得崩溃了,这不是“即想做婊子又要立牌坊”吗?天哪,请宽恕这些Java程序员吧。我也有些对.Net的做法感到理解了。

 

    对文档的要求,总是没有最好、只有更好。但最后,有一个让步:如果一个类中的许多方法都因相同的原因而抛出同样的异常,那么可以让步为在这个类的注释处写明文档,而不必每个方法都单独写。(其实Ctrl-C一下也并不难,啊)

 

 

 

【Effective Java 学习笔记】系列连载专题请见:
http://tonylian.iteye.com/categories/64208

 

分享到:
评论

相关推荐

    超级有影响力霸气的Java面试题大全文档

    java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 9、说出Servlet的生命周期,并说出Servlet和CGI的区别。  Servlet被服务器实例化后,容器运行其init方法...

    Java面试宝典2010版

    在try块中可以抛出异常吗? 46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 47、sleep() 和 wait() 有什么区别? 48、同步和异步有何异同,在什么情况...

    最新Java面试宝典pdf版

    在try块中可以抛出异常吗? 29 46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在...

    JAVA面试题最全集

    如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize?方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的...

    Java面试笔试资料大全

    在try块中可以抛出异常吗? 29 46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在...

    java 面试题 总结

    java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 6、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,...

    Java面试宝典-经典

    在try块中可以抛出异常吗? 29 46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在...

    JAVA面试宝典2010

    在try块中可以抛出异常吗? 29 46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在...

    java面试题大全(2012版)

    在try块中可以抛出异常吗? 29 46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在...

    Java面试宝典2012版

    在try块中可以抛出异常吗? 29 二. Jav线程部分 7 46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、...

    Java面试宝典2012新版

    在try块中可以抛出异常吗? 29 二. Jav线程部分 7 46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和...

    java面试宝典2012

    在try块中可以抛出异常吗? 32 46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 32 47、sleep() 和 wait() 有什么区别? 33 48、同步和异步有何异同,在...

    C#微软培训资料

    第十四章 继 承 .155 14.1 C#的继承机制.155 <<page 3>> page begin==================== 14.2 多 态 性 .159 14.3 抽象与密封 .163 14.4 继承中关于属性的一些问题.169 14.5 小 结 .172 第四部分 ...

    JAVA上百实例源码以及开源项目源代码

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    JAVA上百实例源码以及开源项目

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例170 方法中抛出异常 218 实例171 方法上抛出异常 219 实例172 自定义异常类 220 实例173 捕获单个异常 221 实例174 捕获多个异常 222 第8章 枚举与泛型的应用 223 8.1 枚举使用的简介 224 实例175 查看枚举类型...

Global site tag (gtag.js) - Google Analytics