Java-Scanner声明
我是Java的新手。 下面是一个非常简单的切换方法 当用户在这里键入字符串时,它将抛出一个错误,catch将按照编码再次调用此方法 这是我关于扫描仪的问题 我意识到我需要把这些Java-Scanner声明,java,loops,java.util.scanner,Java,Loops,Java.util.scanner,我是Java的新手。 下面是一个非常简单的切换方法 当用户在这里键入字符串时,它将抛出一个错误,catch将按照编码再次调用此方法 这是我关于扫描仪的问题 我意识到我需要把这些 Scanner sc=新扫描仪(System.in) 在“try”主体中,如果我想让它告诉我再次进行物理打字,那为什么呢?为什么打字 int-select=sc.nextInt() 这还不够吗 会 int select1=sc.nextInt()和 int select2=sc.nextInt()是否相同,因为它具有相同
Scanner sc=新扫描仪(System.in)代码>
在“try”主体中,如果我想让它告诉我再次进行物理打字,那为什么呢?为什么打字
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();
}
}
你的发现是错误的。我已经修复了您的代码,希望这能解决您的问题:
import java.util.InputMismatchException;
import java.util.Scanner;
public class Main {
public static 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) {
reAsk();
}
}
public static void main(String[] args) {
reAsk();
}
}
不需要在try catch中初始化scanner类。您只是有一些语法错误。首先,在Java中,每个语句必须以分号结尾,您忽略了在System.out.println(“键入一个数字”)
之后添加分号 你的发现不正确。我已经修复了您的代码,希望这能解决您的问题:
import java.util.InputMismatchException;
import java.util.Scanner;
public class Main {
public static 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) {
reAsk();
}
}
public static void main(String[] args) {
reAsk();
}
}
不需要在try catch中初始化scanner类。您只是有一些语法错误。首先,在Java中,每个语句必须以分号结尾,您忽略了在System.out.println(“键入一个数字”)
之后添加分号 调用nextInt()
(或任何next()
方法)只需尝试读取流中的下一个标记(在nextInt()
的强制转换中),一个可能的符号(+/-)和数字,例如:标准输入
如果要键入:0 1 2,则对nextInt()
的每个连续调用都将返回0、1和2
要继续使用扫描器
,您不需要每次调用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
字符(例如:'a1'
)
您可以使用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
,则流更有可能结束。您可能希望在nextInt()
之前调用hasNextInt()
,如果它返回false
,则正确结束您的方法。此示例将失败,并出现NoTouchElementException
System.in
可能只有在它被重定向(例如:javamain
,echo a | javamain
)或者调用了某个序列(我不记得了,但我相信它是Ctrl+Z)或者直接在java中关闭(in)(System.in.close()
)
注意:在大多数情况下,资源(如扫描仪
)是在使用资源的尝试中创建的,例如:
虽然这是一种良好的做法,但这将关闭系统。在中,您将永远无法使用它:
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。调用nextInt()
(或任何next()
方法)只需尝试读取流中的下一个标记(在nextInt()
的强制转换中,一个可能的符号(+/-)和数字),例如:标准输入
如果要键入:0 1 2,则对nextInt()
的每个连续调用都将返回0、1和2
要继续使用扫描器
,您不需要每次调用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
字符(例如:'a1'
)
您可以使用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
,则流更有可能结束。您可能希望在nextInt()
之前调用hasNextInt()
,如果它返回false
,则正确结束您的方法。此示例将失败,并出现NoTouchElementException
System.in
可能只有在它被重定向(例如:javamain
,echo a | javamain
)或者调用了某个序列(我不记得了,但我相信它是Ctrl+Z)或者直接在java中关闭(in)(System.in.close()
)
注意:在大多数情况下,资源(如扫描仪
)是在使用资源的尝试中创建的,例如:
虽然这是一种良好的做法,但这将关闭系统。在中,您将永远无法使用它:
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).
}
在您的情况下,您可以忽略资源试用。1。您必须将它放在try
块中,因为如果您输入的内容不是int
,那么它将抛出一个错误。在catch
块中,调用该方法,这样只要输入无效,它就可以继续调用该方法2。不,他们不一样了。nextInt()
函数消耗部分