Java Homework用户输入问题

我有一个类分配来使用Scanner读取数据。

import java.util.Scanner; public class Project23 { public static void main(String[] args) { // Declarations and instantiations. Scanner scan = new Scanner(System.in); String any = ""; boolean more = false; double purchase = 0.0; // Ask if user would like to run program? System.out.print("Do you have any purchases? Y/N?: "); // Ready value into string. any = scan.nextLine(); System.out.println(); // If any is equal to y or Y it will set the value of more to true // this runs the while statement below. more = any.toUpperCase().equals("Y"); // While more is still true continue to run the code within the brackets. while (more) { System.out.print("Please input purchase amount: "); purchase += scan.nextDouble(); System.out.println(); System.out.print("Do you have any more purchases Y/N?: "); any = scan.nextLine(); System.out.println(); more = any.toUpperCase().equals("Y"); } if (purchase >= 2500) System.out.println("Purchase >= 2500"); else System.out.println("Purchase < 2500"); } } 

底部就在那里作为测试,让我发现每个标志是否正常运行。 然而我设置的while循环似乎不想继续运行多次。 它将采用一个值,然后如果我说是我有更多的值(y或Y)它将退出并打印任何鲣鸟

基本上发生的事情是,当您正在读取double.nextDouble()时,您只读取double,但是当您在scan.nextDouble()未读取的流上按Enter键时会出现ENDLINE字符。 因此,当您到达any1 = scan.nextLine()时,它会读取不等于Y或y的结束字符。 结果它退出while循环。 像这样纠正你的代码,只需在你读正文的地方换一行:

 while(more){ System.out.print("Please input purchase amount: "); purchase+=Double.parseDouble(scan.nextLine()); System.out.println(); System.out.print("Do you have any more purchases Y/N?: "); // scan.nextLine(); String any1=scan.nextLine(); System.out.println(); more = any1.equals("y") || any1.equals("Y");//Shortened :) } 

您应该能够通过在调试器下运行应用程序或添加一些诊断跟踪打印来自己解决这个问题。 例如在适当的时候这样的事情。

  System.out.println("any is ==>'" + any + "'<=="); 

(我敢打赌,这将表明any不包含你期望的......)

我强烈建议您学习调试自己的代码,而不是要求其他人提供帮助。 这是专业软件工程师的关键技能。

这似乎对我来说很好……

 boolean more = true; while (more) { System.out.print("Do you have any more purchases Y/N?: "); String any1 = scan.nextLine(); System.out.println(); if (any1.equalsIgnoreCase("y")) { more = true; } else { more = false; } System.out.println(more); } 

哪种怪物让我感到害怕,因为我确信没有那么大的差别

while(more==true)不需要, while(more)说同样的事情。

if(any1.equals("y") || any1.equals("Y"))不是必需的, if (any1.equalsIgnoreCase("y"))会做同样的事情

为了更清晰,更易读的代码,在这种情况下更喜欢do..while块,因为现在不需要more变量:

 public static void main(String[] args) { double purchase = 0.0; Scanner scan = new Scanner(System.in); System.out.print("Do you have any more purchases Y/N?: "); if (!scan.nextLine().equalsIgnoreCase("y")) { return; } do { System.out.print("Please input purchase amount: "); purchase += Double.parseDouble(scan.nextLine()); System.out.print("Do you have any more purchases Y/N?: "); } while (scan.nextLine().equalsIgnoreCase("y")); System.out.println("Your purchase amount is: " + purchase + " and so is " + (purchase >= 2500 ? ">= 2500" : "< 2500")); } 

对于家庭作业,我觉得这很好。 对于项目中的实际工作,您应该使用许多有意义的小方法进行重构,并避免大部分冗余。 这可能是你的第二个功课:优化它:)