因此,我正在通过一系列基本的编程思想来帮助我掌握Java,我创建了一个程序,可以将PI打印到小数点后十位(如果需要,我可以添加更多)。 / p>
但是,我决定采取额外步骤并创建一个选项,以便一直反复运行程序,直到用户告诉它停止。我创建了一个方法来返回true(再次运行)或false(退出程序)。最初我在方法中创建了一个扫描程序以获取用户输入,程序运行正常,但它告诉我资源泄漏,因为我没有在方法中关闭扫描程序。
我刚刚将输入扫描程序从main传递给方法作为参数,但是当我运行程序时它不接受用户输入并打印出“抱歉,出现错误”(else {}选项在我的方法中的if-else语句中)。现在,我可以回去创建一个单独的扫描仪但我的OCD不希望Eclipse告诉我有资源泄漏(我认为input.close()关闭两个扫描仪,但我不确定)。
这是我的代码,我向任何Java爱好者道歉,他们对我不知道的任何不良做法感到不满和冒犯,我正在学习。
import java.util.Scanner;
import java.text.DecimalFormat;
public class PiDecimalFormat {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
DecimalFormat format = new DecimalFormat("#");
int decPlace = 0;
boolean runProgram = true;
System.out.println("This program will print out PI to the decimal place of your choosing.");
while (runProgram == true) {
System.out.print("\nEnter the number of decimal places (up to 10) that \nyou would like to print PI to: ");
decPlace = input.nextInt();
switch (decPlace) {
case 0:
format = new DecimalFormat("#");
break;
case 1:
format = new DecimalFormat("#.#");
break;
case 2:
format = new DecimalFormat("#.##");
break;
case 3:
format = new DecimalFormat("#.###");
break;
case 4:
format = new DecimalFormat("#.####");
break;
case 5:
format = new DecimalFormat("#.#####");
break;
case 6:
format = new DecimalFormat("#.######");
break;
case 7:
format = new DecimalFormat("#.#######");
break;
case 8:
format = new DecimalFormat("#.########");
break;
case 9:
format = new DecimalFormat("#.#########");
break;
case 10:
format = new DecimalFormat("#.##########");
break;
}
System.out.println("\nThe value of PI to " + decPlace + " decimal places is " + format.format(Math.PI) + ".");
runProgram = AskRunAgain(input);
}
input.close();
}
static boolean AskRunAgain(Scanner askUser) {
String userChoice;
System.out.print("\nWould you like to run the program again? [y/n]: ");
userChoice = askUser.nextLine();
if ((userChoice.equals("y")) || (userChoice.equals("Y")) || (userChoice.equals("yes")) ||
(userChoice.equals("Yes")) || (userChoice.equals("YES"))) {
return true;
}
else if ((userChoice.equals("n")) || (userChoice.equals("N")) || (userChoice.equals("no")) ||
(userChoice.equals("No")) || (userChoice.equals("NO"))) {
System.out.println("\nExitting the program. have a good day!");
return false;
}
else {
System.out.println("Sorry, there was an error.");
return false;
}
}
}
如果有人能告诉我它为什么会这样做,我将不胜感激。我是Java的新手(使用C / C ++ / C#和Python)。我没有看到关于这个特定问题的其他问题,如果我只是在方法中创建另一个扫描仪,这没什么大不了的。
答案 0 :(得分:2)
我注意到您正在接听此电话:
decPlace = input.nextInt();
返回字符不被消耗,因此就Scanner
而言,它仍然在缓冲区中。
这意味着,对于2\n
的输入,它将读取2作为下一个整数,但读取空字符串以调用nextLine()
。
为了解决这个问题,请在阅读完下一个整数后使用input.nextLine()
完成消费。
decPlace = input.nextInt();
input.nextLine();
答案 1 :(得分:1)
只需改变即可。
askUser.nextLine();
以强>
askUser.next();
static boolean AskRunAgain(Scanner askUser) {
String userChoice;
System.out.print("\nWould you like to run the program again? [y/n]: ");
userChoice = askUser.next();