编写代码是一种艺术,认识错误是我们代码改进的重要途径之一。以下情况并非大家都能碰到过,但希望提高代码质量的人都引以为戒。以下各种情况,都是初学者经常犯的错误。

1.1       字符串没有判断是否为空

1.1.1        直接插入数据库

这种情况经常出现在服务器的java代码中,当从用户输入的表单中获取用户输入的信息时,通常认为客户端输入的信息就是我们想要的信息,直接插入到数据库。结果,数据库中出现了很多“null”的值。随便举个例子,通常在保存到数据库前,首先需要拼接sql,举例:

  1. String name = paramsMap.get("name");
  2. String gender = paramsMap.get("gender");
  3. String sql= “insert into user(name,gender) values(‘”+name+
  4. ’,’”+gender+”’)”;
String name = paramsMap.get("name");
String gender = paramsMap.get("gender");
String sql= “insert into user(name,gender) values(‘”+name+
’,’”+gender+”’)”;

正常情况,当用户填写了name和gender时,此代码没有问题。可现实并非我们想象的那样好,在这里,这里的name的取值通常有3种情况,null,“null”(通常这种情况是客户端没有处理好)和”name”,只有最后一种情况是正确的,其他的两种情况都并不是我们所想要的。也就是说,看似简单的代码,却只考虑了三分之一的情况,其他的三分之二的情况却没有考虑。结果,这就是为什么我们在上网时,为什么查看某些账单时,经常会出现null这种用户感觉很困惑的“汉字”。

正确写法:

  1. String name = paramsMap.get("name");
  2. String gender = paramsMap.get("gender");
  3. if(name==null || name=”null”){
  4. name=””;//如果为空,设置为空,数据库不会存储值
  5. }
  6. String sql= “insert into user(name,gender) values(‘”+name+
  7. ’,’”+gender+”’)”;
String name = paramsMap.get("name");
String gender = paramsMap.get("gender");
if(name==null || name=”null”){
name=””;//如果为空,设置为空,数据库不会存储值
}
String sql= “insert into user(name,gender) values(‘”+name+
’,’”+gender+”’)”;

当然,以上判断方法也可以写成一个公用方法,直接调用。

1.1.2        直接截取

还是以上面代码为例:如果我们想把名称里面第一个字提取出来当做姓,单独存储起来,怎么办?看以下代码:

  1. String name = paramsMap.get("name");
  2. String lastName = name.substr(,);
  3. String gender = paramsMap.get("gender");
  4. String sql= “insert into user(name,last_name,gender) values(‘”+name+
  5. ’, ’”+ lastName +”’,’”+gender+”’)”;
String name = paramsMap.get("name");
String lastName = name.substr(0,1);
String gender = paramsMap.get("gender");
String sql= “insert into user(name,last_name,gender) values(‘”+name+
’, ’”+ lastName +”’,’”+gender+”’)”;

看似没有什么问题,正常情况下,这段代码没有一点问题。可是,在实际的生产环境,这段代码可能在后台不停的报空指针异常。试问,当name为空时呢?或许你会说,在客户端控制为必填项,那如果这在业务上并非用户关注点呢,不是必填项呢?这里只是一个举例,程序中有很多这样类似的代码,总是认为参数是完整的,参数就是我们想象的那种格式。

正确写法:

  1. String name = paramsMap.get("name");
  2. String lastName =“”;//默认为空
  3. if(StringUtils.isNotBlank(name)){
  4. LastName=name.substr(,)
  5. }
  6. String gender = paramsMap.get("gender");
  7. String sql= “insert into user(name,last_name,gender) values(‘”+name+
  8. ’, ’”+ lastName +”’,’”+gender+”’)”;
String name = paramsMap.get("name");
String lastName =“”;//默认为空
if(StringUtils.isNotBlank(name)){
LastName=name.substr(0,1)
}
String gender = paramsMap.get("gender");
String sql= “insert into user(name,last_name,gender) values(‘”+name+
’, ’”+ lastName +”’,’”+gender+”’)”;

所使用StringUtils类为org.apache.commons.lang. StringUtils

1.2       根据位置取值

在某些有规律的表单值,比如像列表,我们经常使用这种方法来获得所有用户输入的数据项,然后按照html输入的顺序,依次取值,然后再做进一步处理。然而这种代码的可维护性很差。例如:原来的顺序是姓名,性别和年龄,现在需要在年龄前面插入一列,名称是联系方式,打乱了原来的顺序。那么所有取值的代码都要把取值的顺序修改一遍,这是列表的属性比较少的时候,如果一个列表的列超过了20个,而要插入的位置是第2列,那你的悲剧就来啦。

代码举例:

Var name = arr[1];

Var gender=arr[2];

正确的写法:

不要依赖属性取值,根据键值进行取值。

1.3       ID重复

这个是在html中经常出现的错误。但是当时用extJs时,这个错误却很难排查。

推荐的方法:

在命名id时,加上前缀,例如用户管理界面,所有的ID都以USER开头。或者企业用户,则添加公司的域名。

1.4       代码堆积

这个也不能算一个错误,通常一个方法超过100行,其可读性就已经很差,但作为一个企业,稳定是大家最期待的结果,所以,前辈写好的代码,我们只在其基础上修改,增加功能,拷贝代码注释旧代码,结果一个方法越来越臃肿,由几百行扩大到几千行,甚至上万行。出现问题,推卸责任,说代码之前就是这样写的。

正确方法:

