Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

不积圭步,无以至千里 -- Java(1)

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]

  (引言)

  经常听到这样的对话:"你会Weblogic, Oracle, XML, Kylix, 等等吗?不会?你好差。这么先进的技术怎么能不会?"往往我们也能在看到很多简历,自称精通某某,某某某技术, 乍一看下来,简直是绝顶高手,精通了所有流行的先进技术。但是我常常想,就算是不吃饭不睡觉也不可能在短短时间里精通那么多范围极广,博大精深的技术啊。而我自己,却常常在实际工作中遇到一些问题,让我不得不想起基础知识的重要性。我在这里不是要打击大家学习先进技术的热情,而是为了强调一下基础知识的重要。比如,有很多的java程序员在使用JBuilder, WebLogic, WebSphere, SilverStream,写普通的java程序或者写j2ee, corba结构的程序。在但是,在掌握先进技术的同时,我们也要注重一下基础的修炼,免得不断出现本可以避免的错误。我将陆续写一系列的文章,关于java编程常见问题。这些,都是我在日常工作中积累下来的一些笔记,不成体系(我尽量将它们按照范围不同组织一下), 严格的说,不能叫做文章吧。大家随便看看。呵呵。

  (内容)

  先来看一个常见的错误.


public boolean testAns(String ans, int n){
boolean rslt;
if( ans.equalsIgnoreCase("YES") && n > 5) 
rslt = true;
return rslt;
}

  程序逻辑方面并没有问题,但是编译的时候会出现错误提示:


variable rslt might not have been initialized
return rslt;
       ^

  这是因为,当if条件为false的时候,rslt可能会没有被赋予初值,而return的时候则会出错。java编译器很聪明的检查了这一错误并在编译的时候给予了提示。这需要你在声明rslt的时候或者在返回rslt之前给它赋值。

  比如:


public boolean testAns(String ans, int n){
boolean rslt = false;
if( ans.equalsIgnoreCase("YES") && n > 5) 
rslt = true;
return rslt;
}

  相关的问题还有:


public boolean testAns(String ans, int n){
boolean rslt = true;
while(false){rslt = false;}
for(;false;){rslt = false;}
if(false) {rslt = false;}
return rslt; 
}

  则Java编译器会提示


unreachable statement
while(false){rslt = false;}
    ^
unreachable statement
for(;false;){rslt = false;}
    ^

  但是if(false)这一段则没有错误提示,编译通过。这也是要注意的一点。

  第二个例子:class Object 中有一个方法equals()

  public boolean Object.equals(Object) 它检查object reference是否相同,也就是说是否指向同一个对象。如果是,则返回true, 否则返回false. 而每一个继承class Object的类都会override这个方法。比如在Long, Integer等class中,equals比较该Ojbect是否相应的是Long, Integer类型。如果类型相同,值比较所包裹的值是否相同。如果相同,则返回true, 否则返回false.要注意的是,返回false并不说明所包裹的值不相同,也可能是类型不同。比如下面代码:


Long l = new Long(7);
Integer j = new Integer(7);
if(l.equals(j)) System.out.println("Equal");
else System.out.println("Not Equal");

  编译成功,但是输出为Not Equal, 这就是因为类型不同, 不是同为Integer或者同为Long.

  再看一下使用instanceof要注意的问题. instanceof是判断一个对象的引用(reference)是否某一类型。比如


Integer i = new Integer(0);
System.out.println( i instanceof Integer);

  返回为true,因为i是一个Integer的对象的引用。


Integer i = new Integer(0);
System.out.println( i instanceof Long);

  则返回为false, 因为i不是一个Long的对象的引用。

  但是,


Integer i = null;
System.out.println( i instanceof Integer);

  返回值为false. 这是因为i的值为null, null不是任何对象的引用。这是需要注意的。

  第四个问题,是在邮件列表,news groups中提到次数比较多的一个问题,也是很多初学java编程的人常常遇到的一个问题。以下这段代码,编译会出现错误。


byte x = 100;
switch(x) {
case 100:
case 200:
case 300:
}

  编译器提示


a1.java:6: possible loss of precision
found : int
required: byte
case 200:
     ^
a1.java:7: possible loss of precision
found : int
required: byte
case 300:
     ^


 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:《UNIX系列系统入侵教程》之一   下一篇:不积圭步,无以至千里 -- Java(2)

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章