【JAVA-24】 进行无误差或大数计算时,使用BigDecimal Class【推荐】
说明·原因
浮点数运算是用于科学技术计算的,会发生误差。与此相比,Class“BigDecimal”,是用字符串计算数值的,适合用于金额等的正确的计算。使用BigDecimal,可以保证生成Instance时指定的位数上的精度。
【JAVA-25】 不转成低精度的原语型【注意】
说明·原因
表示数值的原语型的变量中,定义了数值的精度。如果将高精度的变量转换成低精度的型,其值就会变更为转型后的精度。因此,计算中可能会出现误差。
例
double doubleType = 2.75; int intType = (int)doubleType; // 将double转成int型 //错误 |
【JAVA-26】 使用Java2之后的集合类【推荐】
说明·原因
是否使用了Vector Class、Hashtable Class、Enumeration Class?如果没有使用这些的特别理由,那么为了统一Interface,请使用List(ArrayList Class)、Map(HashMap Class)、Iterator来代替这些。通过使用List等的Interface,可以利用JDK1.2中整理的易懂的Method。另外,因Interface的特性,变更实现Class时可以不变更调用方。
例
Vector sampleVector = new Vector(); //错误 List sampleList = new ArrayList(); //正确 |
【JAVA-27】 利用只接受特定型的Object的集合类【推荐】
说明·原因
在集合中只保存某个特定型的Object时,针对只处理特定型Object的集合类,有新定义的方法。比如,自己定义只保存String的集合。
定义这样的集合类的好处如下:
l 不会错误保存不同型的Object,因此不会发生ClassCastException;
l 从集合取出Object时,不用一个一个地转型(也不需要instanceof的Check Logic)。
基于上述原因,可减少发生BUG的可能性,代码也变得简单,进而可提高代码的可读性。
例
下面的Class是只处理String Object的HashMap的例子: public class StringHashMap { private HashMap map = new HashMap(); public void put( String key, String value ){ map.put( key, value ); } public String get( String key ){ return (String)map.get(key); } … } |
【JAVA-28】 利用处理Stream的API时,在finally Block中进行后处理【注意】
说明·原因
为避免内存泄漏,Stream的Close是必须的。即使中途发生了异常,也必须Close,因此请在finally Block中描述close() Method。
例
try { BufferedReader reader = new BufferedReader(new FileReader(file)); reader.read(); reader.close(); // 错误 } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(file)); reader.read(); } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); } catch (IOException ioe1) { ioe1.printStackTrace(); } finally { try{ reader.close(); // 正确 }catch(IOException ioe2){ ioe2.printStackTrace(); } } |
【JAVA-29】 ObjectOutputStream中利用reset()【推荐】
说明·原因
在使用ObjectOutputStream Object的Method中,请适当调用reset()。关于ObjectOutputStream Class,从其功能上来看,它会始终保持对写入的所有的Object的应用,直至调用reset()为止。在调用reset() Method之前,这些Object不会被GC回收。不调用reset() Method,而通过ObjectOutputStream Object写出了很多个Object时,可能会发生OutOfMemoryError。
例
public class BadSample { public void writeToStream(Object input)throws IOException { ObjectOutputStream stream = new ObjectOutputStream( new FileOutputStream("output")); stream.writeObject(input); // 错误 } }
public class FixedSample { public void writeToStream(Object input)throws IOException { ObjectOutputStream stream = new ObjectOutputStream( new FileOutputStream("output")); stream.writeObject(input); stream.reset();// 正确 } } |
【JAVA-30】 生成Exception Class的Object后不抛出【注意】
说明·原因
Exception Class是所有的异常的超类。将Exception Class的Instance作为异常来接受的代码中,对其异常的种类及处理,将不能利用Polymorphism(多态性)。请务必抛出合适的Subclass的Object。
例
public void badSampleMethod() throws Exception { // 错误 throw new Exception(); // 错误 } public void fixedSampleMethod () throws NoSuchMethodException { // 正确 throw new NoSuchMethodException ();// 正确 } |
【JAVA-31】 在catch Block中必须进行处理【推荐】
说明·原因
不要使catch Block为空,一定要对异常进行处理。正是为了处理异常才Catch的。什么也不做的话会发生新的BUG。即使处理不了,也要进行能确认发生了异常的动作,如输出到LOG。
例
try{ reader.close(); }catch(IOException ioe2){ //错误 } try{ reader.close(); }catch(IOException ioe2){ ioe2.printStackTrace(); //正确 } |
【JAVA-32】 不继承Error、Throwable Class【注意】
说明·原因
请不要定义Error Class的Subclass。Error Class表示在Application中不应Catch的重大的问题。因此,在Application中不能定义Error Class的Subclass。在Application定义的异常继承Exception Class。另外,不能定义Throwable的Subclass。Throwable Class是Exception和Error的超类。如果此Class继承Application的异常,那么Error和异常的意义就会变得模糊。Error Class,如上所述是不应该在Application继承的。同样,Application不应该继承Thorwable Class。Application中定义的异常继承Exception Class。
例
public class BadSampleException extends Error { // 错误 } public class AnotherBadSampleException extends Throwable { // 错误 } public class FixedSampleException extends Exception { // 正确 } |