Java 何时需要初始化字符串?

Java 何时需要初始化字符串?,java,string,initialization,switch-statement,Java,String,Initialization,Switch Statement,正在阅读各种来源的开关命令教程。我正在尝试基于本SwitchDemo教程创建一个小程序(为了节省空间,我删除了一些重复的代码): 在此代码中,monthString不需要在String monthString行中初始化。但是,我想使用Scanner将用户输入添加到代码中,如下所示: import java.util.Scanner; public class App2 { public static void main(String[] args) { Scanner scan

正在阅读各种来源的
开关
命令教程。我正在尝试基于本SwitchDemo教程创建一个小程序(为了节省空间,我删除了一些重复的代码):

在此代码中,
monthString
不需要在
String monthString行中初始化。但是,我想使用
Scanner
将用户输入添加到代码中,如下所示:

 import java.util.Scanner;
 public class App2 {

 public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);

    int month = scan.nextInt();

    String monthString;

    switch (month) {
    case 1:
        monthString = "January";
        break;      
    case 2:
        monthString = "February";
        break;
    case 3: 
        monthString = "March";
        break;
    default: 
        System.out.println("Invalid month");
        break;
    }
    System.out.println(monthString);
}
}

在这种情况下,代码不起作用,Eclipse告诉我需要初始化
monthString
;eclipse通过将
=null
添加到
字符串monthString
来更正它

这是什么原因

另外,我对Java完全陌生,所以你能像对不懂任何编程的人一样解释一下吗


谢谢

这是因为
monthString
是一个局部变量,在未初始化且仍在尝试使用它的地方,您可以选择一条路径

这在Java中是不允许的。我认为原因是Java很容易防止您犯错误。它迫使您承认您尚未将
monthString
设置为任何值,但您仍在尝试使用它。10次中有9次,这是开发人员的错误,所以Java不会让您这么做


解决此问题的一种方法是将
monthString
设置为
默认值中的某个值:
。您还可以将其初始化为null,如@Eran所说

这是因为
monthString
是一个局部变量,在未初始化且仍在尝试使用它的地方,可以选择一条路径

这在Java中是不允许的。我认为原因是Java很容易防止您犯错误。它迫使您承认您尚未将
monthString
设置为任何值,但您仍在尝试使用它。10次中有9次,这是开发人员的错误,所以Java不会让您这么做


解决此问题的一种方法是将
monthString
设置为
默认值中的某个值:
。您还可以将其初始化为null,如@Eran所说

您可以在声明时将其初始化为null:

String monthString=null

或者在开关的
default
子句中给它一些默认值

default: 
    System.out.println("Invalid month");
    monthString = null; // or some other default value
    break;
}

如果不执行这两个操作中的一个,您可能会访问
System.out.println(monthString)您可以在声明字符串时将其初始化为null:

String monthString=null

或者在开关的
default
子句中给它一些默认值

default: 
    System.out.println("Invalid month");
    monthString = null; // or some other default value
    break;
}

如果不执行这两个操作中的一个,您可能会访问
System.out.println(monthString)在初始化字符串之前,这是一个错误。

基本上,任何时候你可以访问一个语句,该语句中使用的任何变量都必须被初始化


在第二个示例中,
default
的大小写从
switch
语句中中断,但是代码随后会执行switch之后的下一个语句:
System.out.println(monthString)
。因此,变量必须在所有通向那里的代码路径中进行初始化,但它不是在
默认情况下。

基本上,任何时候你可以得到一个语句,该语句中使用的任何变量都必须进行初始化


在第二个示例中,
default
的大小写从
switch
语句中中断,但是代码随后会执行switch之后的下一个语句:
System.out.println(monthString)
。因此,该变量必须在所有通向该变量的代码路径中进行初始化,但它不在
默认情况下。

原因是它是Java语言规范的一部分。如果未“明确指定”局部变量(或空白最终字段),则不允许访问该变量的值。编译器执行分析以确保在访问之前进行赋值,而不管访问的代码路径是什么

在第二个示例中,通过默认开关的路径从不向
monthString
赋值,然后在println语句中访问变量的值


完全确定的赋值规则相当复杂。您可以在规范的第16章中阅读它们

这是因为它是Java语言规范的一部分。如果未“明确指定”局部变量(或空白最终字段),则不允许访问该变量的值。编译器执行分析以确保在访问之前进行赋值,而不管访问的代码路径是什么

在第二个示例中,通过默认开关的路径从不向
monthString
赋值,然后在println语句中访问变量的值


完全确定的赋值规则相当复杂。您可以在规范的第16章中阅读它们

或者,您可以尝试以下方法:

String monthString;
switch (month) {
case 1:
    monthString = "January";
    break;      
case 2:
    monthString = "February";
    break;
case 3: 
    monthString = "March";
    break;
default: 
    monthString = "Invalid month";
    break;
}
System.out.println(monthString);
为了在java中使用局部变量,必须将其初始化为某个值,即使该值设置为
null
。 eclipse所做的是遵循创建
monthString
和在
System.out.println(monthString)
中使用它之间的所有不同路径,并确定没有初始化
monthString
的位置

如果您要在所包含的
SwitchDemo
类中声明
monthString
,那么您的代码也是有效的,因为eclipse无法确定是否有另一个方法设置了
monthString
。(如果要执行此操作,您当然必须将
monthString
声明为静态,因为您只能从st中访问静态变量