Java程序扫描JSONObject时出现Scanner无限循环问题求助
解决你的Scanner无限循环与JSONObject构建问题
嘿,我一眼就抓到问题所在了——你的Scanner陷入无限循环,根本走不到构建JSONObject的步骤,咱们一步步来搞定:
为什么会无限循环?
你用scanner.hasNext()作为while循环的判断条件,这个方法的特性是会一直阻塞,等待新的输入内容,除非系统收到EOF信号(Windows按Ctrl+Z,Linux/macOS按Ctrl+D),不然程序会永远卡在循环里,根本执行不到后面的JSONObject代码。
解决方案1:读取单行输入(最常用场景)
如果你的需求是读取用户输入的一行完整内容(比如一个合法的JSON字符串),直接用scanner.nextLine()替代循环就行,用户按回车就会结束输入,修改后的完整代码如下:
package com.readvalues.main; import java.util.Scanner; import net.sf.json.JSONObject; public class ReadValues { public static void main(String[] args) { try { System.out.println("Enter the data (输入完整JSON后按回车):"); Scanner scanner = new Scanner(System.in); // 读取一行输入,直接结束输入流程 String input = scanner.nextLine(); // 构建并打印JSONObject JSONObject jsonObject = JSONObject.fromObject(input); System.out.println("解析后的JSON对象:"); System.out.println(jsonObject.toString(4)); // 带缩进的美观输出 scanner.close(); // 记得关闭Scanner释放资源 } catch (Exception e) { System.err.println("处理出错:" + e.getMessage()); e.printStackTrace(); } } }
解决方案2:带终止条件的多输入拼接
如果你的需求是读取多个输入片段(比如空格分隔的内容),直到用户触发终止指令,可以给循环加个终止条件,比如输入"exit"就停止:
package com.readvalues.main; import java.util.Scanner; import net.sf.json.JSONObject; public class ReadValues { public static void main(String[] args) { // 用StringBuilder代替字符串拼接,提升效率 StringBuilder inputBuilder = new StringBuilder(); try { System.out.println("Enter the data (输入exit结束):"); Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { String part = scanner.next(); // 触发终止条件 if ("exit".equalsIgnoreCase(part)) { break; } inputBuilder.append(part); } JSONObject jsonObject = JSONObject.fromObject(inputBuilder.toString()); System.out.println("解析后的JSON对象:"); System.out.println(jsonObject.toString(4)); scanner.close(); } catch (Exception e) { System.err.println("处理出错:" + e.getMessage()); e.printStackTrace(); } } }
额外小提示
- 你原来的
x = x + scanner.next()字符串拼接方式效率很低,尤其是输入内容多的时候,用StringBuilder会更高效; net.sf.json是比较老旧的JSON处理库,如果是新项目,更推荐使用Jackson、Gson这类主流库,兼容性和功能都更好。
内容的提问来源于stack exchange,提问作者Anish
相关产品推荐
相关产品推荐

