Java资源网

| JAVA基础 | 环境配置 | JDBC | 线程技术 | Socket编程 | JavaMail | JAVA与XML | 设计模式 | 技术新闻 | Java认证 | 程序人生 软件下载
| JSP&Servlet | Spring | Struts | Hibernate | JBuilder | Eclipse | WebService | EJB技术 | J2ME开发 | 应用服务器 | JXTA | Ajax
Articles search文章搜索
   关键字:
   类 别:
       
New download 最新下载
· [组件]HTML Parser 1.5
· [教程]WebSphere Studio应用教程
· [组件]JDom 1.0
· [工具]Junit3.8.1
· [教程]EJB编程及J2EE系统架构和设计
· [教程]EJB教程
· [教程]J2EE Tutorial中文版
· [教程]Java编程思想2(英文)
· [教程]java编程思想(完整版)
· [教程]Java网络编程
New articles 最新文章
· 设计移动 Web 服务
· 解析XML的时候完全忽略DTD
· 理解XML Schema XML Schema 初步
· 标签库的深入研究
· 提升JSP应用程序的七大绝招
· 如何使用JDOM对XML文件进行操作
· 处理XML字符串中特殊字符
· 利用Digester把XML转换成为Java对象
· 使用WebService 和RMI远程协作
· 使用Axis开发Web Service程序
Articles top 热门文章
· Eclipse基础--plugin插件安装(6644)
· eclipse+tomcat+lomboz的安装配置说明(4774)
· Java程序员就业前景(4584)
· Windows下JAVA环境变量的设置祥解(3788)
· Tomcat下JSP、Servlet和JavaBean环境的配置(3716)
· 使用links方式安装Eclipse插件(3698)
· 一个老程序员的心理话(3533)
· linux下jdk的安装与配置(3459)
· 初学者入门:Structs中基本配置入门(3334)
· Eclipse 运行命令行参数大全(3084)
您的位置:首页>>JAVA基础>>细细讲述Java技术开发的规则之中级篇
细细讲述Java技术开发的规则之中级篇
2005-07-26   来源:javaresearch.org  作者: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

正确:public class ABC extends Exception

(7)有关"switch"语句里面的"case"问题

最好在每一个 “case”里都定义一个”return”或者“break”来控制不要走到下面的

“case”里去。如果一个”case”语句在代码的最后没有一个”break”或者”return”句,程序就会走到下一个”case”。如果这个”case”是最后一个的话,那就没什么问题,如果后面还有”case” 的话,看起来就不太安全了。

错误示例:

switch (i) {
        case 1:
            x = 10;
            break;
        case 2:  
            x = 20;
        default:
            a = 40;
            break;


正确:

switch (i) {
        case 1:
            x = 10;
            break;
        case 2:  // VIOLATION
            x = 20;
            break;
        default:
            x = 40;
            break;


(8)建议不要使用'System.getenv ()'

不建议使用'System.getenv()',这个方法看起来很好用,不过并不是所有的系统都有环境变量的。不用这个方法也可能带来一些不方便。

错误示例:

void method (String name) 
{
        System.getenv (name);
		// 可以用其他方法来代替
    }


如果不用这个方法,我们可以用其它的方法来代替。比如:'System.getProperty()’,'getTypeName ()'等,这也可以找到java的系统属性。

(9)不要使用’\n’或者'\r'来分行

这两个标记看来很普遍,特别是’\n’。我们经常用来作为分行用。但是不同的系统用不同的分行字符,所以这些字符在某些意义上违背了java的平台无关性。

错误示例:

System.out.println("Hello\n" + name);


我们可以用其它的一些方法来代替,比如println(),这个方法在不同的系统平台上都起到相同的作用。后者推荐大家用这个方法:

System.getProperty("line.separator")


(10) 使所有的内部类"private"

Java允许一个类包含另外一个类,带是Java byte code没有这个概念。类被编译器解释成package-private类。从更深的程度来说,包含类的任何内部私有对象能被内部类访问的也能被同一个包内的其他类访问。

错误示例:

public class INNER 
{
    class INNER_Class 
	{  
        void setValue(int i)
		{
            _value = i;  
			// 现在包就可以访问了
        }
    }
    private int _value;
}


所以需要加上private class INNER_Class

(11)不要使接口序列化

如果一个字节数组包含了一个被序列化的对象。攻击者就能读到这个对象的内部状态合字段(包括private的)。

错误示例:

public interface sample extends
java.io.Serializable

  --相关文章--
· J2EE全面介绍(二) (2007-04-13)
· 项目经验二则:读取war包中的文件及Ant使用中的OutOfMemoryError解决 (2007-04-13)
· 走向J2EE,漫长的道路 (2007-04-13)
· 步入J2EE架构和过程(2) (2007-04-13)
· 步入J2EE架构和过程(1) (2007-04-13)
· 方兴未艾的CORBA (2007-04-13)

版权所有©2005-2006 JAVA资源网 渝ICP备05007591号 虚拟主机 | 关于我们 | 联系方式 | 广告业务 | 网站地图 | 友情链接