java作用域错误

mspsb9vt  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(310)

我试图为一个实践程序编写一个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非常陌生,我需要完成这个程序。有人能帮我吗,提前谢谢:)

tnkciper

tnkciper1#

这相当简单。如果这个 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 我想这对你不合适。

相关问题