重新使用变量名称来引用.循环中的对象...走出循环......我的对象在哪里?

bas*_*ter 1 java

任何人都可以解释为什么这不会编译?这个循环不断移动ref.'人'到一个新创建的对象,这似乎工作正常.在循环结束时,从文件读入的最后一行应该由'person'引用,并且它的方法应该可以在此循环之外访问,对吧?

while ((line = file.readLine()) != null) {
    Person person = new Person(line);
    //do
}
System.out.println(person.getSmoker());
Run Code Online (Sandbox Code Playgroud)

编译器输出:

Query.java:29: cannot find symbol
symbol  : variable person
location: class Query
            System.out.println(person.getSmoker());
                               ^
Run Code Online (Sandbox Code Playgroud)

答案必须是否定的,但我无法弄清楚为什么(我认为我的对象/堆等理解正在某处)

谢谢你的帮助

Jon*_*nah 8

不,因为您试图在定义它的范围之外访问它.如果要访问它,则必须在相同(或更高)的范围内定义它.

Person person = null;
while ((line = file.readLine()) != null) {
    person = new Person(line);
    //do
}
System.out.println(person.getSmoker());
Run Code Online (Sandbox Code Playgroud)

与其他一些语言不同,即使在控制语句中也无法从较低的范围访问变量.

编辑:如@ Robby的回答所示,你必须检查null,否则你可能得到一个NullPointerException.