Java编译器错误:尝试访问本地变量时“找不到符号”

时间:2010-04-10 13:29:10

标签: java file

$ 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);
    }
}

3 个答案:

答案 0 :(得分:5)

JLS 14.4.2 Scope of Local Variable Declarations

  

块中局部变量声明的范围是声明出现的块的其余部分,从其自己的初始值设定项开始,并在本地变量声明语句中包含右侧的任何其他声明符。

JLS 14.2 Blocks

  

是大括号内的一系列语句,本地类声明和局部变量声明语句。

您声明和初始化checkFile的方式,它们实际上是 3个单独的局部变量,它们会在各自块的末尾立即超出范围。

您可以通过将File checkFile;的声明作为getAllDirs方法的第一行来解决此问题;这将其范围作为方法的其余部分。

类似问题


答案 1 :(得分:3)

范围界定:在If / else语句之前声明checkFile

答案 2 :(得分:3)

变量存在于声明的块中,并在该块完成后立即处理。