java 中Scanner在调用函数的时候出现问题
importjava.util.Scanner;publicclassExe02{staticScannerscan=newScanner(System.in);publ...
import java.util.Scanner;
public class Exe02
{
static Scanner scan = new Scanner(System.in);
public static void main(String[] args)
{
String cmd="";
while(true){
System.out.print("you@you #:");
cmd= scan.nextLine();
if(cmd.equals("")) continue;
if(cmd.equals("exit")) return;
getInput();
}
}
public static String getInput(){
String i=scan.next();
return i;
}
}
输出结果:
you@you #:jdfklj
fjkld
you@you #:you@you #:
在调用一次函数后,显示除了两个“you@you #:”,也就是说有一次scan.nextLine()并没有阻塞,有谁知道这是为什么吗?
还有除了能够在被调用的函数中加上一个scan.nextLine();来把那个不知道从哪里来的数据读来丢掉,更好的解决办法是什么? 展开
public class Exe02
{
static Scanner scan = new Scanner(System.in);
public static void main(String[] args)
{
String cmd="";
while(true){
System.out.print("you@you #:");
cmd= scan.nextLine();
if(cmd.equals("")) continue;
if(cmd.equals("exit")) return;
getInput();
}
}
public static String getInput(){
String i=scan.next();
return i;
}
}
输出结果:
you@you #:jdfklj
fjkld
you@you #:you@you #:
在调用一次函数后,显示除了两个“you@you #:”,也就是说有一次scan.nextLine()并没有阻塞,有谁知道这是为什么吗?
还有除了能够在被调用的函数中加上一个scan.nextLine();来把那个不知道从哪里来的数据读来丢掉,更好的解决办法是什么? 展开
1个回答
展开全部
楼主的意思表达的不是很清楚
没关系,来分析一下代码:
运行程序后,程序进入while循环,先执行System.out.print("you@you #:");输出内容,然后执行cmd= scan.nextLine();在这里阻塞,如果控制台不输入,就不会执行。此时控制台随便输入,比如123.
程序从阻塞转为继续运行,判断if(cmd.equals("")),不为true,那么就不continue(continue是跳出此次循环继续下一次循环),接在往下执行,判断if(cmd.equals("exit")),不为true,不执行return,继续调用getInput();在这个方法内,String i=scan.next();使代码阻塞,同样的,输入123,代码继续。如果到这里都看的没有问题的话,继续,如果有问题,先回头理一下思路。
之后又回到while循环,输出you@you #,这次在阻塞的时候不输入东西,直接回车,那么在执行if(cmd.equals(""))判断的时候,为true,执行continue,跳出此次循环,因此下面的代码没有执行。
第三次循环,输出you@you #,阻塞的时候我们输入exit,程序退出
程序流程全部走完,还有疑问的话 可以继续交流
没关系,来分析一下代码:
运行程序后,程序进入while循环,先执行System.out.print("you@you #:");输出内容,然后执行cmd= scan.nextLine();在这里阻塞,如果控制台不输入,就不会执行。此时控制台随便输入,比如123.
程序从阻塞转为继续运行,判断if(cmd.equals("")),不为true,那么就不continue(continue是跳出此次循环继续下一次循环),接在往下执行,判断if(cmd.equals("exit")),不为true,不执行return,继续调用getInput();在这个方法内,String i=scan.next();使代码阻塞,同样的,输入123,代码继续。如果到这里都看的没有问题的话,继续,如果有问题,先回头理一下思路。
之后又回到while循环,输出you@you #,这次在阻塞的时候不输入东西,直接回车,那么在执行if(cmd.equals(""))判断的时候,为true,执行continue,跳出此次循环,因此下面的代码没有执行。
第三次循环,输出you@you #,阻塞的时候我们输入exit,程序退出
程序流程全部走完,还有疑问的话 可以继续交流
追问
前面我没问题,
“之后又回到while循环,输出you@you #,这次在阻塞的时候不输入东西,直接回车"
您的回答中说调用函数结束后,回到while中,输出you@you #:这时候程序并没有阻塞,您运行试试。
追答
看了文档
发现scanner.next这个方法的描述是这样的:
Finds and returns the next complete token from this scanner.
A complete token is preceded and followed by input that matches
the delimiter pattern.
意思是说,next取到的string是夹在两个分割符之间的,默认的分隔符貌似是换行
而输入的时候,放你输入一个回车,实际上是输入了换行+回车。
因此,输入123,再执行next的时候,实际产生了5个char,1,2,3,换行,回车。(关于这个,可以参看参考资料中我之前回答过的一个问题)
而该方法截取的只有123,换行和回车没有截取。
所以在下一次调用nextLine的时候,发现hasNext返回的是true,因此就没有阻塞,而nextline读到的就是换行和回车,变成字符串就是空字符串
如果把getInput方法里面的next换成nextLine就不会出现不阻塞的情况
不过这里我的猜测成分多一点。还需要更权威的鉴定,比如,是否以换行符分割之类。但是解释上面,行得通
参考资料: http://zhidao.baidu.com/question/391902081.html?oldq=1
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询