虽然在【第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
分享到:
相关推荐
- **Empty/Never/Throw**:分别用于创建一个不发送任何数据项的Observable、永远不会完成的Observable和立即抛出异常的Observable。 - **From**:从集合、数组或其他可迭代对象创建Observable。 - **Interval**:...
java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 9、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法...
- **实例变量**:每个对象都有自己的副本,互不影响。 #### 13. static方法调用非static方法 - 不可以直接调用非静态方法。因为非静态方法依赖于特定对象的存在,而静态方法在对象不存在的情况下就可以被调用。 ##...
- `throws`:用于声明方法可能抛出的异常。 - `throw`:用于抛出异常。 - `try`:尝试执行的代码块。 - `catch`:捕获并处理异常。 - `finally`:无论是否发生异常都会执行。 - 在`try`块中可以使用`throw`抛出异常...
44. 集合的通用方法有那些?通用方法是什么?(操作) 集合框架的通用方法包括add, remove, contains, size, isEmpty, iterator等,它们是Collection接口中定义的,这些方法在List, Set和Queue等子接口中都有实现。 45....
默认构造方法必须有一个默认的异常抛出说明** - 这有助于在没有提供额外信息的情况下也能了解异常的基本情况。 #### 四、Spring使用约定 **1. 业务逻辑Bean配置** - 所有业务逻辑Bean都配置在相关的`...
Java异常处理机制中,throws用于方法声明抛出异常,throw用于主动抛出一个异常实例。try块包含可能会抛出异常的代码,catch块用来捕获异常,finally块包含无论是否发生异常都需要执行的代码。在try块中是可以抛出...
6. **异常处理**:第九章可能讲解Java的异常处理机制,包括try-catch-finally语句块,自定义异常,以及如何有效地抛出和捕获异常。 7. **输入/输出流**:第十章可能涉及I/O流,如文件读写、数据流、对象序列化和...
45. Java通过throws关键字在方法签名中声明可能抛出的异常,throw关键字用来抛出异常对象。try块用于包含可能抛出异常的代码,catch块用于捕获和处理异常,finally块无论是否捕获到异常都会执行。 46. Java中有两种...
1. **异常处理**:使用try-catch块来处理可能抛出的异常。 - **示例**: ```java try { // 可能抛出异常的代码 } catch (Exception e) { // 处理异常 } ``` 2. **资源管理**:使用try-with-resources语句...
3. **抛出异常**:在Java中,可以通过`throw`关键字手动抛出异常,也可以使用`throws`关键字声明方法可能抛出的异常。 #### 十七、包及访问权限 1. **包的概念及使用**:包是用来组织类的一种机制,它可以避免类名...
在Java中,如果对象为null,调用其方法会抛出NullPointerException。题目中的line 2和line 5的条件判断中,str.length()在str为null时会被执行,可能导致异常。正确答案是B和C。 - 第二题考察Javadoc注释。Javadoc...
- **Teardown/Cleanup(清理):** 每个fixture都可以有一个清理函数,在测试完成后执行。 - **安全清理:** pytest允许用户指定安全清理,以确保即使发生异常也能正确清理。 - **fixtures的可用性:** 了解fixtures...
- 实例变量(非静态变量)每个对象都有自己的副本。 **13. 是否可以从一个 static 方法内部发出对非 static 方法的调用?** 不可以。`static` 方法无法直接访问非 `static` 成员,因为非 `static` 成员依赖于具体...
实例变量(instance variable)属于对象级别的,每个对象都有自己的实例变量副本。 ### 13. 是否可以从一个static方法内部发出对非static方法的调用? 不可以。`static`方法无法直接访问非`static`方法,因为非`...
**题目**: 每个Java应用程序可以包括许多方法,但必须有且只能有一个(main)方法。 **答案解析**: `main`方法是Java应用程序的入口点,它必须定义在某个类中,并遵循以下格式: ```java public class MyClass { ...
`<c:catch>`用于捕获在标签体内部可能抛出的异常。 **第五节:用于判断的标签** `<c:if>`用于执行条件判断,只有当条件为真时,标签体内的内容才会被处理。 **第六节:用于复杂判断的、、标签** `<c:choose>`、`...
在try块中可以抛出异常吗? 29 46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在...
Java的异常处理机制基于`Throwable`类,使用`try-catch-finally`结构捕获和处理异常,通过`throws`声明抛出异常,`throw`语句抛出异常对象。 #### 44\. 常见的`RuntimeException` 常见的`RuntimeException`包括`...
`try`块中可以抛出异常,`catch`块用于捕获异常,`finally`块用于执行清理操作,`throws`用于声明抛出的异常,`throw`用于手动抛出异常。 ### 46. 实现线程方式 在Java中,实现线程有两种方式:通过继承`Thread`类...