【问题标题】:Java program does not terminate?Java程序不终止?
【发布时间】:2018-04-13 11:44:35
【问题描述】:

我最近购买了一台新的 64 位 Windows 笔记本电脑,我需要对其进行设置。在尝试设置 Java 和工作 IDE 时,我遇到了以下问题:

我有一个非常简单的测试程序,我尝试在 Eclipse Oxygen 3.0 中运行(也在 IntelliJ 中尝试过,但出现了同样的问题):

public class MinSuche {

    public static void main(String[] args) {
        int[] feld = {12, 18, 19, 22, 1, 37, 5};
        int min = feld[0];
        int a = 1;
        while(a<feld.length){
            if(feld[a]<min){
                System.out.println(min);
                min = feld[a];
                a++;
            }
        }
        System.out.println(min);
    }
}

编译器合规级别设置为 1.8,我正在使用 jdk1.8.0_161(也尝试过 Java 9,同样的问题;我的 Eclipse 显然还不能处理 Java 10)。现在的问题:

它不会自行终止,并且 System.out.println-commands 的结果不会显示在控制台中。我没有收到任何错误,也没有找到任何其他关于可能出错的提示,但我觉得这与代码没有任何关系。该过程只会继续运行几分钟(如果我允许的话,甚至可能是几个小时),直到我手动终止它,在整个运行过程中控制台上什么都没有显示。

以前有人遇到过这种情况吗?可能是什么问题呢?还是我在代码中遗漏了什么?请帮忙,我需要在我的 PC 上运行 Java IDE!

【问题讨论】:

  • a++移出if。你永远不会停止循环
  • 学习使用调试器,轻松发现此类bug。
  • 我还建议使用for 而不是while,这样更习惯。
  • 我会听取您的建议。以前不经常用。

标签: java eclipse search


【解决方案1】:

这很简单:a++ 永远不会被执行,因为feld[a] (18) 不小于 min (12)。您需要将此语句移出 if 语句

【讨论】:

    【解决方案2】:

    让我们一步一步来看看发生了什么:

    迭代 1:

    a=1
    min=12
    feld[a]=18
    

    迭代 2:

    a=1
    min=12
    feld[a]=18
    

    迭代 3,4,5....:

    a=1
    min=12
    feld[a]=18
    

    您需要在if 块之外增加a,否则它永远不会遍历整个数组。

        while(a<feld.length){
            if(feld[a]<min){
                System.out.println(min);
                min = feld[a];
            }
            a++;
        }
    

    使用调试器很容易发现这一点。

    【讨论】:

    • 哇.. 我出丑了。嗯,谢谢,我猜^^;
    【解决方案3】:

    @jhamon 和@JeroenSteenbeeke 已经指出您需要将a++ 移出if 块。

    我想补充一点,你最好在这里使用for循环而不是while

    public static void main(String[] args) {
            int[] feld = {12, 18, 19, 22, 1, 37, 5};
            int min = feld[0];
            int a = 1;
            for (int a = 1; a < feld.length; a++) {
                if(feld[a]<min){
                    System.out.println(min);
                    min = feld[a];
                }
            }
            System.out.println(min);
        }
    

    这是比较惯用的,可能看起来并不重要。但我的观点是,如果您使用for 循环,您很可能不会犯您所犯的错误。 (哦,我的英语,我希望过去条件时态的时态在这里有意义。)

    【讨论】:

    • 时态非常合理(我至少理解您想说的话),是的,连同更频繁地使用调试器的建议,这将是我从这个小小的疏忽中得到的。谢谢。
    【解决方案4】:

    只需从 if 块中删除 a++ 并将其放在 if 块之后,如下所示。然后您的程序将按您的预期正常工作。您的 JDK 或 IDE 没有任何问题。谢谢!

    while(a<feld.length){
            if(feld[a]<min){
                System.out.println(min);
                min = feld[a];
            }
            a++;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-22
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      相关资源
      最近更新 更多