为什么变量必须初始化?

时间:2015-12-02 11:15:41

标签: java switch-statement

这里我试图通过输入月份数来获得输出月份,但为什么我有错误   - " monthString"可能还没有被初始化?   - 为什么我没有得到来自" monthString"?

为什么必须初始化monthString?

import java.util.Scanner;
public class SwitchClass {

public static void main(String[]args)
{
   Scanner input = new Scanner(System.in);
   System.out.printf(" when did u born ? ");
   int monthNumber = input.nextInt();
   String monthString ;

switch (monthNumber)
{
    case 1:
    monthString = "January ";
        break;
    case 2:
        monthString = "February ";
        break;
    case 3:
        monthString = "March ";
        break;
    case 4:
        monthString = "April ";
        break;
    case  5:
        monthString = "May";
        break;
    case  6:
        monthString = "June";
        break;
    case  7:
        monthString = "July";
        break;
    case  8:
        monthString = "August";
        break;
    case  9:
        monthString = "September";
        break;
    case  10:
        monthString = "October";
        break;
    case  11:
        monthString = "November";
        break;
    case  12:
        monthString = "December";
        break;
   }
System.out.println(monthString);       }

 }

6 个答案:

答案 0 :(得分:8)

如果monthNumber不在1到12之间怎么办?在这种情况下,monthString不会被初始化。您在声明它时应该给它一些默认值:

String monthString = null; // or ""

答案 1 :(得分:5)

在switch语句中添加默认大小写是个好主意。

示例:

switch (monthNumber) {
    case 1: monthString = "January";
        break;

    //other cases...

    default: monthString = "Invalid Month Number";
        break;
}

这样,如果monthNumber不是1-12,那么仍然存在切换语句流向的默认情况。

答案 2 :(得分:1)

可能是这个链接有助于正确理解。

http://stackoverflow.com/questions/5478996/should-java-string-method-local-variables-be-initialized-to-null-or

答案 3 :(得分:0)

monthString是main()中的局部变量,因此必须初始化它以防止编译器错误。

如果monthString是一个Class变量,则不必显式初始化它。

您可以通过将monthString移到main()之外并将其声明为:

来完成此操作

static String monthString;

答案 4 :(得分:0)

因为Java语言的设计者认为它更有意义!初始化变量时,代码更易于阅读。语句String foo;感觉不确定,因为您必须猜测String的默认值是什么,而String foo = null;更具确定性。

为了给你一个更明显的例子,请考虑一下:

int x;
Int y;

你能很快猜出默认值是什么吗?您可能需要暂停几秒才能意识到x可能为0而y可能为空

答案 5 :(得分:-3)

局部变量必须在使用前始终初始化。 对于Java 6,编译器不考虑流控制块和try-catch块中的变量的" Incomplete" 初始化。必须对所有情况进行初始化:

如果 - 否则

    function yourFn(){

        //Your code
        echo $wpdb->insert_id;

    }

while循环

    $.ajax({url: server_side_url, success: function(result){
            $(Inputfield).val(result);
    }});

Try-Catch块

String s;
int a = 10;
if(a > 5){
 s = "5";
}else{
 System.out.println("");
}    
System.out.println(s); // error if s isn't initialized within both if and else blocks

切换块

String s;
int a = 10;
while(a > 0) {
  s= ">0";
  a--;
}    
System.out.println(s);// error if s isn't initialized outside the while

在切换之前初始化变量,一切都会好的。

String s;
try {
 s = "";
    } catch (Exception e) {}
System.out.println(s);// error if s isn't initialized within both try and catch blocks