Object item = null; // 注意这一句!
if(event!=null)//event是主调函数传来的参数
item=event.getItem();
if(event==null || item==gui.quickpick)
{......}你提到的问题恰恰体现了java的安全性。
所有的对象都必须初始化。哪怕是被初始化成null(起码这样阅读程序的人知道你要它成为null)。至于你提到的短路运算,的确可以说得通,但是你想想啊,只看这一段代码,你的思路是清晰的,如果代码多了呢,夹杂在一堆堆的if和for或者try catch之间的时候,你还能够不依赖java的检查而保持思路清晰吗?

解决方案 »

  1.   

    还有这个句子:
    if(event==null || (Object item=event.getItem)==quickpick)
    //event是主调函数传来的ItemEvent型参数
    上面的句子也不行!为什么?我刚从VC转过来学java,如果问题很低级的话请原谅,因为这些语句在VC中太常见了。
      

  2.   

    item和quickpick的类型可能不同
    java中==用在两个对象之间,是比较这两个对象是否是同一个对象(即是否同一对象的引用)
      

  3.   

    item和quickpick的类型是相同的。原题如下:
    Object item=event.getItem();
    if(item==quickpick)
    .......
      

  4.   

    将item==quickpick最好改为item.equals(quickpick)
      

  5.   

    如果你的Object item;
    是在类底下定义的,我认为是没有问题的
    如果是在方法底下定义为局部变量,就必须要在方法中定义,你的方法中有选择语句,这不能保证在选择语句中的初始化语句item=event.getItem();一定会执行。所以抱错。第二个问题我认为楼上的说得是
      

  6.   

    我不明白为什么楼主要把
    Object item=event.getItem();
    if(item==quickpick)
    改成
    if(event==null || (Object item=event.getItem)==quickpick)
    个人觉得这属于找抽行为
      

  7.   

    darksmile(黑色长袍),我把item想定义成局部变量不行吗?这也是推荐的,只是不知道java为什么报错?而:
    for(int i=0;i<100;i++)
    却不报错!darksmile(黑色长袍)你的水平再高,也还是要注意自己的素质与个人修养,不然你水平再高也是狗肉上不了席的。ai92(抵制日货!!) 老师,对于你所说,我如下改正,还是有问题:
    if((Object item=event.getItem())==gui.quickpick)
    请问你做何解释呢?
      

  8.   

    对不起,是:
    if((Object item=event.getItem())==quickpick)
      

  9.   

    嘿嘿,我在csdn和人争论的次数多了,不过被人说是狗肉上不了席还是第一次。说实话,在csdn不管菜鸟还是大虾,自以为是的人还真不少。我为什么说“找抽”呢?因为我很反感某些人只会搞一些华而不实的所谓技巧,还来论坛卖弄的行为。争论起来还动不动拉专家的一两句话来做注脚,感觉和红卫兵用毛选中的个别字句来给人定罪差不多。好,言归正传。定义局部变量是推荐的,但是前提条件是搞清楚局部变量的作用域。
    在for(int i=0;i<10;i++)
    {
    }
    当中,i的作用域是整个循环体。在你的代码中呢?item的作用域是什么?还有,在完成应有功能的前提下,最重要的应该是语义清晰,结构完整。如果你多看一些经典代码,就知道很多地方虽然看起来写的很笨拙,明明一句能完成的非要用2,3句,但实际上无论从语义,结构,可扩展性上讲都非常好。
      

  10.   

    我觉得一开始让Object item=null;就好了啦
    这样就恨实际了
      

  11.   

    现在你把原来的两句话的代码和你并成一句以后的比较一下:
    那个看起来更清楚?那个更不容易出错?
    如果你的老师出这种题目考你:
    i = i+++j++;
    你会不会觉得他是找抽?
      

  12.   

    请问darksmile(黑色长袍),
    if(int i,....)
    {}
    在java中不代表一个作用域吗?我刚从VC转来,还受VC的影响。
    如果我不用:
    if(event==null || (Object item=event.getItem())==quickpick)
    那就要下成下面这样:
    Object item=null;
    if(event!=null)
    item=event.getItem();
    if(event==null || item.equals(quickpick)){}
    这样造成item成了该方法中任意访问的了。要说自以为是,从你自信的话语中,你应该感觉到你比我更自以为是,我来这里是问问题的,怎么会自以为是?我说过,我对java的机制问题不太清楚,因为刚开始,很大程度上受VC的影响。还好,现在我已找到问题的求解方法:
    if(event==null || quickpick.equals(event.getItem())){}
    你们开始这样告诉我不就行了吗?有些时候你回答问题不一定要看看它是否适合这样做,说不定作者是为了弄清某一事实而故意做的呢。
      

  13.   

    经过多次的调试,java的if语句中似乎就不能定义变量,哪位高人说说我这个结论对不对,如果对,那我只有记住它了(因为我对这种限定不太理解)。
      

  14.   

    记住java里局部变量一定要初始化就行了
      

  15.   

    casemy(jjjjjava),按你的说法,我在if语句中申请一个变量并初始化能行?可是我怎么通不过编译呢、
      

  16.   

    我问在if语句中是不是不能申请变量,即便是初始化了,也不行,通不过编译???
    如if(int i=1...)或向上面的:
    if((Object item=event.getItem())==quickpick)
      

  17.   

    类变量
      可以这样
      int i;
      System.out.println(i);
    局部变量
      只能这样
      public void test()
     {
        int j=12;
        int m;
        m=j;
        
      }你得不能通过编译是因为其他原因
      

  18.   

    经过多次的调试,java的if语句中似乎就不能定义变量,哪位高人说说我这个结论对不对,如果对,那我只有记住它了(因为我对这种限定不太理解)。
    ===========================================================================
    我算不上什么高人,不过我可以告诉你,这个结论是对的
    比较一下for和if
    在for(exp1;exp2;exp3)当中
    3个表达式都是 必然 被执行的
    在if(exp1 || exp2 || exp3)当中
    3个表达式 不一定 都被执行
    而且,哪个不会被执行 不能在编译期间判断!
    换句话说:java在编译的时候不知道你的Object item=event.getItem())==quickpick这句到底会不会被执行。在编译程序看来,item不仅可能未被初始化,还可能根本就不会得到声明。
    当然,在你举的例子当中,由于前面的event == null的限制,所以只要进入了判断分支,item就是被定义且初始化的,不过涉及到语法分析的原因,java编译程序并没有你想象的那么聪明。
      

  19.   

    更正一下,for(exp1;exp2;exp3)的exp3不一定被执行,省的有人挑刺
      

  20.   

    其实写在if里面的东东最好在外面进行先初始化一下,因为IF本身不一定被执行,倒不是你绝得符合人的思维就可以的,编译程序不会判断你在两个IF语句里面就是是什么逻辑关系.所以最好还是先在外面初始化一下比较好.
      

  21.   

    对于if语句中申请变量,你们一直都在给我说可能初始化不到,但我还是认为java机制就不允许在if语句中申请变量,如:
    if(int i=1){}
    i变量一定能得到初始化,但它还是错的。
    而在VC中似乎做得更好,它可以做类似于
    if((Object item=event.getItem())==quickpick)
    {
    //这里使用item
    }
    的判断。
    一个if语句,只要他不包含在另一个if语句中,则它一定会执行到,而if语句的条件判断式中就是申请变量和初始化变量,怎么可能执行不到呢?
      

  22.   

    当然,也存在这种可能,正如darksmile(黑色长袍)所说:
    在for(exp1;exp2;exp3)中,因为不能保证每个条件都执行到(如exp3),java干脆来个省事的办法:if语句中不让申请变量!
    这样有利于写编译器,但却出现了我所说的遗憾:
    if(exp1)
    if(exp1 && exp2)
    等这些理论上每个判断都能执行到的句子也被java拒之门外了!
      

  23.   

    不好意思,上面是说在if(exp1 || exp2 || exp3)中
      

  24.   

    我已经说的很清楚了:java编译程序并没有你想象的那么聪明!
    稍微有脑子的人都能分析出来i一定能被初始化,但是在java编译程序看来,它就是在条件当中,就是有可能不能执行到,毕竟这是编译期而非运行期!
    事实上java根本就不允许在条件中进行变量定义和初始化,理由如上。从你说话的语气我都可以感觉出来你带有VC程序员的通病:藐视其它开发语言及工具,如java,delphi,vb等等。为什么vc允许呢?因为c++是一种更加自由的语言,它允许通过值,引用和指针3种方式来传递变量,它允许未初始化的变量存在,它允许空指针,它甚至允许空引用:A * p = NULL;A& a = * p;
    相比之下 java的限制更多,但是更安全。
    既然你现在要用java,就要考虑:为什么java要有这样的限制,怎么样利用这种限制带来的好处。如果总是想:vc可以这样这样做,java就不行,那你还是回去玩VC去吧。
      

  25.   

    我现在正在找java与VC的不同之处,因为无论从语言的表达形式上,从书写格式上,从大家的口中等似乎都在说java和c非常相似,我其实并不这么认为,如果非常相似那怎么一个就c一个叫java呢。给我的感觉java功能太强大了,但灵活性与c相关甚远。记得在c中我存经教别人如何查看一个浮点数的二进制表示方法:
    float f=100.1//假设浮点数用4字节表示
    char* s;
    s=&f;
    然后分别打印出*s,*(s+1),*(s+2),*(s+3)的二进制(打印一个字符的二进制是件很容易的事了),排在一行,这就是f的内部表达形式,这在java中似乎有点难度了,除非它提供方法。目前我正在压抑我对这种灵活性的要求。
      

  26.   

    faint!!
    if( int i = 1 ) {
    }
    在上面的例子中,if得判断它后面的条件是否成立,而int i = 1;只是声明i变量并初始化i,它有返回值吗?是true or false?
      

  27.   

    当然,如果java中的表达式没有返回值的话就另当别论了。那这一点算是与C最大的不同点这之一了,由此推断java中没有逗号运算符吧?
      

  28.   

    同意 whyxx(永远成不了高手)