网站首页 > java教程 正文
本文介绍的Java规则的说明分为3个主要级别,中级是平时开发用的比较多的级别,在今后将陆续写出其他的规则。遵守了这些规则可以提高程序的效率、使代码又更好的可读性等。
一、在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"); } } } } }
二、else的注意问题
一般总认为如果if语句只有一句的话,那么{}就是可要可不要的了。可是如果if有else嵌套的话,就不一样了,{}是必需的
错误示例:
if (i < 5) if (i < 2) i++; else i--;
修改后:
if (i < 5) { if (i < 2) i++; } else { i--; }
三、不要再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"); }
四、不要在if条件里面附值
如果这样做的话,系统会报告错误。在java的很多条件声明里面用附值是很不明智的,而且系统也会报告错误。很容易引起异常。遵守这条规者能够使维护简单,避免不一致。
错误示例:
if (b = true)
正确的:
if (b == true)
五、for语句需要循环体。
如果没有{}的话,for语句只会执行一次!错误示例:
for (i = 0; i < 10; i++); System.out.println (i);
这里print() 只会执行一次。正确:
for (i = 0; i < 10; i++) { // FIXED System.out.println (i); }
六、不要把方法定义成main()
在java里,main()方法是一个特别的方法。所以在自己定义方法的时候不要定义这样的名字,以免引起混扰。
七、不要直接或者间接的定义'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
八、有关"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;
九、建议不要使用'System.getenv ()'
不建议使用'System.getenv()',这个方法看起来很好用,不过并不是所有的系统都有环境变量的。不用这个方法也可能带来一些不方便。
错误示例:
void method (String name) { System.getenv (name); // 可以用其他方法来代替 }
如果不用这个方法,我们可以用其它的方法来代替。比如:'System.getProperty()’,'getTypeName ()'等,这也可以找到java的系统属性。
十、不要使用’\n’或者'\r'来分行
这两个标记看来很普遍,特别是’\n’。我们经常用来作为分行用。但是不同的系统用不同的分行字符,所以这些字符在某些意义上违背了java的平台无关性。
错误示例:
System.out.println("Hello\n" + name);
我们可以用其它的一些方法来代替,比如println(),这个方法在不同的系统平台上都起到相同的作用。后者推荐大家用这个方法:
System.getProperty("line.separator")
十一、使所有的内部类"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
十二、不要使接口序列化
如果一个字节数组包含了一个被序列化的对象。攻击者就能读到这个对象的内部状态合字段(包括private的)。
错误示例:
public interface sample extends java.io.Serializable
Java肖先生:专注于Java开发技术的研究与知识分享!
————END————
- 点赞(感谢)
- ...
- 转发(感谢)
- ...
- 关注(感谢)
- ...
猜你喜欢
- 2024-09-10 细思极恐:你真的会写Java吗?(会java的人多吗)
- 2024-09-10 连引用都答不上,凭什么说你是Java服务端开发
- 2024-09-10 java软件开发入门学习需要掌握哪些技术?
- 2024-09-10 Javaweb开发必备,JavaScript技术详解,JS从入门到精通
- 2024-09-10 Java8官方教程(一):Java技术概述(java8.0下载教程)
- 2024-09-10 Java后端开发需要掌握的技术有哪些?
- 2024-09-10 Java后端开发需要学习哪些技术?(java后端开发项目)
- 2024-09-10 《阿里巴巴 Java 开发手册》(终极版)
- 2024-09-10 Java开发必须要掌握的20个核心技术
- 2024-09-10 从程序员小仙飞升上神,java技术开发要如何实现?
你 发表评论:
欢迎- 最近发表
-
- java8的stream使用小示例(java stream的用法)
- Java 中的 Lambda 表达式深入解析:从语法糖到高阶函数
- 实战解析Android架构设计原则(android的架构)
- 搭建mcp服务器用java17,可是项目开发用的是java8怎么实现?
- Java Stream:集合处理的api(java集合流操作)
- Java 8新特性全面剖析:让编程变得更简单优雅
- Java 8新特性全面解析与最佳实践:掌握未来编程的艺术
- Java 8日期时间API新特性揭秘与深度解析
- Java 8 Stream API 详解(java.stream)
- Java机器学习库(Java ML)(二、聚类)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)