-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+ として受け入れ、他の入力がエラーをスローするようにコードを改善するにはどうすればよいですか?

==使用したい代わりに文字列に使用しないでください.equals()

あなたが望むあなたの場合を除いて.equalsIgnoreCase

于 2012-11-08T10:00:58.227 に答える
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 の専門家が提供するのと同じくらい効率的なコードを記述しますが、自分で試してさらに改善を続ければ、そこにたどり着くことができます。これは、私の個人的な経験に基づく提案にすぎません。

于 2012-11-09T08:12:25.200 に答える
0

変化する

double gradePoints;

double gradePoints = 0.0;

a+、A+ などを受け入れるには、次を使用します。

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

gradePoint を開始する

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 ");
    }
于 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 に答える