2016-03-11 140 views
1

我正在尝试为练习程序编写一个映射器类,编译器总是给我错误: satMath和satVerbal可能尚未初始化。Java范围错误

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

这与范围界定无关 - 变量处于正确的范围内。这是与[明确的任务](https://docs.oracle.com/javase/specs/jls/se7/html/jls-16.html)。 –

+0

非常感谢你...... N现在我觉得很愚蠢,不应该是其他情况,如果它应该是:P –

回答

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里面别的东西,否则你会实际上在context.write后面会使用它们的初始化值(0),我认为这对您而言并不合适。

+1

非常感谢你...... N现在我觉得很愚蠢,它不应该是,如果它应该是,如果:P –