我的扫描仪输入被跳过,代码被终止

My Scanner input gets skipped and code gets terminated

提问人:arivvid27 提问时间:8/10/2023 最后编辑:Diego Borbaarivvid27 更新时间:8/10/2023 访问量:49

问:

我正在用 Java 编写一个“加仑到升,反之亦然”程序,但是一旦我完成了我的程序,我就第一次运行了它。我像预期的那样显示了系统输出,但随后它跳过了我程序的用户输入阶段。

import java.util.Scanner;

public class Main {
    private static void intro(String[] args) {
        final Scanner galOrLit = new Scanner(System.in);

        System.out.println("[1] => Gallons to Liters");
        System.out.println("[2] => Liters to Gallons");

        if ("1".equals(galOrLit)) {
            galToLit(args);
        } else if ("2".equals(galOrLit)) {
            litToGal(args);
        }
    }

    private static void galToLit(String[] args) {
        double liters;

        System.out.println("Enter Gallons: ");
        final Scanner gallons = new Scanner(System.in);

        int input = gallons.nextInt();
        liters = input * 3.7854;

        System.out.println("\n" + input + " gallons is " + liters + " liters.");
    }

    private static void litToGal(String[] args) {
        double gallons;

        System.out.println("Enter Liters: ");
        final Scanner liters = new Scanner(System.in);

        int input = liters.nextInt();
        gallons = input / 3.7854;

        System.out.println("\n" + input + " liters is" + gallons + " gallons.");
    }

    public static void main(String[] args) {
        intro(args);

    }
}

这篇文章之后,我试图最终确定我的扫描仪,因为我在一个班级中有多个。我期望我的代码能够顺利运行,但它对输出没有影响。这是我对两个版本的代码所了解的。

java.util.scanner 最终

评论

3赞 Progman 8/10/2023
"1".equals(galOrLit),您正在将对象本身与字符串进行比较。那永远不会.相反,您必须从扫描仪中读取一些东西,例如 or 并将其与字符串或(或实际数字)进行比较。Scanner"1"truenextLine()nextInt()"1""2"int
1赞 OneCricketeer 8/10/2023
您链接的帖子使用 和 .也许你想为选择做同样的事情?hasNext()nextInt()
0赞 k314159 8/10/2023
另请注意,英国加仑是 4.55 升。也许选择英寸和厘米,它们没有区域差异。

答:

0赞 Skerdi Velo 8/10/2023 #1

看起来您实际上并没有读取用户的任何输入。您只打印出可供选择的选项,但您没有阅读用户的输入。您只需添加一行:

String choice = scanner.nextLine();

它看起来像这样:

private static void intro(String[] args) {
    final Scanner scanner = new Scanner(System.in);

    System.out.println("[1] => Gallons to Liters");
    System.out.println("[2] => Liters to Gallons");

    String choice = scanner.nextLine();

    if ("1".equals(choice)) {
        galToLit(args);
    } else if ("2".equals(choice)) {
        litToGal(args);
    }
}

另一件事,我建议不要使用nextLine(),而是使用:Integer.parseInt(scanner.nextLine());

所以那行看起来像这样:

String choice = Integer.parseInt(scanner.nextLine());

Double.parseDouble(scanner.nextLine()); 如果你有任何双精度因为如果你从字符串输入到 int,有时它不起作用。

希望这有帮助!

评论

2赞 OneCricketeer 8/10/2023
选项是 1 和 2...为什么使用double?
0赞 Skerdi Velo 8/10/2023
你不明白。我没有使用 double,这是对未来编码不使用 nexLine() 的建议
2赞 Federico klez Culloca 8/10/2023
@SkerdiVelo好吧,但为什么呢? 是整数的正确类型。int
0赞 Skerdi Velo 8/10/2023
因为当你有的时候,比如说名字和年龄。你做 input.nextLine() 作为名称,它将存储名称,但会跳过年龄。因此,要解决此问题,请使用我的建议
0赞 Skerdi Velo 8/10/2023
我没有说使用双倍作为选择。他说他是 Java 的新手,所以我试图帮助他将来编码。
0赞 Diego Borba 8/10/2023 #2

问题在于您使用类来读取用户输入。以下是程序的更正版本:Scanner

import java.util.Scanner;

public class Main {
    private static void intro(String[] args) {
        final Scanner galOrLit = new Scanner(System.in);

        System.out.println("[1] => Gallons to Liters");
        System.out.println("[2] => Liters to Gallons");

        int choice = galOrLit.nextInt();  // Read user's choice

        if (choice == 1) {
            galToLit(args);
        } else if (choice == 2) {
            litToGal(args);
        }
    }

    private static void galToLit(String[] args) {
        double liters;

        System.out.println("Enter Gallons: ");
        final Scanner gallons = new Scanner(System.in);

        double input = gallons.nextDouble();  // Read a double value
        liters = input * 3.7854;

        System.out.println("\n" + input + " gallons is " + liters + " liters.");
    }

    private static void litToGal(String[] args) {
        double gallons;

        System.out.println("Enter Liters: ");
        final Scanner liters = new Scanner(System.in);

        double input = liters.nextDouble();  // Read a double value
        gallons = input / 3.7854;

        System.out.println("\n" + input + " liters is " + gallons + " gallons.");
    }

    public static void main(String[] args) {
        intro(args);
    }
}

在此更正版本中,我进行了以下更改:

  1. 用于读取用户选择的转换。nextInt()
  2. 用于读取用户输入的加仑或升。nextDouble()
  3. 更新了方法中的条件,以正确比较用户的选择。intro
  4. 将输入变量类型更改为 in and 方法以容纳双精度值。doublegalToLitlitToGal

这样,它现在可以正确读取用户输入并执行所需的转换。