我试图从 System.in 中读取类似以下内容:hh:mm(例如:17:10,9:32等(
我还想将冒号之前的数字存储到"小时"变量中,将冒号之后的数字存储到"分钟"变量中。到目前为止,我的代码是这样的:
import java.util.Scanner;
Scanner in = new Scanner(System.in);
in.useDelimiter(":|\n");
int hour = 0, minute = 0;
while (in.hasNext()){
hour = in.nextInt();
minute = in.nextInt();
System.out.println("Hour is : " + hour);
System.out.println("Minute is : " + minute);
}
但是,当我运行它并输入"9:10"然后按 ENTER 例如时,我得到了这个:
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
如果我把这个改为:
in.useDelimiter(":");
然后它只读取第一个数字(">小时"(,它只读取第二个数字(我键入 9:10 时的"分钟":(注意第二个冒号(。
你们能帮忙吗?
另一种方法是像这样拆分行:
String[] timeParts = in.nextLine().split(":");
System.out.println("Hour is : " + timeParts[0]);
System.out.println("Minute is : " + timeParts[1]);
考虑到你对我的评论给出的答案,我假设你使用的是Windows。
当你按 Enter 时,你的系统实际上会向System.in
发送两个字节:不仅n
,而且实际上r
然后n
。
因此,当您使用 n
或 :
作为分隔符时,会发生以下情况:
System.in 9:10rn
matching delimiters ^ ^
令 牌:
-
9
,可以胁迫到int
-
10r
,这不能。
但是,使用 :
或 rn
作为分隔符会导致以下结果:
System.in 9:10rn
matching delimiters ^ ^
令 牌:
-
9
-
10
。这两者都可以被胁迫到int
S。
检查起来很容易。以下代码段将显示从System.in
读取的每个字符的 ASCII 值:
final Scanner in = new Scanner(System.in);
in.useDelimiter("");
while (in.hasNext()){
final String next = in.next();
for(int i = 0; i < next.length(); i++) {
System.out.println(next.codePointAt(i));
}
}
当您执行此操作并简单地在控制台中按 Enter 键时,您应该得到:
13
10
。其中13
是回车符(r
(的ASCII十进制值,10
是换行符(n
(的一个:)
作为旁注,我想指出,我在问题的评论中建议您的正则表达式(即::|r?n
(将与:
或rn
或n
匹配。
因此,它也适用于Linux
,例如:)
我希望这个彻底的解释回答了你的问题!