map中的Array.length减少了抛出Null指针异常

时间:2014-07-25 15:59:29

标签: java nullpointerexception mapreduce reducers

这是我在mapreduce中使用的代码并获取空指针异常..我通过配置传递一个变量,将其作为字符串并解析并存储在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)

3 个答案:

答案 0 :(得分:2)

您之前很可能没有运行配置方法,因此当您致电int[] resultsresults.length仍然为空。为了能够访问它的方法和变量,你必须先将它初始化,但因为你的错误显示空指针异常,这是因为int[] results尚未初始化,所以你需要确保你在获得长度属性之前重新初始化它。

答案 1 :(得分:1)

问题是结果变量在抛出NPE的行上为null。现在,您应该通过在违规行之前测试null和/或其内容的变量来验证这一点,然后回顾一下代码以了解原因。也许您在调用configure方法之前调用reduce ,但很难根据您发布的内容来判断。

最重要的是,您将需要学习调试NPE的一般技术 - 检查有问题的行上的变量,找到一个为null并抛出异常,然后追溯到代码,看看为什么。你会一次又一次地遇到这些虫子,相信我。

您还希望了解自己的搜索技巧,因为这类问题每天都会在此网站上被多次询问。如果我能找到一个好的重复答案(我认为通常使用的答案不是很好),我会删除这个答案并将此帖子锁定为副本。

答案 2 :(得分:0)

我认为你的变量还没有被启动,这就是抛出NullPointerException的原因。