java变量未初始化

时间:2012-11-08 09:58:04

标签: java

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

 }

7 个答案:

答案 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)

@ divya88nair:你不应该接受这个答案只是因为有人给你一个拼盘解决方案(Compelete code)而是寻找能够增加你知识并引导解决方案的答案。

关于你的问题,

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