我写了一个类似于采访的代码。它询问您您的年龄以及性别。 由于某种原因,.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”。在那之后终止。
答案 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 。因此,您的Alter
和geschlecht
应该更称为alter
和char 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?