Java范围错误

时间:2016-03-11 12:13:44

标签: java hadoop mapper scoping

我试图为练习程序编写一个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的新手,我需要完成这个程序。有人可以帮助我,提前谢谢:)

1 个答案:

答案 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}},我认为这对你不合适。