这是我在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)
您之前很可能没有运行configure方法,因此当您调用results.length
时,int[] results
仍然为空。为了能够访问它的方法和变量,你必须初始化它之前,但因为你的错误是显示一个空指针异常,这是因为int[] results
还没有被初始化,所以你需要确保你初始化它之前,你得到它的长度属性。
问题是结果变量在抛出NPE的那一行为空。现在您应该通过测试变量的null和/或在错误行之前的内容来验证这一点,然后回头查看代码以了解原因。也许你在调用configure方法之前调用了reduce ,但根据你发布的内容很难判断。
最重要的是,您将需要学习调试NPE的一般技术——检查违规行上的变量,找到为空并抛出异常的变量,然后跟踪代码以查看原因。相信我,你会一次又一次地遇到这些家伙的。
你还需要提高你的搜索技巧,因为这类问题在这个网站上每天都会被问到不止一次。如果我能找到一个好的重复答案(我们通常使用的答案在我看来不是那么好),我会删除这个答案并将此线程锁定为重复。
我认为你的变量没有被初始化,这就是为什么NullPointerException被抛出。