代码之家  ›  专栏  ›  技术社区  ›  Vipul Rajan

Java范围错误

  •  1
  • Vipul Rajan  · 技术社区  · 8 年前

    我试图为一个实践程序编写一个映射器类,编译器总是给我以下错误: 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语句范围内的write()方法(在代码中注释掉)我不再得到这个错误。我不明白为什么。我通常用c++和python编写代码,我对Java真的很陌生,我需要完成这个程序。有人能帮我吗,提前谢谢:)

    1 回复  |  直到 8 年前
        1
  •  1
  •   Idos    8 年前

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