变量递增本身而不实际更改它

时间:2011-04-14 10:19:39

标签: java

好的..所以我正在做一个关于NLP的程序。它使用函数eliminateStopWords()。此函数从2D数组“sentTokens”(检测到的令牌)中读取。在下面的代码中,索引i是句子编号,j是第i个句子中的每个标记。

现在,我的eliminateStopWords()做的是:

  1. 它从文本文件中读取停用词并将它们存储在TreeSet

  2. 从sentTokens数组中读取令牌并检查它们是否有停用词。如果它们是搭配,那么它们不应该被检查停用词,它们只是被转储到finalTokens数组中。如果它们不是一个集合,那么它们会被单独检查停用词,并且只有在它们不是停用词的情况下才被添加到finalTokens数组中。

  3. 这个问题出现在第2步的循环中。以下是它的一些代码:(我已经在错误实际发生的位置//这里标记了......它接近结尾)

    private void eliminateStopWords() {
    
        try {
    
            // Loading TreeSet for stopwords from the file.
            stopWords = new TreeSet<String> ();
            fin = new File("stopwords.txt");
            fScan = new Scanner(fin);
            while (fScan.hasNextLine()) 
                stopWords.add(fScan.nextLine());
    
            fScan.close();
    
            /* Test code to print all read stopwords
            iter2 = stopWords.iterator();
            while (iter2.hasNext())
                System.out.println(iter2.next()); */
    
            int k=0,m=0;    // additional indices for finalTokens array
            System.out.println(NO_OF_SENTENCES);
    
     newSentence: for(i=0; i < NO_OF_SENTENCES; i++)
              {
    
            System.out.println("i = " + i);
                for (j=0; j < sentTokens[i].length; j+=2)
                {
    
            System.out.println("j = " + j);
    
                    // otherwsise, get two successive tokens
                        String currToken = sentTokens[i][j];
                        String nextToken = sentTokens[i][j+1];
                        System.out.println("i = " + i);
                        System.out.println(currToken + " " + nextToken);
                        if ( isCollocation(currToken, nextToken) ) {    
    // if the current and next tokens form a bigram collocation, they are not checked for stop words
                            // but are directly dumped into finalTokens array
                            finalTokens[k][m] = currToken; m++;
                            finalTokens[k][m] = nextToken; m++;
                        }
    
                        if ( !stopWords.contains(currToken) )
                        {   finalTokens[k][m] = currToken; m++;  }
    
                        if ( !stopWords.contains(nextToken) )
                        {       finalTokens[k][m] = nextToken; m++; }
    
    
                    // if current token is the last in the sentence, do not check for collocations, only check for stop words
                    // this is done to avoid ArrayIndexOutOfBounds Exception in sentences with odd number of tokens
    
    // HERE
                        System.out.println("i = " + i);
    
                        if ( j==sentTokens[i].length - 2) {
                        String lastToken = sentTokens [i][++j];
                        if (!stopWords.contains(lastToken))
                        {  finalTokens[k][m] = lastToken; m++; }
    
                        // after analyzing last token, move to analyzing the next sentence
    
                        continue newSentence;
    
                        }
                }
    
                k++;    // next sentence in finalTokens array
            }
    
            // Test code to print finalTokens array
               for(i=0; i < NO_OF_SENTENCES; i++) {
                   for (j=0; j < finalTokens[i].length; j++) 
                       System.out.print( finalTokens[i][j] + " " );
    
                   System.out.println();
               }
    
    
    
        }
            catch (Exception e) {
                e.printStackTrace();
            }
    }
    

    我已经打印了指数i&amp; j在它们各自的for循环的入口处...它在循环的第一次迭代中都能正常工作,但是当循环即将到达它的结尾时...我再次打印了'i'的值。这次是14岁。

    • 它以0 ...
    • 开始第一次迭代
    • 不会在循环中的任何地方被操纵......
    • 并且仅在(仅)第一次迭代结束时,它将值打印为14

    我的意思是这是我在使用Java时遇到的WEIRDEST错误。它在最后的if块之前抛出一个ArrayIndexOutOfBoundsException。这就像MAGIC。您对代码中的变量不做任何操作,但值仍会更改。这怎么可能发生?

1 个答案:

答案 0 :(得分:4)

您从未在代码中声明ij,这让我相信它们是字段。

我很确定你的其他一些方法会重复使用这些变量,从而弄乱你的结果。 isCollocation看起来像是候选人。

for循环中的计数器应始终为局部变量,理想情况下在for语句本身内部声明(对于最小范围)。其他一切只是在寻找麻烦(如你所见)。