【问题标题】:Restarting While Loop after false boolean in Java在 Java 中的 false boolean 之后重新启动 While 循环
【发布时间】:2014-11-09 20:45:07
【问题描述】:

我正在为学校做一项作业,要求我们找出十个数字中最大的一个。数字在 0-9 之间。我相信我把那部分记下来了。我的问题是我正在尝试添加作业不需要的额外功能。在布尔语句为假并给出错误消息后,我试图让循环完全重新启动。在我输入无效值后,它会给出错误消息,但在我按“确定”后,它会继续到下一个数字。我希望它在循环的开头重新开始。

代码如下:

package Largest;

import java.util.Scanner;
import javax.swing.JOptionPane;

public class LargestMain {

    public static void main(String[] args) {

    int number = 0;
    String numStr = "";
    int []myArray = new int[10];
    int count = 1;
    int largest = 0;
    boolean valid = false;

    while(valid == true); {  // Loop to check validity  

        for(int i = 0; i < myArray.length; i++) {

            myArray[i] = i + 1;
            numStr = JOptionPane.showInputDialog("Please enter number " + count++ + ":");
            number = Integer.parseInt(numStr); // Converts string value to integer  

            if(number >= largest) {
                largest = number;
            }

            // If-Else if statements checks if values entered are equal to 0-9
            if(number >= 0 && number <= 9) {
                valid = true;
            }

            else if ((!(number >= 0 && number <= 9))) {
                valid = false;
            }   

            if (valid == false) {
                JOptionPane.showMessageDialog(null, "INVALID INPUT...Try Again!!!", "Results", JOptionPane.YES_OPTION);
                continue;
            }
        }

        JOptionPane.showMessageDialog(null, "The Largest Number Is: " + largest, "Results", JOptionPane.PLAIN_MESSAGE);
    }           
    }
}

我可以通过添加 return 来结束循环:

if (valid == false) {
    JOptionPane.showMessageDialog(null, "INVALID INPUT...Try Again!!!", "Results", JOptionPane.YES_OPTION);
    return;
}

我真的很想学习如何从头开始重新启动循环。我尝试搜索不同的主题,但没有一个能帮助我解决我的问题。提前感谢您的帮助!

【问题讨论】:

  • continue 关键字?
  • 在包裹你的内心时添加另一个
  • @August 将其作为答案发布。 @KinGSwisser while(valid == true) 可以表示为while(valid)。检查布尔值何时为 false 如下所示:while(!valid)

标签: java if-statement for-loop while-loop boolean-expression


【解决方案1】:

要重新启动循环,您可以使用continue 关键字。 continue 将跳到下一个循环迭代。

当使用 while 循环时,它只会重新启动循环,因为直到 valid 为真时循环才结束。使用 for 循环时,它会跳到下一次迭代(因此,如果您当前在索引 5 上并使用 continue,它将移动到索引 6 而不是停留在 5)。

对于嵌套循环,您可以标记循环以指定语句用于哪个循环:

firstloop:
while(valid) {

    secondloop:
    while(true) {
         continue firstloop;
    }
}

此外,检查布尔值时不需要== true。它可以表示为

while(valid) {

}

至于检查错误,valid == false,你会使用

while(!valid) {

}

【讨论】:

  • @KinGSwisser 它适用于任何其他原始类型,如char,它用于检查两个引用变量是否指向同一个对象。你这样做的方式还可以,只是没有必要
  • 带标签的循环与分支标签“goto”有一些相似之处。可能是一个偏好问题,但当您有更优雅的方式来设计控件时,我不会推荐它。
【解决方案2】:

由于您是初学者并正在努力学习,因此我对您的代码进行了审查,并附上了一些可能对您有所帮助的 cmets。我已经在下面发布了更新的代码。

  1. 声明:您应该在需要它的最里面的闭包中声明一个变量。除了largest,其他都可以进入for

  2. 您的数组变量没有意义。因为您一直在跟踪最大的,而最后却没有找到。

  3. 控制:您的/loop to check validity/ 需要严格围绕输入部分,而不是整个程序,因此您可以重复输入语句直到您满意为止。

    public static void main(String[] args)
    {
        int largest = 0;
        for(int i = 1; i <= 10; i++)
        {
            boolean valid = false;      
            while (!valid)
            {
                String numStr = JOptionPane.showInputDialog("Please enter number " + i + ":");
                int number = Integer.parseInt(numStr);  //Converts string value to integer
    
                if (number >= 0 && number <= 9)
                {
                    valid = true;
                }
                else
                {
                    JOptionPane.showMessageDialog(null, "INVALID INPUT...Try Again!!!", "Results", JOptionPane.YES_OPTION);
                }           
            }
    
            if (number > largest)
            {
                largest = number;
            }
        }   
        JOptionPane.showMessageDialog(null, "The Largest Number Is: " + largest, "Results", JOptionPane.PLAIN_MESSAGE);
    }
    

【讨论】:

  • 哦,太棒了,谢谢,这有很大帮助!我可以终生弄清楚我做错了什么。非常感谢您的帮助!
【解决方案3】:

您可以使用带标签的继续:

firstloop:
while(valid){
  secondloop:
  for(int i=0; i<10; i++{
    //something
    if(something){
      continue firstloop;
    }
  }
}

有关详细信息,请参阅documentation

更新:另外... if/else 语句的 else 部分不需要条件。只需执行else{ valid=false } 就相当于您现在正在执行的操作。另一种选择是进一步简化它并一起跳过 if/else 部分,只需要:

valid = number >= 0 && number <= 9

【讨论】:

    【解决方案4】:

    写一个递归函数,即调用自身的函数。

    public static void DoSomething()
    {
      // optionally ask the user for input at this point before processing begins.
    
      while(yourCondition)
      {
        // do your stuff.
      }
    
      // when execution reaches here the condition is no longer valid; start over.
      if(conditionToStartOver)
          DoSomething();  // start again
    }
    

    【讨论】:

      【解决方案5】:

      您的逻辑几乎是正确的,但您不应该在外循环中循环 valid。请记住,您希望在输入无效时停止 inner 循环。通常,外部循环会给用户一个退出程序的选项。

      例如:

      while(true) {
          boolean valid = true;
      
          for(...; ...; ...) {
              ...
      
              if(number < 0 || 9 < number) {
                  valid = false;
                  break;
              }
          }
      
          if(valid) {
              // show largest input dialog
          } else {
              // show invalid input dialog
          }
      
          // optionally ask the user if they want to exit
          // if so, break
      }
      

      【讨论】:

      • 感谢@Radiodef 和大家这个非常有帮助的社区。我只是希望能达到你们所有人的编程知识水平。我刚刚完成了 C++ 和 sql 数据库编程课程。虽然我喜欢 C++。到目前为止,我真的很喜欢 Java,并希望能做得更好。不过,我真的很感谢你们!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-23
      • 2019-01-17
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多