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;
}
该程序一直告诉我初始化字母,但我不明白为什么需要。谢谢。
答案 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
,因为它涵盖了所有剩余可能性。