-3

嗨,我对以下程序有疑问,因为它给了我一个错误说,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);
     }

 }
4

7 回答 7

1

gradePoints在开头初始化,如:

double gradePoints = 0.0;

或将此添加到您的最后一个else

gradePoints = 0.0;

letterGrade.equals("A+")用于比较值,因为==运算符将比较引用而不是字符串内容。

更新:

问题是当用户输入错误信息时,您的信息gradePoints不会被初始化,因为它在其他if-else块中被初始化。所以当你最后尝试使用时println,编译器会抱怨variable gradePoints might not have been initialized

于 2012-11-08T09:59:15.777 回答
1

成员变量(类变量)在对象创建期间被隐式初始化为默认值。这不会发生在方法的局部变量上,因为对象不知道/看到局部变量。因此,如果要使用局部变量,则必须显式初始化它。

声明局部变量时,分配一个默认值。

double gradePoints;

一定是:

double gradePoints = 0.0;

在进行字符串比较(按值)时,必须使用String.equals()orString.equalsIgnoreCase()方法。==用于对象比较而不是值比较。

例如:if( letterGrade == "F")必须写为if( letterGrade.equals("F"))

于 2012-11-08T10:00:26.617 回答
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+ 并且任何其他输入都会引发错误?

不要使用==for String 而不是你想使用.equals()

除了你想要的情况.equalsIgnoreCase

于 2012-11-08T10:00:58.227 回答
0

改变

double gradePoints;

double gradePoints = 0.0;

对于接受 a+、A+ 等,请使用以下命令:

if (letterGrade.equalsIgnoreCase("A+") { ... }
于 2012-11-08T09:59:36.860 回答
0

启动gradePoints

double gradePoints = 0.0 ;

也使用等于检查字符串

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 ");
    }
于 2012-11-08T10:00:03.763 回答
0

您应该为此变量或 else 块设置一个默认值。因为当

  else
  {
    System.out.println("Error, you did not enter the correct information");
  }

发生时,您的变量尚未初始化,然后您使用它。

顺便说一句:使用String.equals()而不是string1 == string2

于 2012-11-08T10:00:22.263 回答
0

@divya88nair:你不应该仅仅因为有人在拼盘中给你一个解决方案(完整代码)就接受答案,而是去寻找答案,它增加了你的知识并引导你找到解决方案。

关于你的问题,

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 专家可能给您的高效代码,但如果您自己尝试并继续改进它,您将到达那里,这只是基于我个人经验的建议。

于 2012-11-09T08:12:25.200 回答