我有一个创建String
的方法和另一个更改字符串
void create(){
String s;
edit(s);
System.out.println(s);
}
void edit(String str){
str = "hallo";
}
我的编译器说它“可能尚未初始化”。
有人可以解释一下吗?
答案 0 :(得分:2)
变量可能尚未初始化
在方法中定义s
时,必须在其中初始化s
,程序中的每个变量在使用其值之前必须具有值。
另一件重要的事情是,你的代码永远不会像预期的那样工作
java中的字符串是不可变的,因此您无法编辑String,因此您应该更改方法edit(Str s)
。
我将你的代码更改为类似的东西,但我认为你的编辑方法应该做另一件事,而不是返回“hallo”。
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";
}
在这个着名的问题:Is Java "pass-by-reference"?
中,阅读更多关于java传递值的信息请参阅此简单示例,显示java是按值传递的。我不能只用字符串做一个例子,因为字符串是不可改变的。所以我创建了一个包含String的包装类,该String可以看到差异。
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
}
}
答案 1 :(得分:-1)
您在方法s
中声明了局部变量create
,因此您需要在使用它之前对其进行初始化。请记住,java没有局部变量的默认值。
初始String s = ""
或任何比您的代码正常运行的值。
答案 2 :(得分:-3)
尝试初始化字符串" s"到一个空值,因为你已经声明了一个变量" s"但它尚未初始化。因此,当用作参数时,它不能传递该变量的引用。
String s = null;
希望这有帮助
答案 3 :(得分:-3)
给你的变量S一个值,或者像Jeroen Vanneve所说“将它改为String s = null;”