如果是新增加功能,单独出一个方法写功能,在原来的方法里只需要一个调用或一个判断即可,而不要直接在原来的方法里面写代码。

如果原来的方法已经很臃肿,拆分可以独立出来的代码,然后再做修改。

1.5       太信赖客户端

比如时间和日期格式。

或许,这是按模块分配任务的悲剧,如果一个人既写客户端,又写服务器端代码,那么他可以把那个模块运行的很好。可是开发只占20%,我们却要花80%的时间来修改一个模块。那个人开发完,拍拍屁股走人,另一批人就要花80%时间来修改那个人留下的bug。其中有些隐藏较深的bug就是客户端信赖。比如:

举例1:日期,在客户端通常是选择的,格式都是固定的,而且也是正确的,在服务器端只需要获取保存即可。

举例2:某些日期是显示给用户看的,默认为当前时间,是不能改变的,在服务器端也是只需获取保存即可。

以上只是最常见的两个例子,系统发布后是怎样的呢?某些日期并不合法的日期格式也给保存到数据库。默认的当前时间会出现在当前时间之后。提交的数据也是千差百错。这是因为,用户不一定按照你的思路出牌。他不使用你的日期控件,或者还没有把你用的JS加载完毕,就提交了数据。或者用户本机的时间是错误的,你默认显示的当前日期也就是错误的。或者用户使用一些表单提交工具提交数据。

所以在程序中,服务器段校验比不可少,不但要校验数据格式,还要做逻辑校验,比如默认时间不能比当前日期还晚。

总结下java经常犯的错误的更多相关文章

  1. 十个JAVA程序员容易犯的错误

    十个JAVA程序员容易犯的错误 1. Array 转 ArrayList 一般开发者喜欢用: List<String> list = Arrays.asList(arr); Arrays. ...

  2. windows下编译java源文件的编码错误

    import java.util.Arrays;public class ArrayAsAReference{ public static void main(String[] args) { int ...

  3. JDK问题--linux下java unrecognized class file version错误的解决

    linux下java unrecognized class file version错误的解决 环境:RedHat Linux Enterprise 5.4 问题:java.sun.com下载jdk1 ...

  4. jdk1.7安装,cmd下 java -version出现错误:“could not open `D:\Java\jre7\lib\amd64\jvm.cfg”

    cmd 下java -version出现错误:“could not open `D:\Java\jre7\lib\amd64\jvm.cfg”,出现这种错误可能是由于先前有安装老版本jdk,之后将新版 ...

  5. 【工匠大道】Mac下Java开发环境配置简述

    本文地址 原文地址 分享提纲: 1. 下载JDK1.7 2. 配置java_home 3 .安装tomcat 4 .安装eclipse或者myeclipse 5.  mysql安装 破解版下载请参考M ...

  6. 《java中异常和错误》

    异常和错误的区别. 异常: 在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发 ...

  7. Java上面出现这个错误如何解决关于XML的

    Java上面出现这个错误如何解决关于XML的 2015-01-07 14:49 hejiashun11325 | 分类:JAVA相关 | 浏览265次 The type org.xmlpull.v1. ...

  8. 在CMMI推广过程中EPG常犯的错误(转)

    本文转自: http://developer.51cto.com/art/200807/86953.htm 仅用于个人收藏,学习.如有转载,请联系原作者. ---------------------- ...

  9. java.lang.OutOfMemoryError处理错误

    内存详解 原因: 常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 3.代码中存在死循环或循环产生过多 ...

随机推荐

  1. [Angular 2] Using Array ...spread to enforce Pipe immutability

    Pipes need a new reference or else they will not update their output. In this lesson you will use th ...

  2. Nested Class Templates

      Templates can be defined within classes or class templates, in which case they are referred to as ...

  3. javascript正则

      <script type="text/javascript"> //去除两边空格,如果要去除所有空格,使用/\s*即可/ String.prototype.trim ...

  4. 【回顾整理】HTML+CSS个的两个实战项目

    一:麦子商城首页制作 代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset= ...

  5. c - 逆序/正序输出每位.

    #include <stdio.h> #include <math.h> /* 判断一个正整数的位数,并按正序,逆序输出他们的位. */ int invert(int); vo ...

  6. POJ 1159

    区间dp 比如从i到j如果str[i] == str[j]那么i到j的值就与i+1到j-1相同,否则从i到j-1与i+1到j中选一个最优解,这道题直接定义int的二维数组会mle,用short,也可以 ...

  7. Dalvik指令集

    类型 语法 含义 V void,只用于返回值类型 Z boolean B byte S short C char I int J long F float D double L Java类类型 [ 数 ...

  8. 使用ffmpeg录音

    官方教程:http://ffmpeg.org/ffmpeg.html 录音方法: 开始找到了这个方法,但是不行呀,好像是没有这个oss吧. oss 是linux 下的声音相关的东西,与alsa 一样, ...

  9. Linux下MySQL的彻底卸载和安装配置字符集

    前言: Linux环境下MySQL的安装和配置在网上已经有很多教程了.之所以写这篇文章是因为在配置字符集的时候找了网上的一些教程发现并不能用导致折腾了一阵子.下面的教程均是亲自实践. MySQL的彻底 ...

  10. ECSTORE 货币格式

    世界上许多国家都有不同的货币 格局和数字 格局 特例 .针对特定的当地化环境正确地 格局化和显示货币是当地化的一个主要部分,ecstore 可以同过后台的设置,来更改货币的格式,具体方式为 后台-&g ...