0

i must write a programm that it translate grade in letter form like as A, B, C, D or F into number form (4, 3, 2, 1, 0 respective). The grade can have + or - too (+ increase grade of 0.3, - decrease of same number). I wrote this programm:

public class Grade{
   private String letterGrade;
   private String letter;
   private String symbol = "n";
   private double numericGrade;
   private double grade;
   private final double PLUS = 0.3;
   private final double MENO = -0.3;

   public Grade(String letterGrade) {
      this.letterGrade = letterGrade;
   }

   public double getNumericGrade() {
      if (letterGrade.length() > 1) {
         letter = letterGrade.substring(0, 1);
         symbol = letterGrade.substring(1, 2);
      }

      if (letter.equals("A")) {
         numericGrade = 4.0;

         if (symbol.equals("+")) {
            symbol = "n";
         }
      }
      else if (letter.equals("B")) {
         numericGrade = 3.0;
      }
      else if (letter.equals("C")) {
         numericGrade = 2.0;
      }
      else if (letter.equals("D")) {
         numericGrade = 1.0;
      }
      else if (letter.equals("F")) {
         numericGrade = 0.0;
      }

      if (symbol.equals("+")) {
         grade = numericGrade + PLUS;
      }
      else if (symbol.equals("-")) {
         grade = numericGrade + MENO;
      }
      else {
         grade = numericGrade;
      }

      return grade;
   }
}

And the programm tester:

import java.util.Scanner;
public class GradeTester{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        System.out.print("Please enter the grade in letter form: ");
        String letterGrade = in.next();

        if (letterGrade.equals("A") || letterGrade.equals("A+") || letterGrade.equals("A-")) {
            Grade graduation = new Grade(letterGrade);

            System.out.println("The grade in number form is: " + graduation.getNumericGrade());
        }
        else if (letterGrade.equals("B") || letterGrade.equals("B+") || letterGrade.equals("B-")) {
            Grade graduation = new Grade(letterGrade);

            System.out.println("The grade in number form is: " + graduation.getNumericGrade());
        }
        else if (letterGrade.equals("C") || letterGrade.equals("C+") || letterGrade.equals("C-")) {
            Grade graduation = new Grade(letterGrade);

            System.out.println("The grade in number form is: " + graduation.getNumericGrade());
        }
        else if (letterGrade.equals("D") || letterGrade.equals("D+") || letterGrade.equals("D-")) {
            Grade graduation = new Grade(letterGrade);

            System.out.println("The grade in number form is: " + graduation.getNumericGrade()); 
        }
        else if (letterGrade.equals("F")) {
            Grade graduation = new Grade(letterGrade);

            System.out.println("The grade in number form is: " + graduation.getNumericGrade());
        }
        else {
            System.out.println("Not permissed!");
        }
    }
}

But when i'm try it, only for letter without + or - this error appear:

Exception in thread "main" java.lang.NullPointerException
        at Grade.getNumericGrade(Grade.java:20)
        at GradeTester.main(GradeTester.java:13)

I don't understand what's the problem.

1 Answers1

2

try "A".equals(letter) in stead of letter.equals("A") that will prevent NullPointers as "A" can never be null :-)

You might want to do that for all equals() first the constant then the variable then try your code again...

oh and letter in Grade is always null as it only set if a symbol is also given.

Just because I'm feeling generous :-) here a working version

package nl.ivonet;

import java.util.Scanner;

public class Grade {
    private final String letterGrade;
    private String letter;
    private String symbol = "n";
    private double numericGrade;
    private static final double PLUS = 0.3;
    private static final double MENO = -0.3;

    public Grade(final String letterGrade) {
        this.letterGrade = letterGrade;
    }

    public double getNumericGrade() {
        if (this.letterGrade.length() > 1) {
            this.letter = this.letterGrade.substring(0, 1);
            this.symbol = this.letterGrade.substring(1, 2);
        } else {
            this.letter = this.letterGrade;
        }

        if ("A".equals(this.letter)) {
            this.numericGrade = 4.0;

            if ("+".equals(this.symbol)) {
                this.symbol = "n";
            }

        } else if ("B".equals(this.letter)) {
            this.numericGrade = 3.0;

        } else if ("C".equals(this.letter)) {
            this.numericGrade = 2.0;

        } else if ("D".equals(this.letter)) {
            this.numericGrade = 1.0;

        } else if ("F".equals(this.letter)) {
            this.numericGrade = 0.0;

        }

        final double grade;
        if ("+".equals(this.symbol)) {
            grade = this.numericGrade + PLUS;

        } else if ("-".equals(this.symbol)) {
            grade = this.numericGrade + MENO;

        } else {
            grade = this.numericGrade;

        }

        return grade;
    }


    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        System.out.print("Please enter the grade in letter form: ");
        String letterGrade = in.next();

        if ("A".equals(letterGrade) || "A+".equals(letterGrade) || "A-".equals(letterGrade)) {
            Grade graduation = new Grade(letterGrade);

            System.out.println("The grade in number form is: " + graduation.getNumericGrade());
        } else if ("B".equals(letterGrade) || "B+".equals(letterGrade) || "B-".equals(letterGrade)) {
            Grade graduation = new Grade(letterGrade);

            System.out.println("The grade in number form is: " + graduation.getNumericGrade());
        } else if ("C".equals(letterGrade) || "C+".equals(letterGrade) || "C-".equals(letterGrade)) {
            Grade graduation = new Grade(letterGrade);

            System.out.println("The grade in number form is: " + graduation.getNumericGrade());
        } else if ("D".equals(letterGrade) || "D+".equals(letterGrade) || "D-".equals(letterGrade)) {
            Grade graduation = new Grade(letterGrade);

            System.out.println("The grade in number form is: " + graduation.getNumericGrade());
        } else if ("F".equals(letterGrade)) {
            Grade graduation = new Grade(letterGrade);

            System.out.println("The grade in number form is: " + graduation.getNumericGrade());
        } else {
            System.out.println("Not permissed!");
        }
    }
}
Ivonet
  • 2,492
  • 2
  • 15
  • 28