java很诡异的一个问题

goodlucktomyself 2012-05-03 03:45:24
在:http://topic.csdn.net/u/20070828/10/7aa61fbc-8575-4212-85c4-582c08f81535.html,看到其中一道题如下:
public class Test {
  public static void main(String[] args) {
    for(int i = 0; i <= 10; i++)
       Integer k = new Integer(i);
    System.out.println( "Java Puzzlers ");
  }
}
,当我把代码拷贝至myeclipse中后,发现编译报错!原因是这句:Integer k = new Integer(i);
但是当我给for加上大括号时,改成这样:
for(int i = 0; i <= 10; i++) {
  Integer k = new Integer(i);
}
就不会报错了,感觉很纳闷,是JVM在作祟???
大家探讨下,此做何解????
...全文
167 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
MiceRice 2012-05-06
  • 打赏
  • 举报
回复
同8楼,我认为这就是编译器认为你在这种情况下,只能使用一句代码,没有合适的环境来定义“局部变量”。

如果你这样就能通过编译了:
for(int i = 0; i <= 10; i++) new Integer(i);
dracularking 2012-05-06
  • 打赏
  • 举报
回复
同意ticmy
编译层次的有限优化行为

for(int i = 0; i <= 10; i++) {
Integer k = new Integer(i);
}

对于这种本质上与没有大括号其实没啥区别,但是javac就懒得管这种了
龙四 2012-05-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 1 楼 的回复:

《java解惑》中有

看了下这个文档,好像对这个的解释也不是很详细,也是笼统的介绍了下:“Java 语言规范不允许一个本地变量声明语句作为一条语句在 for、wh ile 或 do 循环中重复执行;一个本地变量声明作为一条语句只能直接出现在一个语句块中” ,如果得真的想搞明白此问题,还得好好研究下java规范,JVM等.
[/Quote]

只是编译通不过而已,换句话说也就是javac给了它限制

我换个编译器,如javassist,应该就编译通过了

在运行层次上这种写法是没有问题的
for(int i = 0; i <= 10; i++)
       Integer k = new Integer(i);

为什么要给出这么个限制?
个人认为
这种写法,k是局部变量,作用域极小,下个循环就超出作用域了,javac可能认为这并不是你想要的行为(循环声明一个变量,又肯定不会去用它),于是就不让你编译通过,避免粗心造成的错误
goodlucktomyself 2012-05-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

《java解惑》中有
[/Quote]
看了下这个文档,好像对这个的解释也不是很详细,也是笼统的介绍了下:“Java 语言规范不允许一个本地变量声明语句作为一条语句在 for、wh ile 或 do 循环中重复执行;一个本地变量声明作为一条语句只能直接出现在一个语句块中” ,如果得真的想搞明白此问题,还得好好研究下java规范,JVM等.
VanBaston 2012-05-03
  • 打赏
  • 举报
回复
所以很多都建议不要去省略大括号,哪怕是循环语句if语句这些语句好变就一条执行语句的时候也不要省略大括号。
VanBaston 2012-05-03
  • 打赏
  • 举报
回复

Integer k;
for(int i = 0; i <= 10; i++)
k = new Integer(i);
System.out.println( "Java Puzzlers ");

你这么写也不会报错!
我觉得应该是在建立对象的时候,你没加大括号的话,第一次循环管的时候,在栈里建立一个引用k,第二次循环的时候又会建立一个引用k,这个时候前一个引用k还存在,这样会产生冲突。
而加了大括号后,在第一次循环的时候在栈中建立了一个引用k,但是在遇到后边的大括号后,生命周期结束被释放掉,然后进入第二次循环,又一次在栈中建立了引用k,但是前一个引用k已经释放掉,不会产生冲突,所以不报错。
流狼 2012-05-03
  • 打赏
  • 举报
回复
很有意思
  • 打赏
  • 举报
回复
牵涉到内存溢出,垃圾回收等问题。
龙四 2012-05-03
  • 打赏
  • 举报
回复
找了下:谜题55
龙四 2012-05-03
  • 打赏
  • 举报
回复
《java解惑》中有

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