我写了一个小程序,为什么运行的结果跟Debug出来的结果不一样啊? 求解!!

时间:2022-01-28 11:29:26
package testfile;

import java.io.*;
public class TestIO {
    public TestIO() {
    }

    public static void main(String[] args) {
        TestIO testio = new TestIO();
        String FileName="d:\\javawork";
        File myFile=new File(FileName);
        if(!myFile.exists()){
            System.err.println("Can't Find "+FileName);
            return;
        }
        System.out.println("File "+FileName+ " is "+myFile.length()+" bytes Long !");
        if(myFile.isDirectory()){
            System.err.println("File "+FileName+" is a Directort !");
            return;
        }
    }
}


运行的结果为 : 
D:\Borland\JBuilder2006\jdk1.5\bin\javaw -classpath "D:\javawork\testFile\classes;D:\Borland\JBuilder2006\jdk1.5\lib\dt.jar;D:\Borland\JBuilder2006\jdk1.5\lib\tools.jar;D:\Borland\JBuilder2006\jdk1.5\lib\htmlconverter.jar;D:\Borland\JBuilder2006\jdk1.5\lib\jconsole.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\javaws.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\ext\sunjce_provider.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\ext\localedata.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\ext\sunpkcs11.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\ext\dnsns.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\plugin.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\deploy.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\im\thaiim.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\im\indicim.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\charsets.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\jsse.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\rt.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\jce.jar"  testfile.TestIO 
File d:\javawork is a Directort !
File d:\javawork is 0 bytes Long !


Debug的结果为:
D:\Borland\JBuilder2006\jdk1.5\bin\javaw -classpath "D:\javawork\testFile\classes;D:\Borland\JBuilder2006\jdk1.5\lib\dt.jar;D:\Borland\JBuilder2006\jdk1.5\lib\tools.jar;D:\Borland\JBuilder2006\jdk1.5\lib\htmlconverter.jar;D:\Borland\JBuilder2006\jdk1.5\lib\jconsole.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\javaws.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\ext\sunjce_provider.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\ext\localedata.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\ext\sunpkcs11.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\ext\dnsns.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\plugin.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\deploy.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\im\thaiim.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\im\indicim.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\charsets.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\jsse.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\rt.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\jce.jar"  -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=TEST_Z:4936,suspend=y testfile.TestIO 
File d:\javawork is 0 bytes Long !
File d:\javawork is a Directort !

9 个解决方案

#1


为什么没有人回答我的帖子啊,这问题比较,有供大家一起学习价值.

#2


原因在于使用System.out的时候,打印数据的线程和运行我们的程序的线程实际上不是同一个。到底谁先执行不是我们的程序可以控制的。

所以,如果两个打印的语句执行的debug的时候,时间间隔很短,就有可能顺序颠倒。而在debug的时候,由于每一步的执行时间间隔比run状态的要长,可以确保两个打印语句的实际执行顺序。

#3


“如果两个打印的语句执行的debug的时候”应该是“如果两个打印的语句执行的时候”

#4


将System.err.println改为System.out.println就正常了.

依原有err的处理, 我本地:
未设断点时:
File   d:\javawork   is   a   Directory   !
File   d:\javawork   is   0   bytes   Long   !

设断点步进时:
File   d:\javawork   is   0   bytes   Long   !
File   d:\javawork   is   a   Directory   !

关注!

#5


不同意2楼的观点, 我不设置断点连续运行十次, 就会出现十次:
File       d:\javawork       is       a       Directory       ! 
File       d:\javawork       is       0       bytes       Long       ! 
而不是随机顺序输出.

差异在于一个是out, 一个是err, 另:out的操作是同步操作, 而非异步.

#6


我说的也是err,手顺写错了。

正是因为err是异步执行,所以在当两个打印语句放在一起执行的时候,如果时间间隔很短,才会有可能顺序乱掉

#7


5楼的朋友能讲出 为什么在运行程序时 system.err 会比system.out 先打印出来.(system.err 在system.out语句的后面啊). 还是比较迷惘!!!

#8


out输出是带缓冲的
带缓冲不会立即输出, 会等到缓冲满, 或者被调用System.out.flush()才输出.
你试试在System.out.println 后面跟一个 System.out.flush()

#9


好象也没用, 缓冲是否输出, 要看操作系统是否允许。 程序没法控制.

#1


为什么没有人回答我的帖子啊,这问题比较,有供大家一起学习价值.

#2


原因在于使用System.out的时候,打印数据的线程和运行我们的程序的线程实际上不是同一个。到底谁先执行不是我们的程序可以控制的。

所以,如果两个打印的语句执行的debug的时候,时间间隔很短,就有可能顺序颠倒。而在debug的时候,由于每一步的执行时间间隔比run状态的要长,可以确保两个打印语句的实际执行顺序。

#3


“如果两个打印的语句执行的debug的时候”应该是“如果两个打印的语句执行的时候”

#4


将System.err.println改为System.out.println就正常了.

依原有err的处理, 我本地:
未设断点时:
File   d:\javawork   is   a   Directory   !
File   d:\javawork   is   0   bytes   Long   !

设断点步进时:
File   d:\javawork   is   0   bytes   Long   !
File   d:\javawork   is   a   Directory   !

关注!

#5


不同意2楼的观点, 我不设置断点连续运行十次, 就会出现十次:
File       d:\javawork       is       a       Directory       ! 
File       d:\javawork       is       0       bytes       Long       ! 
而不是随机顺序输出.

差异在于一个是out, 一个是err, 另:out的操作是同步操作, 而非异步.

#6


我说的也是err,手顺写错了。

正是因为err是异步执行,所以在当两个打印语句放在一起执行的时候,如果时间间隔很短,才会有可能顺序乱掉

#7


5楼的朋友能讲出 为什么在运行程序时 system.err 会比system.out 先打印出来.(system.err 在system.out语句的后面啊). 还是比较迷惘!!!

#8


out输出是带缓冲的
带缓冲不会立即输出, 会等到缓冲满, 或者被调用System.out.flush()才输出.
你试试在System.out.println 后面跟一个 System.out.flush()

#9


好象也没用, 缓冲是否输出, 要看操作系统是否允许。 程序没法控制.