0

私のtoString()方法が機能しない理由を誰かが理解できますか?正常にコンパイルされますが、実行するとランタイムエラーが発生します。

これが私のコードです:

import java.util.*;

public class ExamMarks {

    // fields
    private String moduleName;
    private int moduleCode;
    private int year;
    private int[] numbers;

    // methods
    public static int highestMark(int[] numbers) {
        int highest = numbers[numbers.length - 1];
        int i = numbers[0];
        for (i = 0; i < numbers.length - 1; i++) {
            if (numbers[i] > numbers[i + 1]) {
                highest = numbers[i];
            }
        }
        return highest;
    }

    public static double averageMark(int[] numbers) {
        int sum = 0;
        double average = 0.000;
        for (int i = 0; i < numbers.length; i++) {
            sum = numbers[i] + sum;
            average = sum / numbers.length;
        }
        return average;
    }

    // Constructor
    public ExamMarks() {
        moduleName = "Object Oriented Programming";
        moduleCode = 5015;
        year = 2013;
    }

    // toString
    @Override
    public String toString() {
        String result = ("The title of this module is : " + moduleName
                + "The code number of this module is: " + moduleCode
                + "The year of the Exam is: " + year + "Array average = "
                + averageMark(numbers) + "Highest grade = " + highestMark(numbers));
        return result;
    }

    // Tester
    public static void main(String[] args) {
        ExamMarks grade = new ExamMarks();
        Scanner percentages = new Scanner(System.in);
        int[] numbers = new int[20];
        double x = averageMark(numbers);

        System.out.println("Please enter 20 marks");

        for (int i = 0; i < numbers.length; i++) {
            numbers[i] = percentages.nextInt();

        }

        System.out.println(grade);
    }
}

そして、これは私が得るエラーです

java.lang.NullPointerException at ExamMarks.averageMark(ExamMarks.java:26) 
    at ExamMarks.toString(ExamMarks.java:42) 
    at java.lang.String.valueOf(Unknown Source) 
    at java.io.PrintStream.println(Unknown Source) 
    at ExamMarks.main(ExamMarks.java:65) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:27‌​2)
4

6 に答える 6

3

NullPointerExceptionはここにあります。privateint[]番号;

インスタンスの数値はnullです。

grade.toString()を呼び出すと、メソッドは

 public static double averageMark(int [] numbers){
    int sum = 0;  
    double average = 0.000;
    for (int i = 0; i < numbers.length; i++){   // !!!! numbers is null
于 2013-02-04T14:36:03.777 に答える
0

フィールド「moduleName」、「moduleCode」、および「year」は設定されていません。System.out.println(grade);を呼び出す前に、それらを設定してみてください。

于 2013-02-04T14:34:01.573 に答える
0

toString()関数を例外に対して回復力のあるものにする必要があります。

最も基本的なレベルでは、実装全体にtryとを追加するか、関数を作成してnullポインター例外を処理することができます。catchaverageMark(numbers)highestMark(numbers)

于 2013-02-04T14:34:27.923 に答える
0

クラスのprivate int [] numbers;フィールドを設定することはありません。ExamMarks

numbersメソッド内はクラスtoString()のインスタンスに属しますが、内は単なるローカル変数です。ExamMarksnumbersmain(...)

于 2013-02-04T14:36:18.047 に答える
0

きみが呼んだ

averageMark(numbers);

直接。したがって、パラメータとして使用している数値は問題ありません。

ただし、toString()メソッドもこのメソッドを呼び出しますが、初期化されていないクラスフィールド'numbers'を使用します。

'numbers'も静的にし、いくつかの値を設定する必要があります。

于 2013-02-04T14:37:20.190 に答える
0

+演算子で連結する前に、メンバーが!=nullであるかどうかを確認する必要があります。

Eclipseを使用する場合は、rightclick-> source-> generate toString()...を使用してtoString、テキストを変更するだけでよい単純なメソッドをクラスに生成します。

一般的にうまく機能し、使いやすいです。

于 2013-02-04T14:38:16.760 に答える