细细讲述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,一经查实,立即删除!

相关文章

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

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

LeetCode—56. 合并区间

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

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

[转]软件测试的完整分类 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 类&…

LeetCode—57. 插入区间

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

LeetCode—306. 累加数

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

LeetCode—59. 螺旋矩阵 II

59. 螺旋矩阵 II 题目描述&#xff1a; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 考察重点&#xff1a;way数组记录走的方向&#xff0c;结合DFS实现矩阵螺旋遍历。 int way[][] …

LeetCode—307. 区域和检索 - 数组可修改

307. 区域和检索 - 数组可修改 题目描述&#xff1a; 给你一个数组 nums &#xff0c;请你完成两类查询。 其中一类查询要求 更新 数组 nums 下标对应的值 另一类查询要求返回数组 nums 中索引 left 和索引 right 之间&#xff08; 包含 &#xff09;的nums元素的 和 &#x…

33Exchange Server 2010跨站点部署-分支机构邮件从分支机构出

16.6 SH-ROBIN外网邮件从分部出16.6.1 创建SH-ROBIN发送连接器在上海分支机构的集线器上创建一个发送连接器SH-To Internet添加地址空间&#xff0c;并设定成本添加上海分支机构的两台HT创建好上海分支机构的发送连接器16.6.2 SH-ROBIN站的TOM发送邮件给公网CONTOSOCONTOSO的张…

我的设计模式之旅(4)——生成器(建造者)模式Builder

Builder模式也是创建型模式中的一种。主要用来应对构成复杂但构成结构和顺序相对稳定的对象的创建工作。目的是省去在对象发生变化时&#xff0c;需要修改代码中每一处对象创建的地方&#xff0c;应用这种模式&#xff0c;可以在一个复杂对象的内部结构(由许多其他子对象构成的…

LeetCode—309. 最佳买卖股票时机含冷冻期

309. 最佳买卖股票时机含冷冻期 题目描述&#xff1a; 给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff…

innosetup区分正常状态和静默安装状态(通过传递的参数)

命令行运行程序&#xff0c;如&#xff1a; myprogram.exe /abc /bcd 如果我们想获取其中的参数&#xff0c;“/abc”、“/bcd” 1. 直接使用innosetup自带的方法&#xff0c; GetCmdTail() 将所有参数作为一个字符串返回&#xff0c;安装和卸载都适用 注意&#xff1a;如果打…

测试计划排期内容和格式要求,测试邮件回复统一格式

公司最近在做一些测试流程规范&#xff0c;每次项目立项后&#xff0c;需要确认本次项目测试负责人&#xff0c;由测试项目负责人参加完需求评审后&#xff0c;协调资源 给出测试计划排期与对应子模块负责人员到项目经理处。 下面提供给大家一个测试计划排期内容和格式文档 2.测…

LeetCode—剑指 Offer 4、9、26、35、53

剑指 Offer 4. 二维数组中的查找、9. 用两个栈实现队列、26. 树的子结构、35. 复杂链表的复制、53 - I. 在排序数组中查找数字 I 题目描述&#xff1a; [4] 在一个 n * m 的二维数组中&#xff0c;每一行都按照从左到右递增的顺序排序&#xff0c;每一列都按照从上到下递增的顺…

Ubuntu 安装 JDK 问题

2019独角兽企业重金招聘Python工程师标准>>> 1. 下载并解压缩 2. mv到/usr/lib/jdk 3. 在~/.bashrc文件末尾添加环境变量 export JAVA_HOME/usr/lib/jdkexport CLASSPATH${JAVA_HOME}/libexport PATH${JAVA_HOME}/bin:$PATH 4. 重启终端&#xff0c;输入javac -vers…

Asp.net中水晶报表的使用

在我们对VS.Net中的水晶报表&#xff08;Crystal Reports&#xff09;进行研究之前&#xff0c;我和我朋友对如何将这个复杂的东东加入我们的Web应用有着非常的好奇心。一周以后&#xff0c;在阅读了大量的“HOWTO”文档之后&#xff0c;我们成功地将一些简单的报告加入到了我们…

2011-8-31 身体欠佳

1. 前几日明显感到身体欠佳&#xff0c;熬夜很难受&#xff0c;以往搞到1点问题不大的&#xff0c; 老了啊。 经过几天作息时间的调整&#xff0c;回家不开电脑&#xff0c;23点之前上床&#xff0c;在加上食疗&#xff0c;今天缓过来了。 看来有必要把生活节奏放慢一点&#x…

Scala学习(一)--Scala基础学习

Scala基础学习 摘要&#xff1a; 在篇主要内容&#xff1a;如何把Scala当做工业级的便携计算器使用&#xff0c;如何用Scala处理数字以及其他算术操作。在这个过程中&#xff0c;我们将介绍一系列重要的Scala概念和惯用法。同时你还将学到作为初学者如何浏览Scaladoc文档 1. 使…

Test live writer

拷贝屏幕来的图片 转载于:https://www.cnblogs.com/huobazi/archive/2006/11/19/565070.html

LeetCode—剑指 Offer 10 - I、II 斐波那契数列、青蛙跳台阶问题 63. 股票的最大利润

剑指 Offer 10 - I、II 斐波那契数列、青蛙跳台阶问题 63. 股票的最大利润 题目描述&#xff1a; [I] 斐波那契数列由 0 和 1 开始&#xff0c;之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e97&#xff08;1000000007&#xff09;&#xff0c;如计算初始结果为…