为什么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 块中将 return
或 throw
设置为默认值,以便仅在以下情况下到达 g.drawString
行try 块无一例外地完成。
实例变量不需要初始化,只需要初始化局部变量(在函数或构造函数内部)
我正在编写一个简单的 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 块中将 return
或 throw
设置为默认值,以便仅在以下情况下到达 g.drawString
行try 块无一例外地完成。
实例变量不需要初始化,只需要初始化局部变量(在函数或构造函数内部)