java程序停止没有错误

时间:2015-11-27 11:48:13

标签: java eclipse

我有一个非常简单的程序,可以选择排序100000个数字所需的时间。 这是代码:

import java.util.Calendar;
import java.util.GregorianCalendar;

public class Stopwatch {

    public static void main(String[] args) {
        // Create a stopwatch
        int howManyNumbers = 100000;
        Integer[] numbers = new Integer[howManyNumbers];
        for (int i = 0; i < numbers.length; i++)    {
            numbers[i] = (int)(100 * Math.random());
        }
        System.out.println("Array created");
        StopWatching watch = new StopWatching();

        System.out.println("Sorting started");
        for (int i = 0; i < numbers.length; i++ )   {
            for (int j = i; j < numbers.length; j++)    {
                if (numbers[j] < numbers[i])    {
                    int temp = numbers[i];
                    numbers[i] = numbers[j];
                    numbers[j] = temp;
                }
            }
        }
        System.out.print("Finished the sort");
        watch.stop();
        System.out.println();
        System.out.println(watch.getElapsedTime());
        for (int i = 0; i < numbers.length; i++)    {
            System.out.print(numbers[i]);
        }

    }

}

这会运行,打印&#34; Array Created&#34;和&#34;排序已开始&#34;到控制台,一两秒钟,然后停止。没有错误或警告。不打印&#34;完成排序&#34;或类似的东西。 它应该打印&#34;完成排序&#34;,然后从watch.getElapsedTime()返回的时间(StopWatching类的对象,其工作,已在其他环境中测试)。

任何人都能说出我在这里做错了吗?

注意:watch.getElapsedTime()的返回类型是Long,它是从创建监视时到调用watch.stop()方法时计算的时间(以毫秒为单位)。<使用GregorianCalendar类。 / p>

P.S。我正在使用eclipse IDE

3 个答案:

答案 0 :(得分:5)

问题是Eclipse的GUI控制台输出。

代码

for (int i = 0; i < numbers.length; i++)    {
    System.out.print(numbers[i]);
}

在一行中打印100000个数字。 在OS控制台中使用java运行时没有问题。

但是当在Eclipse中完成时,控制台只关闭一个以前的打印输出。

这是我第一次尝试分析:

我猜程序没有停止但仍在运行。循环的内部执行100000 * 100000次。

在Eclipse中使用调试视图来查看程序是否已停止或仍在运行。

答案 1 :(得分:3)

程序运行正常。 Eclipse控制台显示的输出太多了。 如果从命令行运行它并将输出重定向到文件&gt; output.txt,输出将正确显示。

您还可以在Eclipse中看到部分输出替换System.out.println,并使用StringBuilder附加整个输出,如下所示

    StringBuilder sb = new StringBuilder(2048);
    sb.append("Array created\n");

    sb.append("Sorting started");
    for (int i = 0; i < numbers.length; i++) {
        for (int j = i; j < numbers.length; j++) {
            if (numbers[j] < numbers[i]) {
                int temp = numbers[i];
                numbers[i] = numbers[j];
                numbers[j] = temp;
            }
        }
    }
    sb.append("Finished the sort\n");
    for (int i = 0; i < numbers.length; i++) {
        sb.append(numbers[i]);
        sb.append(", ");
    }
    System.out.println(sb);

或者在Eclipse控制台中,右键单击“属性”,“复选框限制控制台输出”以取消选中(默认选中),所有输出都将显示在Eclipse中。

enter image description here

答案 2 :(得分:2)

有时打印换行符(此处为println)。这会刷新输出缓冲区。

   for (int i = 0; i < numbers.length; i++)    {
        System.out.println(numbers[i]);
   }

一句话:最好的方法是使用基本类型int:

    int[] numbers = new int[howManyNumbers];

Integer是int值的包装类。 否则使用:

    Integer temp = ...

瞬间进行Integer / int转换。