gpt4 book ai didi

Java - 扫描仪声明

转载 作者:行者123 更新时间:2023-12-02 01:57:02 26 4
gpt4 key购买 nike

我是 Java 新手。这是一个非常简单的切换方法。

当用户在此处键入 String 时,它将引发错误,并且 catch 将按编码再次调用此方法。

这是我关于扫描仪的问题。

我意识到我需要把那些

扫描仪 sc = new Scanner(System.in);

在“尝试”主体中,如果我希望它告诉我再次进行实际打字,但这是为什么呢?为什么要打字

int select = sc.nextInt();

还不够吗?

int select1 = sc.nextInt();

int select2 = sc.nextInt(); 是相同的,因为它具有相同的“sc”实例?

 public void reAsk(){
System.out.println("Type a number")
Scanner sc = new Scanner(System.in);

try {
int select = sc.nextInt();
switch (select) {

case 1:
System.out.println("1");
break;
case 2:
System.out.println("2");
break;
case 3:
System.out.println("3");
break;


} catch (InputMismatchException e) {
System.out.println("Please type int");
reAsk();
}
}

最佳答案

调用nextInt() (或任何 next() 方法)将简单地尝试读取流中的下一个标记(在 nextInt() 的转换中,可能的符号(+/-)和数字),例如:标准输入。

如果您输入:0 1 2,则每次连续调用 nextInt()将返回 0、1 和 2。

继续Scanner ,您不需要创建 Scanner每次reAsk方法被调用,也不需要在这种微不足道的情况下使用递归(除非是为了练习):您可以重用它,但必须警惕缓冲区中留下的字符,以防出现错误。

例如:

Scanner sc = new Scanner(System.in);
try {
...
int select;
for (;;) {
try {
select = sc.nextInt();
break;
} catch (InputMismatchException ignored) {
continue;
}
}
// select is always initialized in that case
switch (select) {
...
}
}

这将执行无限循环,因为 sc无法读取 int仍然有无效的int缓冲区中的字符(例如: 'a 1' )。

您可以使用sc.next()前进(这将丢弃下一个标记,例如:上例中的 a)。

但使用sc.hasNextInt()会更明智。在这种情况下:

Scanner sc = new Scanner(System.in);
while (!sc.hasNextInt() && sc.hasNext()) {
sc.next(); // advance / discard the invalid token
}

// we don't care about result of hasNext() here.
int select = sc.nextInt();

正如上面评论中所说,我们不测试 hasNext()主要有两个原因:

  • 如果 hasNext()返回false ,那么流结束的可能性更大。您可能需要调用hasNextInt()之前nextInt() ,如果返回 false ,正确结束你的方法。此示例将失败并显示 NoSuchElementException .
  • System.in仅当它被重定向(例如: java Main < foobar.txtecho a | java Main )或者调用某个序列(我不记得但我相信它是 Ctrl + Z)或者如果你直接在 Java 中关闭时,才可能结束(System.in.close())。

注意:在大多数情况下,资源如 Scanner ,在 try-with-resources 中创建,例如:

try (Scanner sc = new Scanner(System.in)) {
...
}

虽然这是一个很好的做法,但这将关闭 System.in并且您将永远无法使用它:

try (Scanner sc = new Scanner(System.in)) {
String next = sc.next(); // again, without hasNext().
}
try (Scanner sc = new Scanner(System.in)) {
String next = sc.next(); // fail NoSuchElementException (stream is closed).
}

就您而言,您可以忽略try-with-resources

关于Java - 扫描仪声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52174688/

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