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();来把那个不知道从哪里来的数据读来丢掉,更好的解决办法是什么?
展开
 我来答
haowujj
2012-07-04 · TA获得超过1207个赞
知道小有建树答主
回答量:177
采纳率:100%
帮助的人:262万
展开全部
楼主的意思表达的不是很清楚
没关系,来分析一下代码:
运行程序后,程序进入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

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
?>

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式