Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 814|回复: 0

常见十大代码错误整理

[复制链接]

该用户从未签到

发表于 2011-8-3 23:13:14 | 显示全部楼层 |阅读模式
技术人常见十大代码错误整理
作为初级的java开发者,也许你的经验不足,也许因为你的一时疏忽给公司、项目造成了损失,那么这是无法原谅的。作为技术人员,只有不断的学习,提升自己的技术水平,才能为自己、为公司创造更高的价值。下面是笔者整理的Java常见的十大代码错误,希望对大家有所帮助!

  1、在静态方法中访问非静态的成员变量(例如在main方法中)

  有很多刚刚接触Java的程序员都会有一问题,就是在main方法中访问成员变量。Main方法一般都被标示为“静态的”,意思就是我们不需要实例化这个类来调用main方法。例如,java虚拟机能够以这样的形式来调用MyApplication类:

  MyApplication.main ( 命令行参数 );
  这里并没有实例化MyApplication类,或者这里没有访问任何的成员变量。例如下面的程序就会产生一个编译器的错误。

    public class StaticDemo
    ...{
    public String my_member_variable = "somedata";
    public static void main (String args[])
    ...{
    // Access a non-static member from static method
    System.out.println ("This generates a compiler error" +
    my_member_variable );
    }
   }
  如果你要访问一个静态方法中的成员变量(比如main方法),你就需要实例化一个对象。下面这段代码示例了如何正确的访问一个非静态的成员变量,其方法就是首先实例化一个对象。

public class NonStaticDemo
    ...{
    public String my_member_variable = "somedata";
    public static void main (String args[])
    ...{
    NonStaticDemo demo = new NonStaticDemo();
    // Access member variable of demo
    System.out.println ("This WON'T generate an error" +
    demo.my_member_variable );
    }
    }
  2、在重载的时候错误的键入方法名重载允许程序员用新的代码去覆盖方法的实现

  重载是一个便利的特性,很多面对对象的程序员都在大量的使用它。如果你使用AWT1.1的事件处理模型,你通常会覆盖listener方法去实现定制的功能。一个在重载方法的时候很容易犯的错误就是错误的键入要重载的方法名。如果你错误的输入了方法名,你就不是在重载这个方法了。相反的,你是在重新定义一个方法,只不过这个方法的参数和返回类型和你要重载的方法相同罢了。

    public class MyWindowListener extends WindowAdapter ...{
    // This should be WindowClosed
    public void WindowClose(WindowEvent e) ...{
    // Exit when user closes window
    System.exit(0);
    }
    }
  这个方法不会通过编译,很容易就能捕捉找它。在过去我曾经注意过一个方法,并且相信它是被调用的,花了很多时间找这个错误。这个错误的表现就是你的方法不会被调用,你会以为你的方法已经被跳过了。一种可行的解决方法就是增加一条打印输出语句。在日志文件中记录下信息。或者是使用跟踪调试程序(例如VJ++或者是Borland JBuilder)来一行一行的调试。如果你的方法还不能被调用,那很可能就是你的方法名键入错误了。

  3、比较和分配(“=”强于“==”)

  这是一个很容易犯的错误。如果你以前使用过别的语言,比如Pascal,你就会知道计算机语言的设计们选择这样的方式是何等的乏味。举个例子,在Pascal中,我们使用:=运算符来表示分配,而使用=来表示比较。这样好像是退回了C/C++,也就是java的起源。

  幸运的是,即使你没有发现在屏幕上发现这个错误,你的编译器会帮助你发现它。通常情况下,编译器会报出这样一个错误信息:“不能转换xxx到布尔类型”,这里的XXX是你用来代替比较的java类型。

  4、比较两个对象(用==来代替instead of)

  当我们使用==运算符的时候,我们实际上是在比较两个对象的引用,来看看他们是不是指向的同一个对象。举个例子,我们不能使用==运算符来比较两个字符串是否相等。我们应该使用。equals方法来比较两个对象,这个方法是所有类共有的,它继承自java.lang.Object。

  下面是比较两个字符串相等的正确的方法:

    // Bad way
    if ( (abc + def) == "abcdef" )
    ...{
    ……
    }
    // Good way
    if ( (abc + def)。equals("abcdef") )
    ...{
    ……
    }
  5、混淆值传递和引用传递

  这是一个不太容易发现的错误。因为,当你看代码的时候,你会十分确定这是一个引用传递,而它实际上却是一个值传递。Java这两者都会使用,所以你要理解你什么时候需要值传递,什么时候需要引用传递。当你要传递一个简单的数据类型到一个函数中,比如,char、int、float或者double,你是在传递一个值。这个意味着这种数据类型的被复制了一个拷贝,是这个拷贝被传递到了函数中。如果这个函数去修改这个值,仅仅是这个值的拷贝被修改了。这个函数结束以后,将会返回到控制调用函数去,这时候那个“真正的”值没有受到影响,没有任何改变被存储。

  如果你想修改一个简单的数据类型,可以将这个数据类型定位一个返回值或者将它封装到一个对象中。

  当你要传递一个java对象到一个函数中,比如,数组、向量或者是一个字符串,此时你传递的就是一个对象的引用。这里的字符串也是一个对象,而不是一个简单数据类型。这就意味这你要传递一个对象到一个函数,你就要传递这个对象的引用,而不能去复制它。任何对这个对象的成员变量的改变都会持久化,这种改变的好坏要取决于你是否是刻意而为之。

  有一点要注意,如果字符串没有包含任何方法改变它的值的时候,你最好将它作为值来传递。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-26 22:53 , Processed in 0.407736 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表