-2

由于某种原因,这个程序不能loop正确,它应该等待用户输入,然后决定天气是否应该循环。相反,它跳过用户输入部分,直接决定它需要loop,然后允许用户输入予以考虑。

例如,它要求输入一个数字,我输入 5,然后它说“你想再去一次吗?” “请使用是或否,区分大小写!” “你想再去一次吗?”。运行后它将接受用户输入,我考虑过使用睡眠(2000),但我不希望它只是跳过并假设用户没有输入任何东西。我难住了!请记住,这是我使用 java 的第二天。我是一个newbie,这只是我正在研究的第三个程序。我在另一个程序上遇到了这个问题,但我设法解决了它。然而,尽管我的框架完全相同,但这个似乎不想以相同的方式工作。

do {
                System.out.println("would you like to go again?");
                if (input.hasNextLine()){

                    again = input.nextLine();
                    if (again.equals("yes")){
                        yon2 = false;
                        dateconverter.main(args);
                    }else if (again.equals("no")){
                        System.out.println("good bye");
                        Thread.sleep(4000);
                        System.exit(0);
                    }else{
                        yon2 = true;
                        System.out.println("Please use either yes or no. caps sensative!");
                    }
                }
            } while (!(yon2 = false));
4

2 回答 2

6

Java 循环正确。然而,yon2 = false这是一个任务,而不是一个比较。

因此循环等效于:

do {
  // ..
  yon2 = false; // assign! :(
} while (!yon2);

所以 Java 正在做它被告知要做的事情。

现在,除此之外,我相信另一个问题是对变量的使用感到困惑。考虑一下:

boolean askAgain = true;
do {
   System.out.println("would you like to go again?");
   if (input.hasNextLine()){
      String again = input.nextLine();
      if (again.equals("yes")){
        // Finally done asking
        askAgain = false;
        dateconverter.main(args);
      } else if (again.equals("no")){
        System.out.println("good bye");
        Thread.sleep(4000);
        System.exit(0);
      } else {
        // If we're here, we still need to ask again
        System.out.println("Please use either yes or no. caps sensative!");
      }
   } else {
      // no more lines! do something sensible
      System.exit(0);
   }
   // Loop while we need to ask again!
   // Note that the negative is removed
} while (askAgain);

但是,花一点时间来重构它可以让以后更容易阅读,并完全避免处理标志:

boolean promptKeepPlaying (Scanner input) { 
   while (input.hasNextLine()){
      System.out.println("would you like to go again?");
      String again = input.nextLine();
      if (again.equalsIgnoreCase("yes")){
        return true;
      } else if (again.equalsIgnoreCase("no")){
        return false;
      } else {
        System.out.println("Please use either yes or no.");
      }
   }
   // no more lines
   return false;
}

// somewhere else
if (promptKeepPlaying(input)) {
  // restart game
  dateconverter.main(args);
} else {
  // exit game
  System.out.println("good bye");
  Thread.sleep(4000);
  System.exit(0);
}
于 2013-07-27T01:16:12.210 回答
0

你的程序有错误。你不小心写了一个作业而不是一个相等测试。

但是,这里真正的教训是,您不应该编写涉及布尔值的繁琐==和测试。!=有更简单、更优雅、更不容易出错的编写测试的方法。例如,假设这condition是一个布尔值。

  • condition == true是相同的condition
  • condition == false是相同的!condition
  • !(condition == false)是相同的condition
  • condition == condition2!(condition ^ condition2)与1相同。

花时间简单而优雅地编写代码确实有好处。


1 - 这是一个==更优雅的示例......但^异或运算符避免了意外分配陷阱。

于 2013-07-27T01:36:33.573 回答