-1

これは私が mapreduce で使用しているコードで、null ポインター例外を取得しています..構成を介して変数を渡し、それを文字列として取得し、解析して int 配列に格納し、それを処理しています--

  int[] results;

        public void configure(JobConf job) {
            // targetPeriod = Integer.parseInt(job.get("Predict"));
            String[] pred = job.get("Predict").split(",");
            results = new int[pred.length];

            for (int i = 0; i < pred.length; i++) {
                try {
                    results[i] = Integer.parseInt(pred[i]);
                } catch (NumberFormatException nfe) {
                }
                ;
            }




        protected void reduce(final IntWritable key, final Iterable<Text> values,
                final Context context) throws IOException, InterruptedException {

            // int targetPeriod = Integer.parseInt(predict.trim());
            String predictfin = null;
            // int targetPeriod = 10;
        "EXCEPTION HERE"---->
            double[] projectedCumulativeScoreAtTargetPeriod = new double[results.length];
            // Participant participant = new Participant(values,targetPeriod);
            for (int i = 0; i < results.length; i++) {
                Participant participant = new Participant(values, results[i]);




14/07/25 15:23:12 INFO mapred.JobClient: Task Id : attempt_201407110824_0728_r_000000_0, Status : FAILED
java.lang.NullPointerException
        at ProjectionReducer.reduce(ProjectionReducer.java:38)
        at ProjectionReducer.reduce(ProjectionReducer.java:1)
        at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:177)
        at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:649)
        at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:418)
        at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:396)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
        at org.apache.hadoop.mapred.Child.main(Child.java:249)
4

3 に答える 3

2

ほとんどの場合、前に configure メソッドを実行していないため、int[] resultsを呼び出しても はまだ null ですresults.length。メソッドと変数にアクセスできるようにするには、前に初期化する必要がありますが、エラーがヌル ポインター例外を示しているため、int[] results初期化されていないため、初期化する前に確認する必要があります。その長さ属性を取得します。

于 2014-07-25T16:08:38.507 に答える
1

問題は、結果変数が NPE をスローする行でヌルであることです。ここで、問題のある行の前で変数の null および/またはその内容をテストしてこれを確認し、コードを振り返って理由を確認する必要があります。configure メソッドを呼び出す前にreduceを呼び出している可能性がありますが、投稿した内容に基づいて判断するのは困難です。

最も重要なことは、NPE のデバッグの一般的な手法を習得することです。つまり、問題のある行の変数をチェックし、null で例外をスローしている行を見つけ、コードをトレースして理由を確認します。あなたは何度も何度もこれらのバガーに出くわすでしょう、私を信じてください.

この種の質問は、このサイトで 1 日に 1 回以上尋ねられるので、検索スキルにも取り組みたいと思うでしょう。適切な重複回答を見つけることができた場合 (私たちが使用する通常の回答は、私の意見ではあまり良くありません)、この回答を削除し、このスレッドを重複としてロックします。

于 2014-07-25T16:01:04.913 に答える
0

あなたの変数は初期化されていないと思います。それが NullPointerException がスローされる理由です。

于 2014-07-25T17:26:19.963 に答える