日期:2014-05-20  浏览次数:20825 次

java很诡异的一个问题
在: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在作祟???
大家探讨下,此做何解????

------解决方案--------------------
《java解惑》中有
------解决方案--------------------
牵涉到内存溢出,垃圾回收等问题。
------解决方案--------------------
很有意思
------解决方案--------------------
Java code

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

------解决方案--------------------
所以很多都建议不要去省略大括号,哪怕是循环语句if语句这些语句好变就一条执行语句的时候也不要省略大括号。
------解决方案--------------------
探讨

引用:

《java解惑》中有

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

------解决方案--------------------
同意ticmy
编译层次的有限优化行为

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

对于这种本质上与没有大括号其实没啥区别,但是javac就懒得管这种了
------解决方案--------------------
同8楼,我认为这就是编译器认为你在这种情况下,只能使用一句代码,没有合适的环境来定义“局部变量”。

如果你这样就能通过编译了:
for(int i = 0; i <= 10; i++) new Integer(i);