获取java.lang.NullPointerException读取大小应用程序文件夹



我想读取应用程序文件夹的大小。我也可以用系统应用程序做这件事,没有问题,但"正常"的应用程序文件夹会给我带来问题。我是这样做的:

File apk = new File("/data/app");
        if (apk.exists()){
            float apksize=getFolderSize(apk)/(1024f*1024f);
            apk.setText(Html.fromHtml(getResources().getString(R.string.apk)+ " " +"<b>" +String.format("%.2f", apksize)+ " " + "Mb" + "</b>"
                            ));
        } else {
            apk.setText(devicefragment.this.getResources().getString(R.string.folderapknotfound));
        }

然后是文件夹大小的方法

public static long getFolderSize(File dir) {
            long size = 0;
            for (File file : dir.listFiles()) {
                if (file.isFile()) {
                    // System.out.println(file.getName() + " " + file.length());
                    size += file.length();
                } else
                    size += getFolderSize(file);
            }
            return size;
            }

对于其他所有文件夹,我都尝试过,效果很好。。这个没有。logcat返回:

FATAL EXCEPTION: main
java.lang.NullPointerException
at com.myapp.deviceinfo.getFolderSize(devicefragment.java:316)
at com.myapp.deviceinfo.onCreateView(devicefragment.java:179)
...

其中线316是:size += getFolderSize(file);,线179是:float apksize=getFolderSize(apk)/(1024f*1024f);

老实说,我不知道它为什么会崩溃。。此操作不需要root用户。

编辑:

我试过了:

public static long getFolderSize(File dir) {
            long size = 0;
            for (File file : dir.listFiles()) {
if (file == null) {
   continue;
}
                if (file.isFile()) {
                    // System.out.println(file.getName() + " " + file.length());
                    size += file.length();
                } else
                    size += getFolderSize(file);
            }
            return size;
            }

但是还是崩溃了

getFolderSize的循环中,一个(或多个(名为fileFile对象为null。解决这个问题的最简单方法是通过在循环中添加null检查来忽略null对象:

for (File file : dir.listFiles()) {
    if(file == null) {
        continue;
    }
    ...
}
 for (File file : dir.listFiles()) {

dir.listFiles()可以返回null。因此,最好先确定并在使用前检查null

最新更新