问题
最近在使用Scanner类中的hasNest()方法进行键盘输入时,发现while循环老是停在那儿,等待输入,而不执行后面的语句。
比如这样一段代码:
import java.util.ArrayList;
import java.util.Scanner;
public class blogTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
ArrayList<Integer> list = new ArrayList<Integer>();
while(in.hasNext()) {
int a = in.nextInt();
list.add(a);
}
System.out.println(list);
}
}
键盘输入,死循环,无法结束:
现在解释下原因:
hasNext()这个方法是如果此扫描器的输入中有另一个标记,则返回 true。在等待要扫描的输入时,此方法可能阻塞。扫描器将不执行任何输入。所以循环会一直下去。
此情况可以设置一个终止符,调用hasNext()的重载方法hasNext(String patten):如果下一个标记与从指定字符串构造的模式匹配,则返回 true。扫描器不执行任何输入。
解决方式:需要指定结束符号
1 例:以输入"0",结束输出
//例:以输入"0",结束输出
Scanner sc = new Scanner(System.in);
while (!sc.hasNext("0")) {
System.out.println(sc.next());
}
2 以输入"quit",结束输出
import java.util.Scanner;
public class day01 {
public static void main(String[] args){
System.out.print("请输入值:");
Scanner s = new Scanner(System.in);
while(s.hasNext()){
String a = s.next(); //将s.next()赋值给变量a
if("quit".equals(a)){
break;
}else{
System.out.println(a);
}
}
}
}
3 以输入"按回车键输入空行",结束输出
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class InputTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 输入分割为一个一个输入(不知道个数)
// 按回车键输入空行结束
Scanner scanner = new Scanner(System.in);
ArrayList<Integer> list = new ArrayList<Integer>();
do{
String str = scanner.nextLine();
if(str.equals("")){
break;
}
list.add(Integer.valueOf(str));
}while(true);
//System.out.println(list);
System.out.println(Arrays.toString(list.toArray()));
}
}
4 输入风格为一行(不知道个数),以空格分隔
// 输入风格为一行(不知道个数)
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String inputString = sc.nextLine();
String stringArray[] = inputString.split(" ");
int num[] = new int[stringArray.length];
for (int i = 0; i < stringArray.length; i++) {
num[i] = Integer.parseInt(stringArray[i]);
}
for (int i = 0; i < stringArray.length; i++) {
System.out.println(num[i]);
}
}
整理这篇博客是因为:做过好几道笔试题都卡在处理输入上,特别是一个一个输入,且不知到个数的情况,题目给的测试用例一般不会指定结束符号,所以,目前还在找一个一个从键盘输入的情况下,不用指定结束符号的解决办法。