UML软件工程组织

细细讲述Java技术开发的规则之中级篇
作者:flyingwcy
  本文介绍的Java规则的说明分为3个主要级别,中级是平时开发用的比较多的级别,在今后将陆续写出其他的规则。遵守了这些规则可以提高程序的效率、使代码又更好的可读性等。(1)在finally方法里关掉input或者output资源,方法体里面定义了input或者output流的话,需要在finally里面把它关掉。以下这几种调用不需要遵守这条规则,因为colse()方法不起作用:
java.io.StringWriter
java.io.ByteArrayOutputStream
java.io.ByteArrayInputStream

如果再方法返回的时候没有调用close()方法来释放input()和output()的资源的话,会导致一个系统资源泄漏。而且在任何情况下都要确定在返回全调用了close()方法,包括出现异常的时候。所以需要在finally方法里面加入这个方法。这样就保证了在任何情况下都会关闭资源。

错误示例:

public class CIO
{
public void method (java.io.File f)
{
java.io.FileInputStream fis = null;
try
{
fis = new java.io.FileInputStream (f);
fis.read ();
fis.close ();
} catch (java.io.FileNotFoundException e1)
{
System.out.println("File not found");
} catch (java.io.IOException e2)
{
System.out.println("I/O Exception");
}
// 如果出现异常,这里就不能保证关闭资源。
}
}

修正后的代码:

public class CIOFixed
{
public void method (java.io.File f)
{
java.io.FileInputStream fis = null;
try {
fis = new java.io.FileInputStream
(f);
fis.read ();
} catch (java.io.FileNotFoundException e1)
{
System.out.println("File not found");
} catch (java.io.IOException e2)
{
System.out.println("I/O Exception");
} finally
{
if (fis != null)
{
try
{
fis.close ();
}
catch (java.io.IOException e)
{
System.out.println("I/O Exception");
}
}
}
}
}


(2)else的注意问题

一般总认为如果if语句只有一句的话,那么{}就是可要可不要的了。可是如果if有else嵌套的话,就不一样了,{}是必需的

错误示例:

if (i < 5)
if (i < 2)
i++;
else
i--;

修改后:

if (i < 5)
{
if (i < 2)
i++;
}
else
{
i--;
}

(3)不要再catch()块里什么代码也不放

在catch()块里面放入一些错误处理代码是一个好的习惯。但是如果catch()里面有有关javadoc 的代码,那也是可以的。

错误示例:

try {
System.in.read ();
} catch (java.io.IOException e)
{
// 错误
}

正确:

try {
System.in.read ();
} catch (java.io.IOException e)
{
System.out.println("Descriptive error");
}

(4)不要在if条件里面附值

如果这样做的话,系统会报告错误。在java的很多条件声明里面用附值是很不明智的,而且系统也会报告错误。很容易引起异常。遵守这条规者能够使维护简单,避免不一致。

错误示例:

if (b = true)

正确的:

if (b == true)

(5)for语句需要循环体。

如果没有{}的话,for语句只会执行一次!错误示例:

for (i = 0; i < 10; i++);
System.out.println (i);

这里print() 只会执行一次。正确:

for (i = 0; i < 10; i++)
{
// FIXED
System.out.println (i);
}

(5)不要把方法定义成main()

在java里,main()方法是一个特别的方法。所以在自己定义方法的时候不要定义这样的名字,以免引起混扰。

(6)不要直接或者间接的定义'Error'和'Throwable'的子类

'java.lang.Error'只在JVM出现反常的时候覆盖这个方法,如果你定义了直接或者不直接的类继承了类'Error',也就指出了这个错误是JVM内部的,而不是这个类的。所以对于java编译器来说是不可见的,这样就不能检查错误的异常处理了。

'java.lang.Throwable'是'java.lang.Exception'和'java.lang.Error'的上级类,用户如果象定义异常类的话应该继承'java.lang.Exception'。

错误示例:

public class ABC extends Error

正确: