为什么这个布尔方法使用错误的返回路径?

Sim*_*mon 5 java android

这太愚蠢了,我确信我会在几分钟内用湿腌鱼刺伤自己.

我有这个方法,其目的是确定assets文件夹中的特定路径是否是子文件夹.它用于递归搜索以查找资产中的文件.

 private static boolean isDirectory(AssetManager assetManager, String path) throws     IOException
 {
    // AssetManager.list() returns a string array of assets located @ path
    // if path is a file, then the array will be empty and have zero length
    // if path does not exist, then an IOException is raised
    // (ignore the exception as in theory, this will never happen
    // since this is called by the searchAssets recursive find)

    // do nothing for uninitialised or empty paths
    if (path==null || path.equals("")){return false;}

    try {
        if (DEBUG){Log.d(TApp.APP_TAG,path + " lists " + assetManager.list(path).length + " assets");}
        if (assetManager.list(path).length > 0){
            return true;
        }
    } catch (IOException e) {
        // do nothing - path should always exist but in any case, there is nothing we can
        // do so just throw it back up
        throw e;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

问题是它总是返回false.

当我单步执行代码时,我可以看到.list()从logcat输出和在断点处评估.list()返回子文件夹的非零值.当我逐步执行该方法时,当前执行点正确命中"return true;" 但是当我按F7继续(我正在使用IDEA)时,执行点跳转到最后一个语句,"return false;",这是返回的值.

(我很尴尬要问).为什么?

[编辑]请求显示我如何调用它 - 这个方法没有完成,因为我无法让上述工作!

public static String searchAssets(AssetManager asm, String path, String filename){

    // TODO uses hard coded path separator

    // search for the file, filename, starting at path path in the assets folder
    // asm must be initialised by the caller using an application context
    // returns an empty string for non existent files or for filename = ""

    if (asm==null){return "";}

    String foundFile; // return value

    try {
        // get a list of assets located at path
        String[] files = asm.list(path);

        // files may be null if an invalid path is passed
        if (files!=null && files.length>0){

            // loop through each asset for either a subfolder to search 
            // recursively or the file we are looking for
            for (String file:files){

                // <<<<<< HERE'S THE CALL >>>>>>>
                if (isDirectory(asm,path + "/" + file)){  

                    foundFile = searchAssets(asm,file,filename); // recurse this subfolder

                    // searchAssets returns either the name of our file, if found, or an empty string 
                    if (!foundFile.equals("")){
                        return foundFile;
                    }
                } else {
                    if (file.equals(filename)){
                        return path + "/" + file;
                    }
                }
            }
        }

    } catch (IOException e) {
        // eat the exception - the caller did not set us up properly 
    }

    return "";
}
Run Code Online (Sandbox Code Playgroud)

[更多编辑]

logcat的:

09-27 09:21:12.047: DEBUG/GRENDLE(2811): harmonics_data/Harmonic Data SHC lists 2 assets
09-27 09:21:12.137: DEBUG/GRENDLE(2811): harmonics_data/Harmonic Data SHC is a subfolder,     returning true

09-27 09:21:12.544: DEBUG/GRENDLE(2811): harmonics_data/Harmonic Data SHC is a not a subfolder,     returning false
Run Code Online (Sandbox Code Playgroud)

这是一个截图.首先击中第一个断点(return true;).继续直接跳转到最后一个语句,返回false,这是返回的内容.这不是一个例外.异常断点永远不会被击中,我不希望它会发生,并且从logcat可以看出,控制流似乎是错误的.

我不知道它在Eclipse中的外观,但这里的红线是断点,蓝线是当前的执行点.

我已经清除了缓存,删除了文件索引,删除了输出文件夹并完成了重建.

rav*_*981 1

我真的不明白看到应用程序的日志,但我认为问题出在这里:

// <<<<<< HERE'S THE CALL >>>>>>>
if (isDirectory(asm,path + "/" + file)){

  foundFile = searchAssets(asm,path + "/" + file,filename); // recurse this subfolder
Run Code Online (Sandbox Code Playgroud)

也许将路径和栏放在递归调用中可以解决您的问题,但是,无论如何, isDirectory 方法不是必需的,我将这样执行搜索方法:

public static String searchAssets(AssetManager asm, String path,
        String filename) {

    // TODO uses hard coded path separator

    // search for the file, filename, starting at path path in the assets
    // folder
    // asm must be initialized by the caller using an application context
    // returns an empty string for non existent files or for filename = ""

    if (asm == null) {
        return "";
    }

    String foundFile = ""; // return value

    try {
        // get a list of assets located at path
        String[] files = asm.list(path);

        // files may be null if an invalid path is passed
        if (files != null && files.length > 0) {

            // loop through each asset for either a subfolder to search
            // recursively or the file we are looking for
            for (String file : files) {

                foundFile = searchAssets(asm, path + "/" + file, filename); // recurse
                                                                // this
                                                                // subfolder

                // searchAssets returns either the name of our file, if
                // found, or an empty string
                if(!foundFile.equals("")){
                    return foundFile;
                }
            }
        } else {
            if (path.equals(filename)) {
                return path;
            }else{
                return "";
            }
        }

    } catch (IOException e) {
        // eat the exception - the caller did not set us up properly
    }

    return "";
}
Run Code Online (Sandbox Code Playgroud)