`
donlianli
  • 浏览: 340488 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Group-logo
Elasticsearch...
浏览量:218593
社区版块
存档分类
最新评论

编程常犯错误

阅读更多

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

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

1.1.1        直接插入数据库

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

 

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这种用户感觉很困惑的“汉字”。

正确写法:

 

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        直接截取

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

 

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为空时呢?或许你会说,在客户端控制为必填项,那如果这在业务上并非用户关注点呢,不是必填项呢?这里只是一个举例,程序中有很多这样类似的代码,总是认为参数是完整的,参数就是我们想象的那种格式。

正确写法:

 

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加载完毕,就提交了数据。或者用户本机的时间是错误的,你默认显示的当前日期也就是错误的。或者用户使用一些表单提交工具提交数据。

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

分享到:
评论

相关推荐

    C语言编程易犯错误分析.pdf

    "C语言编程易犯错误分析" C语言作为一种高级编程语言,具有简洁、灵活、强大功能的特点,受到广泛青睐。但是,C语言的灵活性也给程序调试带来了许多不便,尤其是对初学者来说,经常会出现一些连自己都不知道错误的...

    C编程时常犯的错误

    ### C编程时常犯的错误 #### 一、忽视大小写敏感性 **错误示例**: ```c main() { int a = 5; printf("%d", A); } ``` **错误分析**:在这个例子中,`a` 和 `A` 被当作两个不同的变量处理。C语言对大小写非常...

    Verilog与SystemVerilog编程陷阱:如何避免101个常犯的编码错误

    在深入探讨Verilog与SystemVerilog编程陷阱以及如何避免这些常犯的编码错误之前,我们先来了解一下Verilog与SystemVerilog的基本概念。 Verilog是一种硬件描述语言(HDL),主要用于电子系统的设计和验证,包括从...

    Java编码常犯错误

    ### Java编码常犯错误 #### 一、字符串拼装SQL **问题描述**:在Java开发过程中,直接使用字符串拼接的方式构造SQL语句是一种常见的做法。然而这种方式存在明显的安全隐患和性能问题。 - **安全漏洞**:直接拼接...

    初学C语言编程易犯的错误及其改正

    初学C语言编程易犯的错误及其改正

    C语言高手总结的新手容易犯的错误

    C语言是一门经典的编程语言,对于新手来说,易犯的一些错误是非常普遍的。这些错误不仅影响代码的正确性,也会浪费大量的时间和精力。因此,了解和避免这些错误是非常重要的。 1. 将字符常量与字符串常量混淆 ...

    C语言改错练习资料(C常犯错误)

    以下是一些关于C语言常犯错误的分析和修正: 1. 字符串输出: - 错误:在字符串定义时,使用了不标准的拼写`f0r`。 - 解决:正确拼写`for`关键字。 ```c #include void main(){ char yy[100] = "ok??\n"; ...

    初学C语言编程易犯的错误及其改正.pdf

    其次,符号字符歧义错误也是初学者常犯的错误之一。在C语言中,某些符号如‘/’或‘=’只有一个字符长度,而像‘==’或‘++’则由多个字符组成。当编译器读取时,会从左到右逐步读取字符,判断是否能组合成一个符号...

    编程中常犯的两个错误

    其次,另一个错误是没有立即动手实践编程。作者初期过于专注于阅读编程书籍,但理论知识不通过实践很难巩固。正确的学习方法应该是结合实际项目进行学习,例如从简单的博客网站或投票软件开始编写代码,通过不断实践...

    java常犯错误

    在Java编程过程中,开发者经常会遇到一些常见的错误,这些错误可能会导致程序运行不正常或效率低下。以下是一些Java中常见的错误及其详细解释: 1. **类型转换错误**:Java是强类型语言,当不同类型的数据之间进行...

    编程人员容易犯的10个C#错误

    本文将详细讨论编程人员在使用C#时常常会犯的10个常见错误,并提供相应的解决策略。 1. **未初始化的变量** 在C#中,所有变量必须在使用前明确初始化。与C++不同,C#不会自动为变量分配默认值。因此,忘记初始化...

    Verilog与SystemVerilog编程陷阱 如何避免101个常犯的编码错误 [(美)萨瑟兰,(美)米尔斯著][机械工业出版社].pdf

    Verilog与SystemVerilog编程陷阱 如何避免101个常犯的编码错误

    程序员不应该再犯的五大编程错误

    作为一名程序员,犯错误是不可避免的,尤其是在学习编程的初期。然而,重要的是要学会从错误中吸取教训,避免重复犯同样的错误。以下就是程序员应该避免的五大编程错误: 1. 不理解就复制代码:这种做法可能导致...

    c语言编程易犯毛病

    以下是从标题“C语言编程易犯毛病”及其描述中提取的一些关键知识点,这些知识点涵盖了C语言编程中容易遇到的错误,帮助读者更好地理解和避免这些常见问题。 ### 1. 忽视大小写敏感性 C语言区分大小写,这意味着`a...

    C++语言99个常见编程错误pdf

    在描述中提到的“借鉴”二字,意味着读者可以通过学习这些错误案例和解决方案,以避免未来犯下类似的错误,提升个人的技术水平。 通过这本书,读者可以学习到如何利用C++语言的特性进行高效编程,以及如何设计出更...

    java编程十大低级错误

    Java编程中的低级错误是开发者在编码过程中容易犯的一些常见失误,这些错误往往会影响代码的可读性、可维护性和程序的稳定性。以下是对标题和描述中提到的十大低级错误的详细解释: 1. **命名不规范**:命名应该...

    21 天学通C++ C++ 常犯错误 Turbo_c_使用教程_--免费

    在学习C++编程的过程中,掌握基础知识、理解编程概念和避免常见错误是至关重要的。"21天学通C++"是一本旨在帮助初学者在短时间内快速掌握C++语言的教材,而"Turbo C++"则是一款曾经广泛使用的C++编译器,尤其对于...

    PHP开发者最常犯的11个MySQL错误编程小技巧共4页

    本篇内容将详细解析PHP开发者最常犯的11个MySQL编程错误,并提供相应的解决小技巧。 1. **未使用预处理语句**: 预处理语句可以防止SQL注入攻击,通过绑定参数来执行查询。不使用预处理可能导致恶意用户通过输入...

Global site tag (gtag.js) - Google Analytics