这是换行符残留问题:nextInt()不读取换行符,导致nextLine()立即返回空字符串;正确做法是调用scanner.nextLine()手动清除残留换行符。
Scanner用nextInt()后nextLine()读不到内容
这是最典型的换行符残留问题:调用
、
等方法不会消费输入末尾的换行符,导致紧接着的
立刻读到空字符串。
现象:用户输入
,
取走123,
返回空串,而不是"abc"
本质:
只读数字,停在换行符前;
从当前位置开始读,遇到第一个
就结束,所以得到空行
别用
硬扛——它解决不了“根本没读到后续输入”这个事实
正确做法是手动吃掉残留换行符:
(单独一行,不赋值)
next()和nextLine()对空白的处理差异
跳过开头所有空白(空格、tab、换行),读到下一个空白为止;
读整行,包括开头空格,但不包含换行符本身。
输入
(前面两个空格):
返回
,
返回
如果真要读带前导空格的一整行,必须用
;若用
,永远得不到开头空格
注意
在缓冲区为空时会阻塞等待,不是“跳过”,这点常被误以为是bug
用hasNextLine()预防NoSuchElementException
当输入流提前关闭(比如重定向文件末尾、管道断开),或用户直接按Ctrl+D/Ctrl+Z时,
会抛
。
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
不能靠try-catch兜底——这掩盖了真正的输入异常,比如本该有数据却没了
必须先用
判断是否有下一行,再调用
注意:
不消耗输入,可安全多次调用;但
和
等方法可能触发阻塞等待,行为不一致
示例:
Scanner不是线程安全的,别共享实例
多个线程共用一个
对象,即使加锁也容易因内部缓冲区错乱导致
返回截断或错位内容。
立即学习
“
Java免费学习笔记(深入)
”;
常见错误:把
作为static字段,在工具类里复用
后果:A线程刚调完
,B线程插进来调
,结果读到A残留的半截输入
建议:每个需要读输入的逻辑,自己创建
(如
),用完不close(System.in不能关)
如果封装成方法,参数传
比用全局实例更可控
换行符清理不是加一行
就能一劳永逸的事——它依赖你清楚知道上一个读取操作停在哪、缓冲区当前状态如何。很多人卡住,是因为把
当成纯“字符串切片工具”,忽略了它背后是流式字节读取 + 内部指针移动的真实机制。
nextInt()nextDouble()nextLine()123↵abc↵nextInt()nextLine()nextInt()nextLine()\nnextLine().trim()scanner.nextLine();next()nextLine() hello world↵next()"hello"nextLine()" hello world"nextLine()next()nextLine()nextLine()NoSuchElementExceptionhasNextLine()nextLine()hasNextLine()hasNext()hasNextInt()if (scanner.hasNextLine()) {
String line = scanner.nextLine();
}ScannernextLine()ScannernextInt()nextLine()Scannernew Scanner(System.in)ScannernextLine()Scanner