嗨我对以下程序有疑问,因为它给我一个错误说variable gradePoints might not have been initialized
,我在这里缺少什么..?另外我如何改进代码,使其接受字母a +作为A +和任何其他输入引发错误?谢谢!
import java.lang.*;
import java.io.*;
import java.util.*;
import java.util.Scanner;
public class Program
{
static final Map<String, Double> gradeToPointMap =
new LinkedHashMap<String, Double>() {{
put("A+", 4.0);
put("A", 4.0);
put("A-", 3.7);
put("B+", 3.3);
put("B", 3.0);
put("B-", 2.7);
put("C+", 2.3);
put("C", 2.0);
put("C-", 1.7);
put("F", 0.0);
}};
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
System.out.println("Enter A Letter Grade: ");
String letterGrade = keyboard.next();
getGradePoint(letterGrade);
}
public double getGradePoint(String letterGrade)
{
Double gradePoints = gradeToPointMap.get(letterGrade.toUpperCase());
if (gradePoints == null)
System.out.println("Unknown letter grade " + letterGrade);
else
System.out.println("Your grade point(GPA) is " + gradePoints);
}
}
答案 0 :(得分:1)
在开头初始化gradePoints
,如:
double gradePoints = 0.0;
或者将其添加到您的上一个else
块
gradePoints = 0.0;
还可以使用letterGrade.equals("A+")
来比较值,因为==
运算符会比较引用而不是字符串内容。
更新:
问题在于,当用户输入错误信息时,您的gradePoints
在其他if-else
块中初始化时未初始化。因此,当您最终尝试在println
中使用时,编译器会抱怨variable gradePoints might not have been initialized
答案 1 :(得分:1)
在对象创建期间,使用默认值隐式初始化成员变量(类变量)。这不会发生在方法的局部变量上,因为Object不知道/看到局部变量。因此,如果要使用局部变量,则必须显式初始化它。
声明局部变量时,请指定默认值。
double gradePoints;
必须:
double gradePoints = 0.0;
进行字符串比较(按值)时,必须使用String.equals()
或String.equalsIgnoreCase()
方法。 ==
用于对象比较,而不是值比较。
例如:if( letterGrade == "F")
必须写为if( letterGrade.equals("F"))
。
答案 2 :(得分:1)
为了您的兴趣,这就是我写它的方式。
static final Map<String, Double> gradeToPointMap =
new LinkedHashMap<String, Double>() {{
put("A+", 4.0);
put("A", 4.0);
put("A-", 3.67);
put("B+", 3.33);
put("B", 3.0);
put("B-", 2.67);
put("C+", 2.33);
put("C", 2.0);
put("F", 0.0);
}};
public static void main(String... args) {
Scanner keyboard = new Scanner(System.in);
System.out.println("Enter a letter grade as one of " + gradeToPointMap.keySet());
String letterGrade = keyboard.next();
Double gradePoints = gradeToPointMap.get(letterGrade.toUpperCase());
if (gradePoints == null)
System.out.println("Unknown letter grade " + letterGrade);
else
System.out.println("Your grade point(GPA) is " + gradePoints);
}
它给了我一个错误,说变量gradePoints可能没有被初始化,我在这里缺少什么..?
{
System.out.println("Error, you did not enter the correct information");
// gradePoints is not set to anything here
}
我怎样才能改进代码,使其接受字母a +作为A +而任何其他输入会引发错误?
不要将==
用于字符串,而是要使用.equals()
除了您的情况,您需要.equalsIgnoreCase
答案 3 :(得分:0)
更改
double gradePoints;
到
double gradePoints = 0.0;
对于接受a +,A +等,请使用:
if (letterGrade.equalsIgnoreCase("A+") { ... }
答案 4 :(得分:0)
启动gradePoints
double gradePoints = 0.0 ;
也可以使用equals来检查字符串
if( letterGrade.equals("A+"))
{
gradePoints = 4.0;
}
为他人做同样的事。
要检查有效的字符串,请执行
String grades = "A+A-B+B-C+C-D"
letterGrade = keyboard.next();
if(grades .indexOf(letterGrade )){
// process your logic
}else{
System.out.println("Enter valid grade ");
}
答案 5 :(得分:0)
您应该为此变量或else块中设置默认值。因为什么时候
else
{
System.out.println("Error, you did not enter the correct information");
}
发生,您的变量尚未初始化,之后您将使用它。
btw:使用String.equals()
而不是string1 == string2
答案 6 :(得分:0)
关于你的问题,
1) Method variable have to be initialised before use.
2) You may not intialise instance variable because instance variable are intialsed to their default value when you create a object.
3) == is used for refrence comparison in case of objects.
4) equals is used to check if two objects are meaningfully equal and equalsIgnoreCase is used to check same ignoring the case.
@Peter Lawrey:我没有反对你,但我认为程序员应该知道一些基本的东西,这些都是非常基本的。
“为什么要投票呢?这是一个非常合理的初学者问题?”,是的,提出这样的问题是合理的,但不要盲目地拿起答案,试着了解需要做什么并尝试自己编写代码您可能不会像SO专家可能给您的那样编写有效的代码,但如果您自己尝试并继续进一步改进,您将会到达那里,这只是基于我个人经验的建议。