我试图从System.in读取这样的东西:hh:mm(例如:17:10,9:32等)
我还想将冒号前的数字存储到“hour”变量中,将后面的数字存储到“minute”变量中。到目前为止我的代码是这样的:
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键入时的“分钟”:(注意第二个冒号)。
你能帮忙吗?答案 0 :(得分:1)
另一种方法是将线分开:
String[] timeParts = in.nextLine().split(":");
System.out.println("Hour is : " + timeParts[0]);
System.out.println("Minute is : " + timeParts[1]);
答案 1 :(得分:0)
考虑到您对我的评论给出的答案,我认为您正在使用 Windows 。
当您按 Enter 时,您的系统实际上会将两个字节发送到System.in
:不仅\n
,而且实际上\r
然后 \n
。
因此,当您使用\n
或:
作为分隔符时,会发生以下情况:
System.in 9:10\r\n
matching delimiters ^ ^
令牌:
9
,可以强制为int
10\r
,但不能。但是,使用:
或\r\n
作为分隔符会产生以下结果:
System.in 9:10\r\n
matching delimiters ^ ^
令牌:
9
10
......这两者都可以被强制转移到int
。
很容易检查。以下代码将显示从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
是换行 &#39; s(\n
)一个:)
作为旁注,我想指出我在你的问题的评论中建议你的正则表达式(即::|\r?\n
)将匹配{{ 1}}或:
或\r\n
。
因此,它也适用于\n
,例如:)
我希望这个彻底的解释能够回答你的问题!