【问题标题】:"Variable may not have been initialized"“变量可能尚未初始化”
【发布时间】:2014-01-03 01:47:43
【问题描述】:

我有一个创建 String 的方法和另一个更改字符串的方法

void create(){
    String s;
    edit(s);
    System.out.println(s);
}

void edit(String str){
    str = "hallo";
}

我的编译器说它“可能没有被初始化”。

谁能解释一下?

【问题讨论】:

  • Java 是按值传递的,您不要在 bearbeiten 方法中将字符串分配给 s。您将其分配给其本地 str 变量,因此 s 保持未初始化。
  • 将其更改为 String s = null;,因为您知道,s 可能未初始化。 str = hallo 不会修改原来的 s 变量。
  • 简而言之,方法中的变量应该在同一个方法中初始化。另一方面,字段/类变量不能显式初始化,因为它们将获得默认值。
  • 仅供参考,您不能更改字符串参数值。字符串是不可变的。将 edit() 更改为一个函数并返回一个新值。
  • 我真的不明白为什么我不能更改引用的值。字符串不是我想的原始类型,为什么我应该返回值而不直接访问它的源?

标签: java reference


【解决方案1】:

变量可能尚未初始化

当您在方法中定义 s 时,您必须在其中某处初始化 s 程序中的每个变量在使用其值之前必须有一个值。

同样重要的另一件事是,您的代码永远不会按预期工作,因为 java中的字符串是不可变的,那么你就不能编辑你的字符串,所以你应该改变你的方法edit(Str s)

我将您的代码更改为类似的内容,但我认为您的编辑方法应该做另一件事而不是返回“你好”。

void create(){
    String s=null;
    s =edit(); // passing a string to edit now have no sense
    System.out.println(s);
}
// calling edit to this method have no sense anymore 
String edit(){
    return "hallo"; 
}

在这个著名的问题中了解有关 java 是按值传递的更多信息:Is Java "pass-by-reference"?

请看这个简单的例子,说明 java 是按值传递的。我不能只用字符串做一个例子,因为字符串是不可变的。所以我创建了一个包装类,其中包含一个可以查看差异的可变字符串。

public class Test{

static class A{
 String s = "hello";

 @Override
 public String toString(){
   return s;
 }

}

public static void referenceChange(A a){
    a = new A(); // here a is pointing to a new object just like your example
    a.s = "bye-bye";
}

public static void modifyValue(A a){
   a.s ="bye-bye";// here you are modifying your object cuase this object is modificable not like Strings that you can't modify any property
}

public static void main(String args[]){
   A a = new A();
   referenceChange(a);
   System.out.println(a);//prints hello, so here you realize that a doesn't change cause pass by value!!
   modifyValue(a);
   System.out.println(a); // prints bye-bye 
}


}

【讨论】:

  • 您能否在您的帖子中加入按值传递、按引用传递的差异?一旦完成,我们可能最终会有一个值得投票的答案。
  • 如果您希望我脱掉衣服并向您展示我的赞成票,您需要的不仅仅是一个链接。你能详细说明它如何适用于他的问题吗?
  • @JeroenVannevel 我用自定义示例编辑,显示差异
  • 非常感谢,我担心我只是将 C 的指针与 Java 的引用混为一谈;)但是你的例子帮助我得到了它!
【解决方案2】:

你在方法create中声明了局部变量s,所以你需要在使用它之前对其进行初始化。请记住,java 没有局部变量的默认值。 初始化 String s = "" 或任何值,而不是您的代码将正常运行。

【讨论】:

    【解决方案3】:

    尝试将字符串“s”初始化为空值,因为您已声明变量“s”但尚未初始化。因此,它不能在用作参数时传递该变量的引用。

    String s = null;
    

    希望对你有帮助

    【讨论】:

      【解决方案4】:

      给你的变量 S 一个值或者像 Jeroen Vanneve 说的“把它改成 String s = null;”

      【讨论】:

        猜你喜欢
        • 2012-03-25
        • 2015-07-04
        • 2013-11-24
        • 2016-05-14
        相关资源
        最近更新 更多