【问题标题】:Cannot return modified String from static method无法从静态方法返回修改后的字符串
【发布时间】:2017-03-12 02:21:55
【问题描述】:

我对编码很陌生,似乎无法返回任何东西。我需要将大写字符转换为小写,反之亦然。这是我的代码:

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String str = sc.nextLine();
    invString(str);
    sc.close();

}

private static String invString(String str) {
    for (int i = 0; i < str.length(); i++) {
        char ch = str.charAt(i);
        if (ch > 97) {
            ch = Character.toUpperCase(ch);
            return str;
        } else {
            ch = Character.toLowerCase(ch);
            return str;
        }
    }
    return null;
}

我做错了什么? (返回方面,代码还没写完)

编辑****************

感谢有用的评论,据我所知,我没有存储修改的地方,所以我添加了 String res = ""; 并继续将值添加到 String res 但最后,当返回 res 时,我仍然没有得到任何输出......这是整个事情:

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String str = sc.nextLine();
    String st = invString(str);
    sc.close();

}

private static String invString(String str) {
    String res = "";
    for (int i = 0; i < str.length(); i++) {
        char ch = str.charAt(i);

        if (65 <= ch && ch <= 90) {
            ch += 32;
            res += ch;

        } else if (97 <= ch && ch <= 122) {
            ch -= 32;
            res += ch;
        }


    }

    return res;
}

ps。我没有使用准备好的方法,因为我的任务需要它。

【问题讨论】:

  • 有什么问题?存在逻辑错误,因为输入了 if- 或 else- 块,因此循环仅执行一次 iff。 str.length() &gt; 0。您使用的 return 语句(语法上)正确。
  • “好像不行”? 具体。很可能,您对变量和字符串在 Java 中的工作方式做出了多个错误的假设——字符串是不可变的,并且为变量赋值不会改变其他拥有自己变量的对象。
  • 你没有理由拒绝每个人的回答,
  • @PranoySarkar 因为 2/5 是“每个人”(是的,我投了反对票,但在海报回应了我的投诉后我撤回了反对票)。

标签: java string return


【解决方案1】:

您的代码中存在许多缺陷。首先,您尝试在每个 if 语句中返回原始字符串 str。因此,invString( String ) 方法只是简单地返回作为参数传递的原始字符串。相反,您应该继续将字符添加到新的 String 变量中(如@Massimo 所说)。此外,您最终将返回null。为什么还要这样做?您可能希望返回新的 String 变量。

private static String invString(String str) {

    String s=""; //new String variable
    for (int i = 0; i < str.length(); i++) {
        char ch = str.charAt(i);
        if (ch > 97) {
            ch = Character.toUpperCase(ch);
            s+=ch; //do this instead of returning str
        } else {
            ch = Character.toLowerCase(ch);
            s+=ch; //same here
        }
    }
    return s; //return the new String
}

其次,在您的 main 方法中,简单地调用该方法是错误的,因为它返回一个值。您应该将invString() 返回的值分配给一个字符串变量。

public static void main(String[] args){
    ...
    String st = invString(str); //st stores the value of str with 
                                //letters' cases changed
}

【讨论】:

    【解决方案2】:

    你返回你的 str 对象而不更新它。 您应该生成一个新字符串,其中放置您反转大小写的字符。 检查最后的答案 How can I invert the case of a String in Java?

    【讨论】:

      【解决方案3】:

      如果要使用倒排字符串,需要实际使用返回值,例如:

      str = invString (str)
      

      字符串是不可变的,因此您无法更改其中的字符。您只能将字符串变量替换为新字符串。

      修改您正在访问的字符不会影响字符串。您需要构建一个新字符串(查找StringBuilder)并返回它。

      【讨论】:

      • “你需要实际使用返回的值”——这不是真的。您可以调用具有除 void 以外的返回类型的方法,并且不将其返回值分配给某个变量。
      • 我不是那个意思!我的意思是,如果您想访问新值而不是丢弃结果,则需要使用返回的值。
      • 那你应该这样写。
      • 我添加了一个应该满足学究的限定符
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多