$ javac GetAllDirs.java
GetAllDirs.java:16: cannot find symbol
symbol : variable checkFile
location: class GetAllDirs
System.out.println(checkFile.getName());
^
1 error
$ cat GetAllDirs.java
import java.util.*;
import java.io.*;
public class GetAllDirs {
public void getAllDirs(File file) {
if(file.isDirectory()){
System.out.println(file.getName());
File checkFile = new File(file.getCanonicalPath());
}else if(file.isFile()){
System.out.println(file.getName());
File checkFile = new File(file.getParent());
}else{
// checkFile should get Initialized at least HERE!
File checkFile = file;
}
System.out.println(file.getName());
// WHY ERROR HERE: checkfile not found
System.out.println(checkFile.getName());
}
public static void main(String[] args) {
GetAllDirs dirs = new GetAllDirs();
File current = new File(".");
dirs.getAllDirs(current);
}
}
答案 0 :(得分:5)
块中局部变量声明的范围是声明出现的块的其余部分,从其自己的初始值设定项开始,并在本地变量声明语句中包含右侧的任何其他声明符。
块是大括号内的一系列语句,本地类声明和局部变量声明语句。
您声明和初始化checkFile
的方式,它们实际上是 3个单独的局部变量,它们会在各自块的末尾立即超出范围。
您可以通过将File checkFile;
的声明作为getAllDirs
方法的第一行来解决此问题;这将其范围作为方法的其余部分。
答案 1 :(得分:3)
范围界定:在If / else语句之前声明checkFile
答案 2 :(得分:3)
变量存在于声明的块中,并在该块完成后立即处理。