gpt4 book ai didi

Java 将扫描仪传递给方法

转载 作者:行者123 更新时间:2023-12-01 23:00:18 25 4
gpt4 key购买 nike

因此,我正在学习一系列基本的编程思想来帮助我掌握 Java,并且我创建了一个程序,可以将 PI 打印到小数点后第十位(如果需要,我可以添加更多)。

但是,我决定采取额外的步骤并创建一个选项来不断运行程序,直到用户告诉它停止。我创建了一个方法来返回 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 还不错)。我没有看到关于这个特定问题的其他问题,如果我只是在方法中创建另一个扫描仪,那也没什么大不了的。

最佳答案

我注意到您正在调用此电话:

decPlace = input.nextInt();

返回字符不会被消耗,因此就 Scanner 而言,它仍然位于缓冲区中。

这意味着,对于 2\n 的输入,它将读取 2 作为下一个整数,但在调用 nextLine() 时读取空字符串.

要解决这个问题,请在读取下一个整数后使用 input.nextLine() 完成该行的消耗。

decPlace = input.nextInt();
input.nextLine();

关于Java 将扫描仪传递给方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23462447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com