Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA:计算执行时间时出现运行时错误_Java_Execution Time - Fatal编程技术网

JAVA:计算执行时间时出现运行时错误

JAVA:计算执行时间时出现运行时错误,java,execution-time,Java,Execution Time,我一直在做一个项目来说明使用Scanner读取输入比使用缓冲读取器慢,而缓冲读取器又比使用我们自己的函数慢,后者使用适当的操作来解析整数。为此,我记下了每种情况下读取输入的执行时间 long startTime,endTime,duration; startTime=System.nanoTime(); /* Reading input via scanner */ endTime=System.nanoTime(); duration = endTime - startTime;

我一直在做一个项目来说明使用Scanner读取输入比使用缓冲读取器慢,而缓冲读取器又比使用我们自己的函数慢,后者使用适当的操作来解析整数。为此,我记下了每种情况下读取输入的执行时间

long startTime,endTime,duration;

startTime=System.nanoTime();
/* Reading input via scanner */     
endTime=System.nanoTime();
duration = endTime - startTime;
System.out.println(duration); 

startTime=System.nanoTime();
/* Reading input via buffered reader */     
endTime=System.nanoTime();
duration = endTime - startTime;
System.out.println(duration); 

startTime=System.nanoTime();
/* Reading input via own function for I/O */     
endTime=System.nanoTime();
duration = endTime - startTime;
System.out.println(duration); 
如果我试着在一个程序中运行这三个程序,我会在上面的代码中遇到运行时错误。但是,如果我一次使用一种方法,效果很好。我怀疑我计算执行时间的方法有问题。请帮忙


这是我的代码

您的代码假设扫描仪只消耗了实际需要的输入流。然而,看起来扫描仪实际上是在缓冲输入。换句话说,当您尝试使用InputReader读取第二行输入时,扫描仪已经从标准输入读取并存储在缓冲区中。因此,当您的InputReader尝试读取标准输入时,没有数据可读取

使用BufferedReader的代码很可能会做出相同的假设

最好为每个测试使用单独的输入流,而不是共享一个流。这样,在将流传递给下一个读卡器之前,您就不必担心一个读卡器从流中读取了多少数据。System.in不是一个好的选择,因为它们只有一个。最好使用诸如ByteArrayInputStream之类的流,它从字节数组创建InputStream。例如,您可以使用以下方法创建用于测试目的的流:

    // Add this to your Main class.
    private static InputStream getTestStream() {
        return new ByteArrayInputStream("1 2 3 4 5 6 7 8 9 10".getBytes(Charset.forName("UTF-8")));
    }
然后通过调用此方法设置扫描仪和InputReader以及BufferedReader:

    InputReader in = new InputReader(getTestStream());
    // ...
    Scanner sc=new Scanner(getTestStream());

我对您的代码进行了这些更改,代码运行成功。

您能发布堆栈跟踪吗?您在注释中输入的代码可能是问题的根源。请把它也贴出来。如果你不告诉我们错误是什么,这很难帮助我们。在我看来,错误来自读取输入的代码。你是在读stdin还是打开一个文件?您是否为每个方法使用单独的文件读取器?如果是这样的话,你怎么打开它,还记得关闭它吗?嗯,是你写的代码抛出了输入不匹配异常:如果c<0'| c>9'。所以只要根据你的需要来修理它。