计算目录大小的Java程序不断抛出NPE

时间:2013-11-14 02:01:02

标签: java size directory

我正在开发一个循环遍历特定目录(例如,C:\ Documents)的程序,并计算它在磁盘上占用的总大小。但是,出于某种原因,我的程序一直在将一个空指针异常抛出到它似乎在Documents文件夹中寻找名为“My Music”的文件夹的位置。 “我的音乐”在我的“文档”文件夹中不存在,因此我对它从何处获取非常困惑。我理解为什么它会抛出异常(显然如果它找不到指定目录中的文件夹,它将返回null),但我不知道它是如何找到“我的音乐”的。这是我的代码:

public static Long getDirSize(File directory) {
    long size = 0L;
    for (File file : directory.listFiles()) {
        size += file.isDirectory() ? getDirSize(file) : file.length();
    }
    return size;
}

要调用此方法,我使用以下内容:

long required = 0;
for (int i = 0; i < directories.length; i++){
required = required + getDirSize(new File(directories[i]));

“directories”是一个包含我正在尝试计算其大小的目录的字符串数组。例如,     directories = {“C:\ Users \ user \ Documents”,                    “C:\用户\用户名\图片”,                    “C:\用户\用户\画”}

我一直试图解决这个问题几个星期,尝试不同的方法来遍历目录等等,他们似乎都给了我同样的问题。我非常感谢另一双眼睛。谢谢!

编辑:这是堆栈跟踪 -

java.lang.NullPointerException
at diana.Review.getDirSize(Review.java:206)
at diana.Review.getDirSize(Review.java:207)
at diana.Review$2.actionPerformed(Review.java:126)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

2 个答案:

答案 0 :(得分:2)

我会在实际使用之前尝试测试该文件。我会做类似if(file != null)if(file.exists())的事情。这样,如果文件不存在,则不要尝试使用它。这应该可以解决您收到错误的问题。

此外,对于Windows的工作方式,在我的文档目录中默认有一个名为“音乐”的文件夹,但根据您从中访问它的位置,例如,资源管理器,它可能会说“我的音乐”或“用户的”音乐”。我不确定为什么会这样,但出于某种原因,它确实发生了。

因此,停止获取此错误的基本万无一失的方法是检查您要使用的文件是否存在。如果没有,只需跳过它或打印错误消息。希望这可以帮助。

答案 1 :(得分:1)

listFiles()可以返回null。见Javadoc。你需要在循环之前测试它。这意味着你不能在它上面使用增强的for循环。