细细讲述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.Exceptionjava.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: // VIOLATIONx = 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

 

————END————

转载于:https://www.cnblogs.com/Java-no-1/p/11234577.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263280.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL Server 获取所有表和数据的批量操作

最近要写触发器&#xff0c;对数据库中每个用户表都要写&#xff0c;一查170多个表&#xff0c;晕了~&#xff0c;想偷懒自制程序完成这些一些批量的操作&#xff0c;所以搜集了一下对数据库其他操作的东东&#xff01; --一时兴起&#xff0c;随处搜集 1、创建数据库 CREATE D…

创业,程序员心中说不出的痛

一个从事IT行业5年以上的人&#xff0c;你问他有没有想过自己创业&#xff0c;他说没有&#xff0c;那95&#xff05;的可能是假的。不过&#xff0c;我属于那剩下5&#xff05;里面的其中一个。也许是受我父亲的影响&#xff0c;从小我就潜移默化的受到这样的教育&#xff1a;…

LeetCode—301. 删除无效的括号(困难)

301. 删除无效的括号&#xff08;困难&#xff09; 题目描述&#xff1a; 给你一个由若干括号和字母组成的字符串 s &#xff0c;删除最小数量的无效括号&#xff0c;使得输入的字符串有效。 返回所有可能的结果。答案可以按 任意顺序 返回。 考察重点&#xff1a;题目要求找…

Failed to issue method call: Unit mysql.service failed to load: No such file or directory解决的方式...

Failed to issue method call: Unit mysql.service failed to load: No such file or directory解决的方式作者&#xff1a;chszs。转载需注明。博客主页&#xff1a;http://blog.csdn.net/chszs1、软件环境&#xff1a;OpenSUSE 13.1 x64MySQL 5.6.20 x642、採用RPM包安装MySQ…

进销存和财务方面业务知识了解

最近由于工作的需要&#xff0c;需要了解进销存的业务&#xff0c;还有财务方面的一些知识&#xff0c;需要对业务有很好的把握能力&#xff0c;再接再励&#xff0c;加油看书&#xff0c;学习了哦&#xff0c;并且还有理论结合实际来了解&#xff0c; Busying Now.转载于:http…

训练(线段树+树状数组) poj——3264

这个题应该算是比较简单的线段树问题吧&#xff0c;还可以用RMQ做&#xff0c;不过现在还不太熟悉就用线段树做了&#xff0c;直接附代码了&#xff01; #include <stdio.h>#define M 50000#define OX 0x7fffffffstruct node{int r,l;int Max,Min;};node elem[4*M50];int…

LeetCode—56. 合并区间

56. 合并区间 题目描述&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 考察重点&#x…

在asp.net中实现回车替代Tab键

通常在网页中添加大量内容时&#xff0c;为了便捷&#xff0c;需要实现回车替代Tab键&#xff0c;按照次序填写内容&#xff0e;由于在asp.net中fouce函数中有功能&#xff0c;既控件聚焦&#xff0e;但是如果要实现回车替代Tab键还得需要脚本语言来实现&#xff0e;其实原理很…

POJ3006-Dirichlet's Theorem on Arithmetic Progressions

素数打表&#xff0c;水题。 #include<stdio.h> #include<string.h> const int Max1000001; bool isprime[Max]; int main(void) {int i,j,a,d,n;memset(isprime,true,sizeof(isprime));for(i3;i<1000;i2)for(j3;j<Max/i;j2)if(isprime[i])isprime[i*j]false…

[转]软件测试的完整分类

[转]软件测试的完整分类 2015-06-09 转自&#xff1a;软件测试的完整分类 转载于:https://www.cnblogs.com/Ming8006/p/4563994.html

LeetCode—304. 二维区域和检索 - 矩阵不可变

304. 二维区域和检索 - 矩阵不可变 题目描述&#xff1a; 给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a; 计算其子矩形范围内元素的总和&#xff0c;该子矩阵的 左上角 为 (row1, col1) &#xff0c;右下角 为 (row2, col2) 。 实现 NumMatrix 类&…

ubuntu下的各种环境变量

如想将一个路径加入到$PATH中&#xff0c;可以像下面这样做&#xff1a; 1. 控制台中&#xff1a; $ PATH"$PATH:/my_new_path" &#xff08;关闭shell&#xff0c;会还原PATH&#xff09;2. 修改profile文件&#xff1a; $ vi /etc/profile 在里面加入: export PATH…

采用HttpModules来重写URLs(原理篇)转

据说通过HttpModules可以将类似于&#xff1a;http://www.infotouch.cn/detail.aspx?id120 的URL地址重写为&#xff1a;http://www.infotouch.cn/detail/120.aspx 。这样最直接的好处就是可以让搜索引擎搜索到页面&#xff0c;因为搜索引擎对&#xff1f;之后的参数不太理睬。…

Linux Centos7 离线安装docker 【官网翻译和注释】

Centos7的Docker安装 需要一个维护版本的centos7&#xff0c;所以6不行。 卸载旧版本 旧版本的docker被称为 docker or docker-engine 如果存在请删除它们。 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logro…

C#操作XML小结_转载

一、简单介绍 using System.Xml;//初始化一个xml实例XmlDocument xmlnew XmlDocument(); //导入指定xml文件xml.Load(path);xml.Load(HttpContext.Current.Server.MapPath("~/file/bookstore.xml")); //指定一个节点XmlNode rootxml.SelectSingleNode("/root&qu…

LeetCode—57. 插入区间

57. 插入区间 题目描述&#xff1a; 给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表。 在列表中插入一个新的区间&#xff0c;你需要确保列表中的区间仍然有序且不重叠&#xff08;如果有必要的话&#xff0c;可以合并区间&#xff09;。 考察重点&#xf…

海文考研名师做客新浪解析2007心理学考试大纲

http://edu.sina.com.cn/exam/2006-07-19/171146933.html 转载于:https://www.cnblogs.com/liuzhengliang/archive/2006/09/23/512594.html

杭电1262--寻找素数对(打表)

寻找素数对 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9505 Accepted Submission(s): 4822 Problem Description哥德巴赫猜想大家都知道一点吧.我们现在不是想证明这个结论,而是想在程序语言内部能够表示的…

LeetCode—306. 累加数

306. 累加数 题目描述&#xff1a; 累加数 是一个字符串&#xff0c;组成它的数字可以形成累加序列。 一个有效的 累加序列 必须 至少 包含 3 个数。除了最开始的两个数以外&#xff0c;序列中的每个后续数字必须是它之前两个数字之和。 给你一个只包含数字 ‘0’-‘9’ 的字…

push模式的水晶报表,参数的设置要放在数据源设置之后

不知道为什么有这个限制&#xff0c;如果放在设置数据源之前&#xff0c;在显示的时候就会提示这个参数的值未设置&#xff0c;要重新手动设置。 转载于:https://www.cnblogs.com/strinkbug/archive/2006/10/13/528243.html