这是我的代码片段。我已经解决了这个问题,但我现在还不明白为什么会这么做。我不确定我是否正确解释了这个问题,所以如有必要,请提出任何问题。错误是当语句位于我评论的位置时,变量 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
答案 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;
}
}