JAVA规则——中级篇

原创 2005年05月29日 20:38:00
本文介绍的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");
}
参考:Joshua Bloch: "Effective Java - Programming Language Guide".
Addison-Wesley, 2001, pp. 187

(4) 不要在if条件里面附值
如果这样做的话,系统会报告错误。在java的很多条件声明里面用附值是很不明智的,而且系统也会报告错误。很容易引起异常。遵守这条规者能够使维护简单,避免不一致。
错误示例:
if (b = true)
正确的:
if (b == true)
参考:Section 10.4 of http://java.sun.com/docs/codeconv/html/CodeConventions.doc9.html#547

(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的系统属性。
参考:David Flanagan: "Java in a Nutshell". O'Reilly
November, 1999: Third Edition, pp.190-192

(9)不要使用’/n’或者'/r'来分行
这两个标记看来很普遍,特别是’/n’。我们经常用来作为分行用。但是不同的系统用不同的分行字符,所以这些字符在某些意义上违背了java的平台无关性。
错误示例:
System.out.println("Hello/n" + name);
我们可以用其它的一些方法来代替,比如println(),这个方法在不同的系统平台上都起到相同的作用。后者推荐大家用这个方法:System.getProperty("line.separator")
参考:David Flanagan: "Java in a Nutshell". O'Reilly,
November 1999: Third Edition, pp. 191-192

(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
参考:Statically Scanning Java Code: Finding Security Vulnerabilities.
John Viega, Gary McGraw, Tom Mutdosch, and Edward W. Felten
IEEE SOFTWARE September/October 2000

(11)不要使接口序列化
如果一个字节数组包含了一个被序列化的对象。攻击者就能读到这个对象的内部状态合字段(包括private的)。
错误示例:
public interface sample extends java.io.Serializable

Java编程规则

Java编程规则  包含了大量有用的建议,帮助大家进行低级程序设计,并提供了代码编写的一般性指导:  (1)  类名首字母应该大写。字段、方法以及对象(句柄)的首字母应小写。对于所有标识符,其中包...
  • stevexk
  • stevexk
  • 2006年02月25日 19:52
  • 8043

JAVA程序的基本规则

一、java程序的组织形式 1.java是一种面向对象的语言,因此java程序必须以class类的形式存在 其中class类是java程序中最小的程序单位。 2.java程序中不允许出现独立存在的可执...
  • boom784702727
  • boom784702727
  • 2016年01月08日 12:58
  • 316

java 规则引擎

最近刚刚接触JAVA的规则引擎,一般的系统而言,业务不是非常复杂,而且变化少,因此很少采用什么规则引擎,最近接触了一个规则引擎的系统,是使用BlazeSoft公司的Blaze来实现的,自己对它正在了解...
  • yx511500623
  • yx511500623
  • 2016年02月15日 18:14
  • 5989

[Drools]JAVA规则引擎 -- Drools

Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。 1、Drools...
  • quzishen
  • quzishen
  • 2011年01月25日 14:33
  • 175176

Java中级开发工程师知识点归纳

一、版本更新说明: 2015.03.09--------文章发布 2015.03.11--------添加了Java IO机制中的种类和应用场景的解释,添加了Java内存模型的相关知识点 201...
  • andong154564667
  • andong154564667
  • 2016年08月18日 17:56
  • 9672

中级java进阶

java基础类型篇 在java中switch作用类型 在java中,只能作用int基本类型,因为short,char,byte都可以隐士转换为int类型,所以这些以及这些类型的包装类型也是可以的,...
  • lzshentibang
  • lzshentibang
  • 2014年05月15日 16:33
  • 940

Java中级开发工程师知识点归纳

一、版本更新说明: 2015.03.09--------文章发布 2015.03.11--------添加了Java IO机制中的种类和应用场景的解释,添加了Java内存模型的相关知识点 201...
  • zhengzhihust
  • zhengzhihust
  • 2015年03月09日 10:31
  • 26215

总结java从初级到中级最后到高级所要掌握的知识点

1、Java基础技术体系、JVM内存分配、垃圾回收、类装载机制、性能优化、反射机制、多线程、网络编程、常用数据结构和相关算法 2、对面向对象的软件开发思想有清晰的认识、熟悉掌握常用的设计模式 ...
  • zyl_06
  • zyl_06
  • 2017年12月06日 17:55
  • 241

Java中接口中的方法定义规则

Java接口中的方法定义规则最近在做某个公司校招的笔试的时候,遇到了如下一个题:题目如下:(多选题)请选择以下接口定义正确的方法()A:public static void main (String[...
  • u010412719
  • u010412719
  • 2016年09月14日 11:24
  • 6764

java从中级到高级详解

  • 2014年07月31日 11:22
  • 11.26MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA规则——中级篇
举报原因:
原因补充:

(最多只允许输入30个字)