You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 14:00:01