0

私のアプリを S2 で実行すると、エラーはまったく発生せずに完全に動作しますが、Nexus 7 で実行しようとすると、強制終了し、あるデバイスで発生し、別のデバイスでは発生しない理由がわかりません...

LogCat は次のとおりです。

07-03 18:33:29.139: E/AndroidRuntime(11990): FATAL EXCEPTION: main
07-03 18:33:29.139: E/AndroidRuntime(11990): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.liamw.root.logeraser/com.liamw.root.logeraser.MainActivity}: java.lang.NullPointerException
07-03 18:33:29.139: E/AndroidRuntime(11990):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2312)
07-03 18:33:29.139: E/AndroidRuntime(11990):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2362)
07-03 18:33:29.139: E/AndroidRuntime(11990):    at android.app.ActivityThread.access$600(ActivityThread.java:156)
07-03 18:33:29.139: E/AndroidRuntime(11990):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1250)
07-03 18:33:29.139: E/AndroidRuntime(11990):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-03 18:33:29.139: E/AndroidRuntime(11990):    at android.os.Looper.loop(Looper.java:137)
07-03 18:33:29.139: E/AndroidRuntime(11990):    at android.app.ActivityThread.main(ActivityThread.java:5229)
07-03 18:33:29.139: E/AndroidRuntime(11990):    at java.lang.reflect.Method.invokeNative(Native Method)
07-03 18:33:29.139: E/AndroidRuntime(11990):    at java.lang.reflect.Method.invoke(Method.java:525)
07-03 18:33:29.139: E/AndroidRuntime(11990):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)
07-03 18:33:29.139: E/AndroidRuntime(11990):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
07-03 18:33:29.139: E/AndroidRuntime(11990):    at dalvik.system.NativeStart.main(Native Method)
07-03 18:33:29.139: E/AndroidRuntime(11990): Caused by: java.lang.NullPointerException
07-03 18:33:29.139: E/AndroidRuntime(11990):    at com.liamw.root.logeraser.FolderTools.folderSize(FolderTools.java:96)
07-03 18:33:29.139: E/AndroidRuntime(11990):    at com.liamw.root.logeraser.FolderTools.folderSize(FolderTools.java:87)
07-03 18:33:29.139: E/AndroidRuntime(11990):    at com.liamw.root.logeraser.MainActivity.initialize(MainActivity.java:194)
07-03 18:33:29.139: E/AndroidRuntime(11990):    at com.liamw.root.logeraser.MainActivity.onCreate(MainActivity.java:131)
07-03 18:33:29.139: E/AndroidRuntime(11990):    at android.app.Activity.performCreate(Activity.java:5167)
07-03 18:33:29.139: E/AndroidRuntime(11990):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
07-03 18:33:29.139: E/AndroidRuntime(11990):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2266)
07-03 18:33:29.139: E/AndroidRuntime(11990):    ... 11 more

2 つのフォルダーサイズ関数は次のとおりです。

public long folderSize() {
        long length = 0;

        for (File file : directory.listFiles()) {
            if (file.isFile())
                length += file.length();
            else if (file != null)
                length += folderSize(file);
        }

        return length;
    }

public long folderSize(File directory) {
        long length = 0;

        for (File file : directory.listFiles()) {
            if (file.isFile())
                length += file.length();
            else if (file != null)
                length += folderSize(file);
        }

        return length;
    }

96 行目:

for (File file : directory.listFiles()) { 

(第 2 関数)

87 行目:

length += folderSize(file);

(最初の機能)

ただし、これが1つのデバイスでのみ発生する理由がわかりません!

EDIT1:

ディレクトリ宣言:

directory = new File("/data/log");

(すでにグローバル変数として定義されています)

4

1 に答える 1

2

ディレクトリが Nexus 7 に存在しないため、 directory.listFiles() が null を返すため、イテレータが NPE をスローします。

File.listFiles() の javadoc の内容は次のとおりです。

An array of abstract pathnames denoting the files and directories
in the directory denoted by this abstract pathname.
The array will be empty if the directory is empty.
Returns null if this abstract pathname does not denote a directory,
or if an I/O error occurs.

単純な exists() で問題は解決しますが、ディレクトリにアクセスできない場合はカバーされず、同様に Null が返されます。そのため、listFiles() が null を返すことを確認するだけで、2 つのメソッドを 1 つに統合することができます。

public long folderSize(File directory) {
    long length = 0;
    File[] files = directory.listFiles();
    if (files != null) {
        for (File file : files) {
            length += file.isFile() ? file.length() : folderSize(file);
        }
    }
    return length;
}

これで、ディレクトリを渡してこれを呼び出すだけです。

long size = folderSize(directory);

また、マニフェストで android.permission.READ_EXTERNAL_STORAGE パーミッションが定義されていることを確認してください。

于 2013-07-03T17:55:52.240 に答える