1
import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class ReadCellPhones {
    public static void main(String Args[]) throws IOException {
        Scanner s = new Scanner(System.in);
        File Input = new File("Cellphone.txt");
        Scanner f = new Scanner(Input);

        String[] Cells = new String[20];
        Double[] Amounts = new Double[20];

        Double threshold = printmenu();
        int number = 0;

        while (f.hasNext()) {
            Cells[number] = f.next();
            Amounts[number] = f.nextDouble();
            number++;
        }

        System.out.println("NUMBER\tArmount");

        for (int i = 0; i < Amounts.length; i++) {
            if (Amounts[i] > threshold)// THIS IS WHERE THE NULLPOINTER
            // EXCEPTION OCCURS
            {
                System.out.print(Cells[i] + "\t" + Amounts[i]);
            }
        }
    }

    static Double printmenu() {
        Scanner s = new Scanner(System.in);

        System.out.print("Enter the filename: ");
        String Filename = s.nextLine();

        System.out.print("Cell Bill Threshold: ");
        Double threshold = s.nextDouble();

        return threshold;
    }
}

したがって、私がやろうとしているのは、ファイルからデータを読み込み、データを2つの配列に格納し、Amounts配列の値がしきい値変数に入力された値よりも大きい場合は配列を出力することです。しかし、プログラムを実行しようとすると、nullpointerエラーがポップアップします。理由は何ですか?

4

3 に答える 3

2

問題は、読み込まれるレコードが 20 未満であることです。

配列内の各 Double のAmountsデフォルト値は null です。Java が と比較するためにボックス化Amounts[i]解除thresholdを行うと、この null 値を逆参照しようとするため、例外が作成されます。

解決策は、正常に読み取られた値の数をマークし、その数の値のみをしきい値と比較することです。

于 2012-12-04T01:02:15.843 に答える
0

しきい値が20未満の場合、forループはAmounts配列の最後まで続きます。これには、初期化されていないdoubleが含まれます。必要な機能に応じて、私は私がするまでループすることをお勧めします

于 2012-12-04T01:01:06.443 に答える
0

ファイルのデータ数が 20 であるという保証はありません。

ループ制限カウンターを変更してください

//for(int i=0;i<Amounts.length;i++)
for(int i=0;i<number;i++)  //variable number has a count of file's data

幸運を

于 2012-12-04T01:11:55.073 に答える