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