我似乎遇到了一个问题,我的代码没有正确的语法化,但是因为我刚开始学习,我似乎错过了错误。这是一项家庭作业,我需要使用一系列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;没有初始化。
答案 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);
欲了解更多信息: