为什么String变量在java中声明时需要初始化,有时不需要初始化?

Why String variables are needed to be initialized and sometimes it doesn't required initialization while declaring them in java?

我正在编写一个简单的 applet 程序,它接受用户的输入并显示它们。 `

public void init(){
    text1=new TextField(8);

    add(text1);

    text1.setText("0");

}
public void paint(Graphics g){
    int x=0;
    String s1,str = null;
    g.drawString("input in the  box",10,50);
    try{
        s1=text1.getText();
        str=String.valueOf(s1);


    }
    catch(Exception e){}
    g.drawString(str,75,75);
}
public boolean action (Event event,Object object){
    repaint();
    return true;
}

` 在 paint() 方法中,为什么 str 变量必须声明为 null 而声明另一个字符串变量 s1 而不初始化是可以的? 如果不初始化 str 变量,它就不会编译。

因为你只在保证有值的地方使用了s1的值,但是你在一个地方(catch处理程序)使用了str 不是 如果您不预先将其初始化为某个值,则保证有一个值,因为毕竟,在分配给 try 之前可能会抛出异常str.

如果您将对 g.drawString(str,75,75); 的调用移动到 try,则不需要 = null 初始化程序。


旁注:s1 已经是一个字符串,因此无需执行 str = String.valueOf(s1)。只需在 g.drawString(str,75,75); 行中使用 s1

Java 编译器允许使用未初始化的变量,只要保证它们在用于某些用途时具有值即可。

String s1,str = null; // s1 is not set
g.drawString("input in the  box",10,50);
try{
    s1=text1.getText(); // s1 is set
    str=String.valueOf(s1); // s1 is used
}
catch(Exception e){}
g.drawString(str,75,75);

由于上一行初始化了s1,它可以安全地传递给String.valueOf

str 的问题是它在 try-catch 块之后使用,这可能会跳过设置它的行。

String s1,str; // str is not set
g.drawString("input in the  box",10,50);
try{
    s1=text1.getText(); // if this throws an exception...
    str=String.valueOf(s1); // ...this is never reached
}
catch(Exception e){} // the exception is caught and ignored, so we continue
g.drawString(str,75,75); // str is still not set - error!

只要有可能在初始化之前使用变量,编译器就会拒绝它。在这种情况下,您可以在 catch 块中将 str 设置为默认值,或者在 catch 块中将 returnthrow 设置为默认值,以便仅在以下情况下到达 g.drawString 行try 块无一例外地完成。

实例变量不需要初始化,只需要初始化局部变量(在函数或构造函数内部)