Java编译器错误:";找不到符号“;尝试访问局部变量时

Java编译器错误:";找不到符号“;尝试访问局部变量时,java,file,Java,File,作用域:在If/else语句之前声明checkFile一个变量存在于其声明所在的块中,并在该块完成后立即处理。: 块中局部变量声明的作用域是声明出现的块的其余部分,从它自己的初始值设定项开始,并包括局部变量声明语句右侧的任何其他声明符 块是大括号内的一系列语句、局部类声明和局部变量声明语句 按照您声明和初始化检查文件的方式,它们实际上是3个独立的局部变量,在各自块的末尾立即超出范围 您可以通过将文件的声明放入checkFile作为getAllDirs方法的第一行;这使其范围与方法的其余部分相同

作用域:在If/else语句之前声明checkFile

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

: 块中局部变量声明的作用域是声明出现的块的其余部分,从它自己的初始值设定项开始,并包括局部变量声明语句右侧的任何其他声明符

块是大括号内的一系列语句、局部类声明和局部变量声明语句

按照您声明和初始化
检查文件的方式,它们实际上是3个独立的局部变量,在各自块的末尾立即超出范围

您可以通过将
文件的声明放入checkFile
作为
getAllDirs
方法的第一行;这使其范围与方法的其余部分相同

类似问题
    • 因为变量是一个数组,它有一个特殊的初始化速记语法,所以变得更加棘手


局部变量的找不到符号与file类提供的方法无关。修正你的标题。没关系,我是为你做的。修正了,但现在想知道为什么它会这样。声明、初始化、作用域——似乎一个声明将一个变量附加到一个块上,比如if-else、方法、类或者其他东西。定义是什么。关于“块”这个词,你能称这个错误为“范围内的洞”吗?我假设了一个范围,但它是不存在的;您没有完全理解Java的作用域规则,尽管这并不奇怪,但它仍然与Javascript不同(大多数人会说这是一种很好的方式)。请不要生气:stackoverflow已经看到了类似这样的问题;这肯定是偶尔会吸引人的东西。
$ 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);
    }
}