我试图为练习程序编写一个mapper类,编译器总是给我错误: satMath和satVerbal可能尚未初始化。
public class UniversityMapper extends Mapper <LongWritable,Text,Text,IntWritable> {
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// TODO convert record (value) to String
StringTokenizer iterator = new StringTokenizer (value.toString(),")" );
int state = 2;
int satVerbal;
int satMath;
while(state != 0 && iterator.hasMoreTokens())
{
String cur = iterator.nextToken();
if (cur.contains("sat verbal"))
{
state--;
StringTokenizer temp = new StringTokenizer(cur,"\\s+");
temp.nextToken();
temp.nextToken();
int satV = (new Integer(temp.nextToken())).intValue();
satVerbal = satV;
//context.write(new Text("satv"), new IntWritable(satVerbal));
}
else if (cur.contains("sat math"))
{
state--;
StringTokenizer temp = new StringTokenizer(cur,"\\s+");
temp.nextToken();
temp.nextToken();
int satM = (new Integer(temp.nextToken())).intValue();
satMath = satM;
//context.write(new Text("satm"), new IntWritable(satMath));
}
}
if (state == 0)
{
System.out.println(satVerbal);
System.out.println(satMath);
context.write(new Text ("satv"), new IntWritable(satVerbal));
context.write(new Text ("satm"), new IntWritable(satMath));
}
} }
如果我在if语句的范围内重新定位context.write()方法(在代码中注释掉),我不会再出现此错误。我不明白为什么。我通常用c ++和python编写代码我是Java的新手,我需要完成这个程序。有人可以帮助我,提前谢谢:)
答案 0 :(得分:1)
这非常简单。如果else if
没有执行:
else if (cur.contains("sat math"))
然后您永远不会初始化satMath
,并且您稍后会尝试通过以下方式访问它:
context.write(new Text ("satm"), new IntWritable(satMath));
与if (cur.contains("sat verbal"))
和satVerbal
相同。
如果你想完全避免这些,你可以自己初始化+声明这些变量:
int satVerbal = 0;
int satMath = 0;
但是你应该绝对肯定他们将在while
内分配其他内容,否则您实际上会在0
中使用他们的初始值(context.write
) {1}},我认为这对你不合适。