[英]java program stops without error
我有一个非常简单的程序,它将选择排序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]);
}
}
}
这将运行,在控制台上打印“ Array Created”和“ Sorting Started”,进行一两秒钟,然后停止。 没有错误或警告。 不打印“完成排序”或类似的操作。 应该打印“ Finished the sort”,然后从watch.getElapsedTime()返回的经过时间(StopWatching类的对象有效,已经在其他环境中进行了测试)。
有人可以在这里指出我在做什么错吗?
注意:watch.getElapsedTime()的返回类型是Long,它是从创建手表到调用watch.stop()方法(通过使用GregorianCalendar类)计算的时间,以毫秒为单位。
PS我正在使用Eclipse IDE
问题是Eclipse的GUI控制台输出。
编码
for (int i = 0; i < numbers.length; i++) {
System.out.print(numbers[i]);
}
在一行中打印100000个数字。 在OS控制台中使用java
运行时,这没有问题。
但是,在Eclipse中完成操作后,控制台将关闭,并删除以前的所有打印输出。
这是我第一次尝试分析:
我猜该程序没有停止,但仍在运行。 循环的内部执行了100000 * 100000次。
在Eclipse中,使用调试视图查看程序是否已停止或仍在运行。
该程序运行正常。 Eclipse控制台显示的输出太多了。 如果从命令行运行它,然后将输出重定向到文件> output.txt,那么will输出将正确显示。
您还可以在Eclipse中看到输出的一部分,用StringBuilder替换System.out.println,将整个输出附加如下,
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中。
有时打印换行符(此处为println)。 这将刷新输出缓冲区。
for (int i = 0; i < numbers.length; i++) {
System.out.println(numbers[i]);
}
备注:最好是使用原始类型int:
int[] numbers = new int[howManyNumbers];
Integer是int值的包装器类。 否则使用:
Integer temp = ...
会立即进行整数/整数转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.