为什么我收到错误来初始化信件以及如何解决?

时间:2014-07-04 03:01:27

标签: java

public static char determineGrade(float grade)
{
    char letter;


        if(grade>=90 && grade<=100)
        {
            letter='A';
        }
        else if(grade>=80 && grade<=89)
        {
            letter='B';
        }
        else if(grade>=70 && grade<=79)
        {
            letter='C';
        }
        else if(grade>=60 && grade<=79)
        {
            letter='D';
        }
        else if(grade<=59)
        {
            letter='F';
        }


   return letter;         
}

该程序一直告诉我初始化字母,但我不明白为什么需要。谢谢。

5 个答案:

答案 0 :(得分:4)

  

为什么我收到错误来初始化信件以及如何解决?

问题是,如果没有将值分配给return,则可以到达letter语句。 (当grade大于100.0时会发生这种情况。虽然在应用程序的上下文中可能没有意义,但Java编译器无法知道这一点。)

人们建议返回“默认”值。我认为这是错误的,除非API规范定义了默认值。 (而且,IMO,这样做的API设计很糟糕。)

我认为更好的方法是抛出异常(例如IllegalArgumentException),如果提供的参数没有意义。

public static char determineGrade(float grade) {
    if (grade >= 90 && grade <= 100) {
        return 'A';
    } else if (grade >= 80 && grade <= 89) {
        return 'B';
    } else if (grade >= 70 && grade <= 79) {
        return 'C';
    } else if (grade >= 60 && grade <= 79) {
        return 'D';
    } else if (grade >= 0 && grade <= 59) {
        return 'F';
    } else {
        throw new IllegalArgumentException("grade is out of range: " + grade);
    }
}

此处的另一个设计问题是使用浮点数来表示等级是否合适。存在这样的风险:计算等级的计算给出由于舍入误差而略微“关闭”的值;即89.999998而不是90.0。如果您要在此处使用浮点类型,则需要对整数值使用阈值比较而不是简单的>=<=

答案 1 :(得分:1)

char letter只是声明一个char类型的变量。初始化意味着在变量被执行到程序的其他地方之前为其分配初始值。

在您的情况下,如果grade不在您明确检查的任何范围内,letter需要您的方法可以返回的默认值。由于这是方法中的局部变量,因此编译器不会为char分配标准默认值,如文档摘录中所述:

  

局部变量略有不同;编译器永远不会为未初始化的局部变量分配默认值。如果无法初始化声明它的局部变量,请确保在尝试使用它之前为其赋值。访问未初始化的局部变量将导致编译时错误。

这就是你需要明确初始化它的原因。

答案 2 :(得分:1)

问题是:

else if(grade<=59)
        {
            letter='F';
        }

应该是

 else 
        {
            letter='F';
        }

因为你有一系列if条件,所以编译器无法知道某个条件在运行时是否为真。因此,您需要声明letter的默认值,或者最后else不应该有任何条件。

对于超过100的成绩,应该有一些检查来处理这个问题。

如果超过100的等级不可接受,则应在方法开头抛出异常(根据经验):

if(grade > 100){
   throw new IllegalArgumentException("Invalid input"):
}

答案 3 :(得分:0)

试试这个,

public static char determineGrade(float grade) {
    char letter = 0;

    if (grade >= 90 && grade <= 100) {
        letter = 'A';
    } else if (grade >= 80 && grade <= 89) {
        letter = 'B';
    } else if (grade >= 70 && grade <= 79) {
        letter = 'C';
    } else if (grade >= 60 && grade <= 79) {
        letter = 'D';
    } else if (grade <= 59) {
        letter = 'F';
    }
    return letter;
}

有一种情况是所有if语句都没有执行(当数字> 100时)。然后字母变量没有值。为了防止字母变量应该用默认值初始化。

答案 4 :(得分:0)

因为char仅在if语句中给出了值,所以该方法不知道是否会给它一个值(它假设有可能没有if个语句将有一个真实的条件),因此你被要求给出一个初始值。 绕过它的另一种方法是将最后一个else if语句转换为else,因为它涵盖了所有剩余可能性。