java变量未初始化

java变量未初始化,java,Java,您好,我有以下程序的问题,因为它给我一个错误,说变量gradePoints可能尚未初始化,我在这里遗漏了什么。。?另外,如何改进代码,使其接受字母a+作为a+,并且任何其他输入都会抛出错误?谢谢 import java.lang.*; import java.io.*; import java.util.*; import java.util.Scanner; public class Program { static final Map<String, Double>

您好,我有以下程序的问题,因为它给我一个错误,说变量gradePoints可能尚未初始化,我在这里遗漏了什么。。?另外,如何改进代码,使其接受字母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.0

或者将其添加到最后一个else块中

分数=0.0

还可以使用letterGrade.equalsA+来比较值,因为==运算符将比较引用而不是字符串内容

更新:

问题是,当用户输入错误信息时,您的成绩点不会初始化,因为它会在其他if-else块中初始化。因此,当您最后尝试在println中使用时,编译器会抱怨变量gradePoints可能尚未初始化

double gradePoints;

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

if (letterGrade.equalsIgnoreCase("A+") { ... }

启动爬坡点

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 ");
    }

您应该为这个变量或在else块中输入一个默认值。因为当

  else
  {
    System.out.println("Error, you did not enter the correct information");
  }
发生时,您的变量尚未初始化,之后您将使用它


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

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

声明局部变量时,请指定默认值

double gradePoints;
必须是:

double gradePoints = 0.0;
按值进行字符串比较时,必须使用String.equals或String.equalsIgnoreCase方法。==用于对象比较,而不是值比较


例如:if letterGrade==F必须像letterGrade.equalsF.一样书写。

出于您的兴趣,我会这样写

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);
}
另外,如何改进代码,使其接受字母a+作为a+,并且任何其他输入都会抛出错误

不要对字符串使用==而要使用.equals


equalsIgnoreCase

@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:我对你没有什么不满,但我认为程序员应该知道一些基本的事情,这些都是非常基本的


为什么会有反对票?这是一个非常合理的初学者问题,是的,问这样的问题是合理的,但不要盲目地回答,试着理解需要做什么,试着自己写代码。你可能写的代码没有专家给你的那么高效,但如果你自己尝试并进一步改进,你会成功的,这只是一个基于我个人经验的建议

要进行字符串比较,请参见其他许多选项中的“为什么是否决票”?这是一个非常合理的初学者问题?你为什么要完全编辑和修改你的问题?你粘贴了Peter Lawrey回答的密码,现在怎么办?该代码有新问题吗?该方法应为静态类型。编写公共静态双getGradePoints……输入字母等级:错误,您没有输入正确的信息您的成绩点GPA为0.0使用答案中提到的相等。字符串不是使用==进行比较的。它是使用相等方法进行比较的。因此您应该写,letterGrade.equalsB+{}…@WayneRooney是的,我在答案中提到过。好的,它的工作!!谢谢有没有更好的方法来编写上面的代码..?嗨,我尝试了你的解决方案..效果很好,但我修改了添加函数,现在效果不好,你能告诉我我做错了什么吗..我怀疑如果你读了编译错误消息,你就能解决它。错误消息是什么?我认为她在方法中遗漏了static,因为它是从static方法added static调用的,但是现在错误是error:missing returnstatement@divya88nair听起来您缺少返回语句,或者您不需要返回语句。使返回类型无效而不是双重。值得投票!!!它给了我一个错误,说变量gradePoints可能没有初始化?这是这个问题的完美答案。
{
    System.out.println("Error, you did not enter the correct information");
    // gradePoints is not set to anything here
}
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.