Java中如何在函数内给主类字符串追加内容而不覆盖原有数据
核心问题定位
- 你在
optionA函数入口第一行写了_userInput = "";,直接把传入的原有字符串内容清空,这是旧内容被覆盖的根本原因,不管你后面用不用concat,原来的内容已经在函数刚进来的时候被删除了。 - 字符串判空逻辑错误:Java中字符串是引用类型,用
== ""比较的是字符串对象的内存地址,不是实际存储的内容,应该用isEmpty()或者equals("")做内容判空。 - 潜在输入异常问题:主逻辑中用
choice.next()读取菜单选项,该方法不会消费输入末尾的换行符,后续调用s.nextLine()时会直接读取到残留的空换行,导致你没法正常输入新内容。
修复后的代码
optionA函数修复版
public static String optionA(String _userInput) { // 删掉原来的_userInput = ""; 不要清空传入的原有内容 Scanner s = new Scanner(System.in); System.out.println("Enter new text: "); String newLine = s.nextLine(); // 原有内容为空就直接返回新输入,否则拼接后返回 if (_userInput == null || _userInput.isEmpty()) { System.out.println(newLine); return newLine; } // 如果需要两次输入之间换行分隔,可以改成 return _userInput + "\n" + newLine; return _userInput.concat(newLine); }
主逻辑修正点
主代码中调用optionA的地方,要确保传入和赋值的是同一个存储用户输入的全局变量,示例:
// 初始化存储所有用户输入的变量 String userInput = ""; for(;;) { menuOptions(); String menuChoice = choice.next(); // 加这行消费next()遗留的换行符,避免后续nextLine读空 choice.nextLine(); System.out.println("your choice is " + menuChoice + "\n"); if (menuChoice.equals("a")) { // 传入当前已有的userInput,把返回的拼接后结果重新赋值给userInput userInput = optionA(userInput); } }
效果验证
修复后第二次调用选项a输入"Even more!",最终存储的字符串为All the way!Even more!,调用选项b搜索"All"会正常返回索引0,不会再出现-1的情况。如果需要两次输入之间换行分隔,按代码注释修改拼接逻辑即可。
内容的提问来源于stack exchange,提问作者Diante Page
相关产品推荐
相关产品推荐

