Ошибка компилятора Java: «не удается найти символ» при попытке доступа к локальной переменной - PullRequest
0 голосов
/ 10 апреля 2010
$ 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 ]

5 голосов
/ 10 апреля 2010

JLS 14.4.2 Объем объявлений локальных переменных :

Область объявления локальной переменной в блоке - это остальная часть блока, в котором появляется объявление, начиная с его собственного инициализатора и включая любые дальнейшие деклараторы справа в операторе объявления локальной переменной.

JLS 14,2 блоков

A block - это последовательность операторов, объявлений локальных классов и операторов объявлений локальных переменных в фигурных скобках.

Как вы объявили и инициализировали checkFile, они на самом деле 3 отдельных локальных переменных , которые сразу же выходят за рамки в конце их соответствующих блоков.

Вы можете исправить это, поместив объявление File checkFile; в качестве первой строки метода getAllDirs; это помещает его область действия как остальную часть метода.

Похожие вопросы


3 голосов
/ 10 апреля 2010

Переменная живет в блоке, в котором она объявлена, и удаляется, как только этот блок завершается.

3 голосов
/ 10 апреля 2010

Scoping: объявите checkFile перед вашими операторами If / else

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...