Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么需要初始化字符串变量,有时不初始化';在java中声明时是否需要初始化?_Java_String_Initialization_Applet_Paint - Fatal编程技术网

为什么需要初始化字符串变量,有时不初始化';在java中声明时是否需要初始化?

为什么需要初始化字符串变量,有时不初始化';在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{

我正在编写一个简单的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
的值,但是你在保证没有值的地方使用了
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。不要只捕获
异常
(如果您可以帮助的话),也不要像在这里一样忽略异常。