将File对象添加到Array

时间:2015-02-07 16:22:10

标签: java arrays

我似乎遇到了一个问题,我的代码没有正确的语法化,但是因为我刚开始学习,我似乎错过了错误。这是一项家庭作业,我需要使用一系列JxploreFile对象。这是我遇到问题的代码的一部分:

private JxploreFile[] getSubFolders()
{
    File subFiles[];
    subFiles = file.listFiles();

    File subFolders[];
    int p = 0;
    for(int i = 0; i < subFiles.length; i++)
    {
        if(subFiles[i].isDirectory() == true)
        {
            Array.set(subFolders, p, subFiles[i]);
        }
    }

    JxploreFile foldersToReturn[] = new JxploreFile[subFolders.length];
    for(int i=0; i < subFolders.length; i++)
    {
        foldersToReturn[i] = new JxploreFile(subFolders[i]);
    }
    return foldersToReturn;
}

具体来说,我试图将标记为.isDirectory的文件添加到新数组中的for循环。我还通过声明索引编号将每个来自subFiles数组的新文件手动放入subFolders数组中尝试了其他方法,但这也证明是错误的。在这一点上,我没有想法,我希望有人可以指出我显而易见的事情,因为我可能遗漏了一些非常基本的东西。

编辑: 对不完整的帖子感到抱歉,这是我第一次在这里发帖,因为我通常会尝试从别人的帖子中过滤出自己的问题。我得到的错误确实是&#39; subFolders&#39;尚未初始化,我没有理解,因为在我写的第六行     File subFolders []; 据我所知应该声明变量subFolders成为一个数组,或者这是我出错的地方? 此外,我的问题可能不够具体,我正在寻找导致错误的原因(我根本没有提到):为什么&#39; subFiles&#39;没有初始化。

2 个答案:

答案 0 :(得分:1)

您的帖子中没有任何问题,但无论如何我在您的代码中发现了问题:

File subFolders[];
int p = 0;
for(int i = 0; i < subFiles.length; i++)
{
    if(subFiles[i].isDirectory() == true)
    {
        Array.set(subFolders, p, subFiles[i]);
    }
}

在致电Array.set时,您从未初始化subFolders,这会引发NullPointerException

另外,你不需要做

if(subFiles[i].isDirectory() == true)

你可以简单地做

if(subFiles[i].isDirectory())

因为subFiles[i].isDirectory()已经是一个条件。

答案 1 :(得分:1)

数组subFolders尚未正确初始化。为了在Array.set方法中使用该数组,必须对其进行初始化并使用大小进行分配。

另一种方法是使用List代替。当您处理更具动态性的数据时,列表很有用,例如当你不知道数组的大小。然后你可以像这样简化你的代码:

File[] subFiles = file.listFiles();

// Create the list
List<JxploreFile> subFolders = new ArrayList<>();

// Add all the sub folders (note that "file" is a bit magic since it 
// is not specified anywhere in the original post
for (File subFile : file.listFiles()) {
    if (subFile.isDirectory()) {
        subFolders.add(new JxploreFile(subFile));
    }
}

// Return an array
return subFolders.toArray(new JxploreFile[subFolders.size()]);

您还可以使用这样的Java 8流进一步简化整个过程:

return Arrays.stream(file.listFiles())
             .filter(File::isDirectory)
             .toArray(JxploreFile[]::new);

欲了解更多信息: