随笔分类 - Effective Java
摘要:当API的设计者声明一个方法将抛出某个异常的时候,他们等于正在试图说明某些事情。请不要忽略它们。要忽略一个异常非常容易, 只需将方法调用通过try语句包围起来,并包含一个空的catch块。 try { …… }catch(SomeException e) { } 空的catch块会使异常达不到应有的目的。至少catch块应该包含一条说明,解释为什么可以忽略这个异常。 对于未受检异常...
阅读全文
摘要:当对某个对象操作时抛出异常之后,通常我们期望这个对象仍然保持在一种定义良好的可用状态之中。因为调用者对象期望能从这种 异常中进行恢复。一般而言,失败的对象操作方法应该使对象保持在被操作之前的状态。具有这种属性的方法称为具有失败原子性。
阅读全文
摘要:当程序由于未被捕获的异常而失败时,系统会自动打印该异常的堆栈轨迹,也就是异常对象的printStackTrace()方法的输出结果。 printStackTrace()方法,输出的第一行包含此对象的 toString() 方法的结果。剩余行表示以前由方法 fillInStackTrace() 记录的数据。 toString()方法是该异常的字符串表示法,fillInStackTrace() 方法输...
阅读全文
摘要:花点时间仔细为每个方法抛出的异常建立文档是特别重要的。 始终要单独的声明受检的异常,并且利用Javadoc的@throws标记,准确的记录下抛出每个异常的条件。 如果一个方法可能抛出多个受检异常,则不要使用“快捷方式”声明这个方法会抛出这些异常类的超类,如永远不要声明一个方法“throws Exception”, 或者更糟糕的是声明这个方法“throws Throwable”。因为这样的声明不仅没...
阅读全文
摘要:想想这样一种情况:方法B抛出了一个受检的异常 ,那么方法A在内部调用方法B时,面对方法B抛出的受检异常,可以选择继续抛出向上传播这个异常, 也可以捕获这个异常进行处理。究竟是向上传播抛出,还是捕获处理呢??? 有一个指导原则是:抛出与抽象想对应的异常。 例如如果方法B抛出了NoSuchElementException这个受检异常,然而在方法A中调用方法B时,根据方法A中的逻辑,当遇到NoSuchE...
阅读全文
摘要:专家级程序员与缺乏经验的程序员的一个最主要的区别在于,专家追求并且通常也能够实现高度的代码重用。代码重用是值得提倡的。 这是一条通用的规则,异常也不例外。Java平台类库提供了一组基本的未受检的异常,它们满足了绝大多数API的异常抛出需要。 最经常被重用的异常时 IllegalArgumentException。当调用者传递的参数值不合适的时候,往往就会抛出这个异常。例如,假设 一个参数代表了“某...
阅读全文
摘要:受检的异常是Java程序设计语言的一项很好的特性。与使用return返回代码不同,它们强迫程序员处理异常,大大增强了可靠性。 但是如果过分的使用受检的异常会使API使用起来非常不方便。如果方法抛出一个或者多个受检的异常,调用该方法的代码就必须在一个或者多个catch块中 处理这些异常,或者它必须声明它抛出这些异常,并将它们传播出去。
阅读全文
摘要:Java程序设计语言提供了三种可抛出结构(throwable):受检的异常(checked exception),运行时异常(run-time exception)和错误(error)。 关于什么时候适合使用哪种可抛出结构,程序员中存在一些困惑。虽然这项决定并不总是那么清晰,但是还是有一般性的原则提出了强有力的指导。 在决定使用受检的异常或者未受检的异常时,主要的原则是:如果期望调用者能够适当地恢...
阅读全文
摘要:异常应该只用于异常的情况下;它们永远不应该用于正常的控制流。
阅读全文
摘要:Java平台建立了一套很好的命名惯例(naming convention),其中有许多命名惯例包含在《The Java Language Specification》中。 不严格的讲,这些命名惯例分为两大类:字面的和语法的。 字面的命名惯例比较少,但也涉及包,类,方法,域和类型变量。 包的名称应该是层次状的,用“.”分割每个部分。任何将在你的组织之外使用的包,其名称都应该以你的组织的Inter...
阅读全文
摘要:记住两条规则: 1.不要进行优化。 2.还是不要进行优化。 要努力编写好的程序,而不是快的程序。
阅读全文
摘要:Java Native Interface(JNI)允许java应用程序可以调用本地方法(native method),所谓本地方法是指本地程序设计语言(比如C或者C++)来 编写的特殊方法。本地方法可以在本地语言中执行任意的计算任务,并将结果返回到Java程序设计语言中。 从历史上来看,本地方法主要有三种用途: 1.它们提供了“访问特定于平台的机制”的能力,比如访问注册表,文件锁。 2.它们还提...
阅读全文
摘要:核心反射机制 java.lang.reflect,提供了“通过程序来访问关于已装载的类的信息”的能力。 给定一个类的Class实例,你可以获得这个类的Constructor的实例(类型为Constructor),Method的实例(类型为Method),Field的实例(类型为Field) ,分别代表了Class实例所代表类的Constructor(构造器),Method(方法)和Field(域)...
阅读全文
摘要:第四十条中有一个建议:应该使用接口而不是类作为参数的类型。更一般的地讲,应该优先使用接口而不是具体实现类来引用对象。 如果有合适的接口类型存在,那么对于参数,返回值,变量和域来说,就都应该使用接口类型进行声明。 如果你养成了使用接口作为类型的习惯,你的程序将会更加灵活。 如声明变量像这样: List list = new Vector(); 而不是这样 Vector list = new Ve...
阅读全文
摘要:字符串连接操作符(+)是把多个字符串合并为一个字符串的便利途径。 但是为了连接n个字符串而反复的使用字符串连接操作符,这对性能的影响是十分大的。因为String类是不可变的类, 两个字符串使用+来连接在一起时,它们的内容都要被拷贝。 为了获得可以接受的性能,请使用StringBuilder来代替String 。(Java 1.5中新增了StringBuilder来代替过时的StringBuff...
阅读全文
摘要:让一个float或者double精确的表示0.1或者10的任何负数次方值都是不可能。float和double它们执行二进制浮点运算, 它们是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的,所以它们并没哟提供完全精确的结果。 在涉及到精确计算时 使用BigDecimal ,int ,long。
阅读全文
摘要:for(Elements e : list) { //doSomeThing…… }
阅读全文
摘要:每个程序员都应该熟悉java.lang包 , java.util包,某种程度上还有java.io包中的内容。关于其他类库的知识可以 根据需要随时学习。 java.util.concurrent包中的关于并发的类,也应该是每个程序员基本工具箱中的一部分。 不要重复发明轮子。如果你要做的事情看起来是十分常见的,有可能类库中已经有某个类完成了这样的工作。如果 确实是有这样的类和方法,就使用现成的;...
阅读全文
摘要:将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性。 要使局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方声明。 如果过早的对变量进行声明,首先会造成混乱,对于试图理解程序功能的读者来说,这又多了一种只会分散他们注意力的因素。等到 用该变量的时候,读者可能已经记不起该变量的类型或者初始值了。其次,过早的声明局部变量不仅会使它的作用域过早的扩展,而且 结束得也过...
阅读全文
摘要:简而言之,要为API编写文档,文档注释是最好,最有效的途径。对于所有可导出的API元素来说,使用文档注释应该被看作是强制性的。要 采用一致的风格来遵循标准的约定。记住,在文档注释内部出现任何的HTML标签都是允许的,但是HTML元字符必须要经过转义。
阅读全文