无法退出具有Sentinal值的循环

时间:2016-10-16 19:03:31

标签: java

我一直试图通过各种方法退出循环,这是我得到的最接近但仍然有扫描仪不匹配错误。

有人能指出我失踪的东西吗?

代码:

from django.core.exceptions import ValidationError

3 个答案:

答案 0 :(得分:1)

你可以使外循环成为一个真正的循环。然后,当你想退出时,你只需从方法返回,因此停止方法&环。不需要退出哨兵值

你也提示输入Y / N,所以你应该检查,不是真或假。

String q = "n";
do {
  System.out.println("Do you want to quit: Y/N ?");
  String q = input.next();
  if (q.equalsIgnoreCase("y")) return; // quit right here 
  else if (!q.equalsIgnoreCase("n"))
  {
      System.out.println("That is neither a y or n.");
      continue; // repeat
  } else { } // entered y, so continue on with the outer loop 
} while (!q.equalsIgnoreCase("y") || !q.equalsIgnoreCase("n"));

总的提示。编写这个模式是一个非常初学的事情,它可能看起来很好且易于理解

if(check %400==0) {
    four_hundred=true;
} else { 
    four_hundred=false;
}

但是,你真的应该这样写

four_hundred = check % 400; 

在这里,为什么在保证价值的情况下得到四个是真的?

if(four==true) {
    if(four==true&&hundred==false&&four_hundred==false) {
        System.out.println("The year is a leap year");
    }
    if(four==true&&... 

答案 1 :(得分:1)

您的代码中存在一些问题可以解释您无法退出循环的原因。

System.out.println("DO YOU WANT TO QUIT: Y/N ?");
while(!input.hasNext("true|false")) {
    System.out.println("That is neither a true or false.");
    input.nextBoolean();

    if(input.hasNextBoolean()) {
        quit=true;
    }

    if(input.hasNextBoolean()) {
        quit=false;
    }
}

使用input.nextBoolean();您可以阅读输入,但有两个问题:

  1. 如果无法将输入扫描到InputMismatchExceptiontrue
  2. ,则会抛出false
  3. 您使用输入但不将其放入变量
  4. 暂时忽略第一个问题,问题是然后根据另一个输入检查尝试设置quit。这意味着,如果用户再次输入true或false,input.hasNextBoolean()只能是true

    除了这个while循环外,最外面的do / while

    也存在问题
        ...
    } while(!quit==false);
    

    您正在测试 quit并保持循环,如果它是false。这意味着当quit == true你留在循环中时。

    你可能想写while (!quit)

答案 2 :(得分:0)

我建议您改进代码:

  1. 改进变量名称。
  2. 删除未使用的变量。
  3. 简化if语句表达式。
  4. 这是一段代码:

    import java.util.*;
    
    public class LeapYear
    {
        public static void main( String[] args ) {
            Scanner input = new Scanner(System.in);
            boolean isFour;
            boolean isQuit = true;
            int checkedYear = 2000;
            int minimumAcceptedYear = 1582;
    
            //System.out.println("Enter a year to check if it  is a leap year");
            do {
                do {
                    System.out.println("Enter a year to check if it is a leap year");
                    checkedYear = input.nextInt();
                    if ( checkedYear < minimumAcceptedYear ) {
                        System.out.println("That year is too old, choose a year in more recent history");
                    }
                } while ( checkedYear < minimumAcceptedYear );
    
                isFour = (checkedYear % 4) == 0;
    
                if ( isFour ) {
                    System.out.println("The year is a leap year");
                } else {
                    System.out.println("The year is not a leap year");
                }
    
                System.out.println("DO YOU WANT TO QUIT: (true/false) ?");
    
                if ( input.hasNextBoolean() ) {     
                    isQuit = input.nextBoolean();
                } else {
                            System.out.println("That is neither a true or false.");
                }
            } while ( !isQuit );
        }
    }
    

    这看起来好多了。我建议你提取

    isFour = (checkedYear % 4) == 0;
    
    if ( isFour ) {
        System.out.println("The year is a leap year");
    } else {
        System.out.println("The year is not a leap year");
    }
    

    使用参数isLeapYear的另一个方法aYear。您有一个不匹配错误,因为您在检查年份过长后给出了无效的输入数据。如果条件低于checkedYear分配,则应移动以避免这些错误。我希望这是一个有用的答案。