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

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

我有这个方法,其目的是确定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; } 

问题是它总是返回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){ // <<<<<>>>>>> 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 ""; } 

[更多编辑]

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 

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

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

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

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

 // <<<<<< HERE'S THE CALL >>>>>>> if (isDirectory(asm,path + "/" + file)){ foundFile = searchAssets(asm,path + "/" + file,filename); // recurse this subfolder 

也许在递归调用中放置路径和条可以解决您的问题,但是,无论如何,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 ""; } 

首先,不要使用多个退出点(返回),只需创建一个布尔值isDir并在代码中相应地设置它,最后返回它。

其次,正如我所理解的, list()将返回一个String[] ,如果该文件夹为空,它将返回null (因为你没有从[null] .length中捕获NullPointerException ,所以不会进入Exception)。

我读了你的代码。 问题的好解释。 我创建相同的代码并进行调试,发现如果递归函数中的路径错误,那么返回FALSE与您的情况相同,因为它无法在机器中找到该文件。

 public class test { public static void main(String[] args) { listFiles("D:\\usr"); } public static void listFiles(String path) { System.out.println("path => " + path); File f = new File(path); if (f.isDirectory()) { System.out.println(f.isDirectory()); System.out.println(f.list().length); for (int i = 0; i < f.list().length; i++) { System.out.println("file is :: " + f.list()[i]); listFiles(f.listFiles()[i].getAbsolutePath()); } } } } 

我认为在PATH中只有问题,所以尽量把LOG放在每个语句中,以便能够轻松调试。 如果可能,请将absolutePath传递给递归函数

谢谢。