跳过System.in.read()而不提示输入

时间:2019-04-28 12:27:40

标签: java

我写了一个类似于采访的代码。它询问您您的年龄以及性别。 由于某种原因,.exe在打印出第二个问题后会终止。 这是为什么?我该如何解决?

我检查了语法,但似乎找不到错误。

import java.io.IOException;

公共类骚扰{

public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub

    char Geschlecht;
    System.out.println("Wie ist dein Geschlecht? M oder W?");
    Geschlecht = (char) System.in.read();

    int Alter;
    System.out.println("Wie ist dein Alter?");
    Alter = (int) System.in.read();
    if (Alter >= 18 && Alter <= 100)
    {
        System.out.println("Du bist volljaehrig, herzlichen Glueckwunsch!");
    }
}

}

它打印出此字符串(“ Wie ist dein Alter?”),然后终止。我不能输入年龄(数字),这是println中提出的问题。

我希望它能使我进入年龄,如果我在18岁到100岁之间,它应该告诉我“恭喜你成年”。 (如果还没有结束,还有更多)

编辑:我尝试添加一个if else语句。当我运行.exe时:

    if (Alter >= 18 && Alter <= 100)
    {
        System.out.println("Du bist volljaehrig, herzlichen Glueckwunsch!");
    }
    else if (Alter >= 0 && Alter <= 17);
    {
        System.out.println("Du bist leider minderjaehrig mein Kind");
    }

当我这样做时,它只是在问题“ Wie ist dein Alter?”之后打印出if println“ Du bist leider minderjaehrig mein Kind”。在那之后终止。

4 个答案:

答案 0 :(得分:8)

说明

您可能输入了更多,而不仅仅是输入一个字符。

例如,您点击了男性的M,但同时点击了输入按钮。您的实际输入是

M\n

而不仅仅是

M

,第一个read读取M,第二个\n读取Alter而不要求您提供新输入,因为还剩下一些未读输入

因此int\n字符的if值,因此不会输入您的Scanner块。这样代码就完全执行了。


解决方案

为方便阅读此类输入而专门开发了一个方便的类,Scanner scanner = new Scanner(System.in); System.out.println("Wie ist dein Geschlecht? M oder W?"); String geschlecht = scanner.nextLine(); System.out.println("Wie ist dein Alter?"); int alter = Integer.parseInt(scanner.nextLine()); if (alter >= 18 && alter <= 100) { System.out.println("Du bist volljaehrig, herzlichen Glueckwunsch!"); } documentation)。

Geschlecht

注意

请注意,Java命名约定对变量名而不是 PascalCase 表示 camelCase 。因此,您的Altergeschlecht应该更称为alterchar geschlecht; System.out.println("Wie ist dein Geschlecht? M oder W?"); geschlecht = ...

此外,您应该在所需的确切位置(而不是更早)创建变量。所以代替

System.out.println("Wie ist dein Geschlecht? M oder W?");
char geschlecht = ...

首选

\n

这将使您的代码更易于阅读。

取决于您的操作系统,换行符不仅可以是\n\r,还可以是Scanner// use for file access var fs = Npm.require('fs'); // using this meteor lib, gives secure access to folder structure var files = Npm.require("./mini-files"); // save reference to serverDir var serverDir = files.pathResolve(__meteor_bootstrap__.serverDir); // Taken from meteor/tools/bundler.js#L1509 // currently the directory structure has not changed for build var assetBundlePath = files.pathJoin(serverDir, 'assets', 'app'); // location of the private data folder var dataPath = files.pathJoin(assetBundlePath, 'data'); 麻烦您自己去处理,这将为您完成所有这些工作。

答案 1 :(得分:1)

您正在使用System.in.read()读取原始字节。输入后可能要按Enter键,所以Alter将包含enter的字节值,即13的值,因此if块将永远不会执行。

不读取原始字节,而是使用Scanner来获取nextLine()的用户输入。

import java.io.IOException;
import java.util.Scanner;

public class Abfrage {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        System.out.println("Wie ist dein Geschlecht? M oder W?");
        String geschlecht = sc.nextLine();

        System.out.println("Wie ist dein Alter?");
        int alter = Integer.parseInt(sc.nextLine());
        if (alter >= 18 && alter <= 100)
        {
            System.out.println("Du bist volljaehrig, herzlichen Glueckwunsch!");
        }
    }
}

答案 2 :(得分:1)

您的问题是System.in在您输入的最后一个输入中保留一个特殊字符(回车CR)。然后,当您使用(int)强制转换输入时,它将给出回车符的字符代码(为13)。

这里的解决方法可能是使用java.util.Scanner

这里是一个例子:

Scanner scanner = new Scanner(System.in);

char Geschlecht;
System.out.println("Wie ist dein Geschlecht? M oder W?");
Geschlecht = scanner.next().charAt(0);

// It clears the content by consuming \n
scanner.nextLine();

int Alter;
System.out.println("Wie ist dein Alter?");
Alter = scanner.nextInt();

但是,该程序绝对不是白痴证明,如果用户提供了预期的其他内容,它可能会引发异常。

答案 3 :(得分:0)

System.in返回InputStream,并调用其读取方法。 JavaDocs声明read

  

从输入流中读取下一个数据字节。值字节以int形式返回,范围为0到255。如果由于到达流的末尾而没有字节可用,则返回值-1。该方法将阻塞直到输入数据可用,检测到流的末尾或引发异常为止。

因此,基本上,您正在解析字节值。 尝试按以下说明使用扫描仪istead:How can I read input from the console using the Scanner class in Java?