关于While嵌套中的一些问题记录

当我在写毕业设计的时候,我在编写while语句嵌套的时候,出现了如下的问题。先做下记录,为了以后如若找到答案,可以进行再次更新。 郭

问题是这样子的:

编写格式

//完成功能:flag是一个可由外界控制的值,起始时flag=false(boolean类型),flag可以随外
//界的赋值而改变,当赋值flag=true时,可以输出`flag: true`的程序结果
while(true){
    while(flag){
        System.out.println("flag: "+flag);
    }
} 

测试一:

现源代码A是:

while (true){
    while (start_flag) {
        System.out.println("start_flag: "+start_flag);
    }
}
//代码如此书写但是无论怎么运行,都无法将println后的数据成功输出
//注意:我说的是运行(run!!!),这段代码用Debug是完全正常的!!!!

所以我查看了源代码A对应的class文件A—class的编译数据是

while(true) {
    while(!start_flag) {
        ;
    }
    System.out.println("start_flag: " + start_flag);
}
//按道理来说呢,这个程序执行应该是正确的对不对?!!!
//但是为什么程序执行结果就是不对呢???

测试二:

源代码B

while(true) {
    while(!start_flag) {
        ;
    }
    System.out.println("start_flag: "+start_flag);
}
//这时候,我们把A-class文件作为源代码B进行再次编译

源代码B编译的class文件B-class

while(true) {
    while(true) {//这个true是因为一开始!start_flag得到的
        if(start_flag) {
            System.out.println("start_flag: "+start_flag);
        }
    }
//很明显,我们可以看出来这个从逻辑上来说,也是正确的。
//所以这下问题来了,问题出在哪里呢?!!!
//我也不知道 !!!!

测试三:

对以上的问题,我们在Debug中是找不出问题来的,通过class文件分析也得不到答案,因此,这个问题的求知上已然gg。
但是对于这个问题是有解决的办法的!!!

源代码C

while (true){
   Thread.sleep(000);//或者替换为以下这句话都是可以的。
   //System.out.println("");
    while (start_flag) {
        System.out.println("start_flag: "+start_flag);
    }
}

源代码C编译得到的class文件c-class

while(true) {
    Thread.sleep(0L);
    while(start_flag) {
        System.out.println("start_flag: "+start_flag);
    }
}
//在这个class文件中的处理是不是逻辑是对的,而且执行结果也是正确的。
//至少源码AB错在哪里,我也不知道

结论:

这是一种莫名其妙的错误,我也不知道为什么。所以在此做下记录,往后若有机会解决可以来此记录解决方案。

相关的测试文件下载地址

GUITest.java

阵头