对此特定计划的变量范围感到困惑

时间:2016-03-31 02:18:13

标签: java

这是我的代码片段。我已经解决了这个问题,但我现在还不明白为什么会这么做。我不确定我是否正确解释了这个问题,所以如有必要,请提出任何问题。错误是当语句位于我评论的位置时,变量 puncation 会更改为正确的值 test ,该语句可以正常工作。但是,当语句位于我评论的位置时,它不起作用,该语句不起作用。

     if (endOfSen) {
                /////////////////The statement below works when it is here./////////////
                /////////////////OUTPUT 1 - occurs when the statement is placed here.              
                 String puncation = null ;
                /////////////////////
                int orgSize = words.size(); //remember size of stack
                //only runs if stack is not empty
                if (!words.empty()) {
                    while (words.size() > 0) {      //until last word
                        String word = words.pop();
                        ///The statement below does not work when it is here///////
                        //////OUTPUT 2- occurs when the statement is placed here.  
                        //String puncation = null ;

                        //if last word of sentence
                        if (orgSize == words.size() + 1) {
                            word = word.substring(0, 1).toUpperCase() + word.substring(1);
                            puncation = "test";     // just a test value
                            word = word.replace(puncation, "");
                            //////////////////test to see if works 
                            System.out.println("puncation: " + puncation);
                        }
                        //if first word of sentence
                        if (words.size() == 0) {
                            //////////////////test to see if works 
                            System.out.println("puncation: " + puncation);
                            word = word.toLowerCase();
                            word = word + "" + puncation;
                        }
                        newSen.push(word);
                    }
                }
                endOfSen = false;
            }
        }

OUTPUT 1(第二个 puncation 从原始值更改)

puncation: test
puncation: test

输出2(第二个 puncation 不会从原始值更改)

puncation: test
puncation: null

2 个答案:

答案 0 :(得分:1)

如果变量在循环内声明,那么循环的每次迭代都会看到不同的变量。此外,您甚至在那里将其初始化为null,因此每次迭代都将以空值开始。

当在循环外声明为null时,变量将保留循环的前一次迭代的值。

由于orgSize永远不会在循环中发生变化,并且words每次迭代都会缩小一次,因此第一次if语句在第一次迭代时才能成为真。第二个if语句只能在最后一次迭代中成立。

因此,如果puncation在循环内初始化为null,那么在第二个if语句中唯一不能为空的情况是words最初的大小为1。

简单的调试可以向你展示这一切。

答案 1 :(得分:1)

这不是一个范围问题,因为它只是在循环中重置变量。我在下面做了一个例子,它更明确地重置了值。

if (endOfSen) {

        /////////////////The statement below works when it is here./////////////
        /////////////////OUTPUT 1 //////////////////
        String puncation = null ;
        /////////////////////
        int orgSize = words.size(); //remember size of stack
        //only runs if stack is not empty
        if (!words.empty()) {
            while (words.size() > 0) {      //until last word
                String word = words.pop();
                ///The statement below does not work when it is here///////
                /////////////////OUTPUT 2 //////////////////

                // Puncation is beign reset here, each iteration of the loop
                puncation = null ;

                //if last word of sentence
                if (orgSize == words.size() + 1) {
                    word = word.substring(0, 1).toUpperCase() + word.substring(1);
                    puncation = "test";     // just a test value
                    word = word.replace(puncation, "");
                    //////////////////test to see if works 
                    System.out.println("puncation: " + puncation);
                }
                //if first word of sentence
                if (words.size() == 0) {
                    //////////////////test to see if works 
                    System.out.println("puncation: " + puncation);
                    word = word.toLowerCase();
                    word = word + "" + puncation;
                }
                newSen.push(word);
            }
        }
        endOfSen = false;
    }
}