我试图为一个实践程序编写一个Map器类,编译器总是给我错误:satmath和satwarbal可能没有初始化。
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));
}
} }
如果我将context.write()方法重新定位到if语句(在代码中注解掉)的范围内,我就不会再得到这个错误。我不明白为什么。我通常用c++和python编写代码。我对java非常陌生,我需要完成这个程序。有人能帮我吗,提前谢谢:)
1条答案
按热度按时间tnkciper1#
这相当简单。如果这个
else if
不执行:那你永远不会初始化
satMath
,稍后您将尝试通过以下方式访问它:同样的道理
if (cur.contains("sat verbal"))
以及satVerbal
.如果您希望完全避免这些,您可以自己初始化并声明这些变量:
但你应该绝对肯定,他们将被分配在你的内部其他东西
while
,否则您将实际使用它们的初始化值(0
)在你生命的后期context.write
我想这对你不合适。