Object item = null; // 注意这一句!
if(event!=null)//event是主调函数传来的参数
item=event.getItem();
if(event==null || item==gui.quickpick)
{......}你提到的问题恰恰体现了java的安全性。
所有的对象都必须初始化。哪怕是被初始化成null(起码这样阅读程序的人知道你要它成为null)。至于你提到的短路运算,的确可以说得通,但是你想想啊,只看这一段代码,你的思路是清晰的,如果代码多了呢,夹杂在一堆堆的if和for或者try catch之间的时候,你还能够不依赖java的检查而保持思路清晰吗?
if(event!=null)//event是主调函数传来的参数
item=event.getItem();
if(event==null || item==gui.quickpick)
{......}你提到的问题恰恰体现了java的安全性。
所有的对象都必须初始化。哪怕是被初始化成null(起码这样阅读程序的人知道你要它成为null)。至于你提到的短路运算,的确可以说得通,但是你想想啊,只看这一段代码,你的思路是清晰的,如果代码多了呢,夹杂在一堆堆的if和for或者try catch之间的时候,你还能够不依赖java的检查而保持思路清晰吗?
if(event==null || (Object item=event.getItem)==quickpick)
//event是主调函数传来的ItemEvent型参数
上面的句子也不行!为什么?我刚从VC转过来学java,如果问题很低级的话请原谅,因为这些语句在VC中太常见了。
java中==用在两个对象之间,是比较这两个对象是否是同一个对象(即是否同一对象的引用)
Object item=event.getItem();
if(item==quickpick)
.......
是在类底下定义的,我认为是没有问题的
如果是在方法底下定义为局部变量,就必须要在方法中定义,你的方法中有选择语句,这不能保证在选择语句中的初始化语句item=event.getItem();一定会执行。所以抱错。第二个问题我认为楼上的说得是
Object item=event.getItem();
if(item==quickpick)
改成
if(event==null || (Object item=event.getItem)==quickpick)
个人觉得这属于找抽行为
for(int i=0;i<100;i++)
却不报错!darksmile(黑色长袍)你的水平再高,也还是要注意自己的素质与个人修养,不然你水平再高也是狗肉上不了席的。ai92(抵制日货!!) 老师,对于你所说,我如下改正,还是有问题:
if((Object item=event.getItem())==gui.quickpick)
请问你做何解释呢?
if((Object item=event.getItem())==quickpick)
在for(int i=0;i<10;i++)
{
}
当中,i的作用域是整个循环体。在你的代码中呢?item的作用域是什么?还有,在完成应有功能的前提下,最重要的应该是语义清晰,结构完整。如果你多看一些经典代码,就知道很多地方虽然看起来写的很笨拙,明明一句能完成的非要用2,3句,但实际上无论从语义,结构,可扩展性上讲都非常好。
这样就恨实际了
那个看起来更清楚?那个更不容易出错?
如果你的老师出这种题目考你:
i = i+++j++;
你会不会觉得他是找抽?
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())){}
你们开始这样告诉我不就行了吗?有些时候你回答问题不一定要看看它是否适合这样做,说不定作者是为了弄清某一事实而故意做的呢。
如if(int i=1...)或向上面的:
if((Object item=event.getItem())==quickpick)
可以这样
int i;
System.out.println(i);
局部变量
只能这样
public void test()
{
int j=12;
int m;
m=j;
}你得不能通过编译是因为其他原因
===========================================================================
我算不上什么高人,不过我可以告诉你,这个结论是对的
比较一下for和if
在for(exp1;exp2;exp3)当中
3个表达式都是 必然 被执行的
在if(exp1 || exp2 || exp3)当中
3个表达式 不一定 都被执行
而且,哪个不会被执行 不能在编译期间判断!
换句话说:java在编译的时候不知道你的Object item=event.getItem())==quickpick这句到底会不会被执行。在编译程序看来,item不仅可能未被初始化,还可能根本就不会得到声明。
当然,在你举的例子当中,由于前面的event == null的限制,所以只要进入了判断分支,item就是被定义且初始化的,不过涉及到语法分析的原因,java编译程序并没有你想象的那么聪明。
if(int i=1){}
i变量一定能得到初始化,但它还是错的。
而在VC中似乎做得更好,它可以做类似于
if((Object item=event.getItem())==quickpick)
{
//这里使用item
}
的判断。
一个if语句,只要他不包含在另一个if语句中,则它一定会执行到,而if语句的条件判断式中就是申请变量和初始化变量,怎么可能执行不到呢?
在for(exp1;exp2;exp3)中,因为不能保证每个条件都执行到(如exp3),java干脆来个省事的办法:if语句中不让申请变量!
这样有利于写编译器,但却出现了我所说的遗憾:
if(exp1)
if(exp1 && exp2)
等这些理论上每个判断都能执行到的句子也被java拒之门外了!
稍微有脑子的人都能分析出来i一定能被初始化,但是在java编译程序看来,它就是在条件当中,就是有可能不能执行到,毕竟这是编译期而非运行期!
事实上java根本就不允许在条件中进行变量定义和初始化,理由如上。从你说话的语气我都可以感觉出来你带有VC程序员的通病:藐视其它开发语言及工具,如java,delphi,vb等等。为什么vc允许呢?因为c++是一种更加自由的语言,它允许通过值,引用和指针3种方式来传递变量,它允许未初始化的变量存在,它允许空指针,它甚至允许空引用:A * p = NULL;A& a = * p;
相比之下 java的限制更多,但是更安全。
既然你现在要用java,就要考虑:为什么java要有这样的限制,怎么样利用这种限制带来的好处。如果总是想:vc可以这样这样做,java就不行,那你还是回去玩VC去吧。
float f=100.1//假设浮点数用4字节表示
char* s;
s=&f;
然后分别打印出*s,*(s+1),*(s+2),*(s+3)的二进制(打印一个字符的二进制是件很容易的事了),排在一行,这就是f的内部表达形式,这在java中似乎有点难度了,除非它提供方法。目前我正在压抑我对这种灵活性的要求。
if( int i = 1 ) {
}
在上面的例子中,if得判断它后面的条件是否成立,而int i = 1;只是声明i变量并初始化i,它有返回值吗?是true or false?