为什么需要初始化字符串变量,有时不初始化';在java中声明时是否需要初始化?
我正在编写一个简单的applet程序,它接收用户的输入并显示它们`为什么需要初始化字符串变量,有时不初始化';在java中声明时是否需要初始化?,java,string,initialization,applet,paint,Java,String,Initialization,Applet,Paint,我正在编写一个简单的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{
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
的值,但是你在保证没有值的地方使用了str
(catch
处理程序),如果你没有预先初始化它,就不能保证有值,因为,在分配给str
之前,可以在try
中引发异常
如果将调用移动到g.drawString(str,75,75)
进入try
,则不需要=null
初始值设定项
旁注:
s1
已经是一个字符串,因此不需要执行str=string.valueOf(s1)
。只需在g.drawString(str,75,75)中使用s1
代码>行。因为你只在保证有值的地方使用s1
的值,但是你在没有预先初始化它的情况下就不能保证有值的地方使用str
,因为毕竟,在分配给str
之前,可以在try
中引发异常
如果将调用移动到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块返回或者从catch块抛出,这样只有在try块毫无例外地完成时才能到达g.drawString
行。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
,以便只有try块毫无例外地完成时才能到达g.drawString
行。实例变量不需要初始化,只需要局部变量(在函数或构造函数内部)需要初始化)实例变量不需要初始化,只有局部变量(在函数或构造函数内部)需要初始化)“为什么str变量必须声明为null”FWIW,=null
位不是声明,这是一个初始化。它将两个变量初始化为null,而不仅仅是str。您可以用不同的方式声明一个变量。请参见:@Phobos,它只适用于最后一个变量。要初始化这两个字符串,您需要字符串s1=null,str=null
。不要只捕获异常
(如果您可以帮助的话),也不要像这里这样忽略异常。“为什么str变量必须声明为null”FWIW,=null
位不是声明,而是初始化。这是将两个变量初始化为null,不仅仅是str。您可以用不同的方式声明变量。请参见:@Phobos,它只适用于最后一个变量。要初始化这两个字符串,您需要字符串s1=null,str=null代码>。不要只捕获异常
(如果您可以帮助的话),也不要像在这里一样忽略异常。