2012-11-08 53 views
-3

嗨我有以下程序的问题,因为它给了我一个错误说,variable gradePoints might not have been initialized,我在这里失踪..?我怎样才能改善代码,使其接受字母A +作为A +和其他任何输入引发错误?谢谢!!java变量未初始化

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

对于字符串比较,请参阅http://stackoverflow.com/questions/9870985/if-condition-does-not-work/9870998#9870998等等 – hmjd

+1

为什么downvotes?这是一个完全合理的初学者问题? – Minion91

+0

你为什么编辑和完全改变你的问题?你粘贴了Peter Lawrey回答的代码,现在怎么样? **这个**代码有什么新问题吗? – maba

回答

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

it gives me an error says that variable gradePoints might not have been initialized, what am i missing here..?

{ 
    System.out.println("Error, you did not enter the correct information"); 
    // gradePoints is not set to anything here 
} 

also how can i improve the code so that it accept letters a+ as A+ and any other input throw an error?

不要使用==的字符串,而不是要使用.equals()

除非你的情况,你想.equalsIgnoreCase

+0

嗨我试过你的解决方案..很好,但我已修改添加功能,现在不能正常工作,请你让我知道我在这里做错了什么.. – divya88nair

+0

我怀疑,如果你阅读编译错误信息,你会能够解决它。什么是错误信息? –

+0

我认为她错过了她的方法中的静态,因为它是从静态方法调用 –

1

初始化gradePoints开头,如:

double gradePoints = 0.0;

或者添加到您的最后else

gradePoints = 0.0;

还可以使用letterGrade.equals("A+"),因为==操作比较值将比较参考而不是字符串内容。

UPDATE:

的问题是什么,当用户接着输入错误的信息,请gradePoints没有得到,因为它在其他if-else块被初始化初始化。因此,当在年底尝试在println使用,则编译器抱怨variable gradePoints might not have been initialized

+0

输入字母: 一个 错误,你没有输入正确的信息 你的绩点(GPA)是0.0 – divya88nair

+0

什么时我错过了这里。? – divya88nair

+0

使用等于,看我的回答 – UmNyobe

0

变化

double gradePoints; 

double gradePoints = 0.0; 

对于接受+,A +等使用:

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

发起成绩积分

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

你应该把默认值此变量或else块。因为当

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

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

BTW:使用String.equals()而非string1 == string2

1

成员变量(类变量)被隐含的默认值创建对象时初始化。这不会发生在方法的局部变量上,因为Object不知道/看到局部变量。因此,如果你想使用本地变量,你必须明确地初始化它。

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

double gradePoints; 

必须是:

double gradePoints = 0.0; 

在做字符串比较(由值),人们必须使用String.equals()String.equalsIgnoreCase()方法。 ==用于对象比较而不是数值比较。

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

+0

值得投票!它给我一个错误说变量gradePoints可能没有被初始化?这是这个问题的完美答案。 –

0

@ divya88nair:你笑没有人接受答案只是因为有人给你一个拼盘的解决方案(Compelete代码)而不是为你的知识添加一些东西并引导到解决方案的答案。

关于你的问题,

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

“为什么downvotes?这是一个完全合理的初学者问题?”,是这是合理的问这样的问题,但不只是盲目地拿起答案,尝试了解需要做什么,并尝试编写代码你自己可能不会像SO专家可能会给你的那样写出有效的代码,但如果你自己尝试并进一步改进,那么你会到达那里,这仅仅是基于我个人经验的建议。