NPE при расчете размера АПК - PullRequest
0 голосов
/ 11 января 2012

Я хочу рассчитать размер файла apk установленных пользователем приложений на телефоне

01-11 15:20:30.373: E/AndroidRuntime(17940):    at android.os.AsyncTask$3.done(AsyncTask.java:200)
01-11 15:20:30.373: E/AndroidRuntime(17940):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
01-11 15:20:30.373: E/AndroidRuntime(17940):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
01-11 15:20:30.373: E/AndroidRuntime(17940):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
01-11 15:20:30.373: E/AndroidRuntime(17940):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-11 15:20:30.373: E/AndroidRuntime(17940):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
01-11 15:20:30.373: E/AndroidRuntime(17940):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
01-11 15:20:30.373: E/AndroidRuntime(17940):    at java.lang.Thread.run(Thread.java:1096)
01-11 15:20:30.373: E/AndroidRuntime(17940): Caused by: java.lang.NullPointerException
01-11 15:20:30.373: E/AndroidRuntime(17940):    at com.taskmanager.sb.PackageTabActivity$AppDetails.doInBackground(PackageTabActivity.java:119)
01-11 15:20:30.373: E/AndroidRuntime(17940):    at com.taskmanager.sb.PackageTabActivity$AppDetails.doInBackground(PackageTabActivity.java:1)
01-11 15:20:30.373: E/AndroidRuntime(17940):    at android.os.AsyncTask$2.call(AsyncTask.java:185)
 01-11 15:20:30.373: E/AndroidRuntime(17940):   at     java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-11 15:20:30.373: E/AndroidRuntime(17940):    ... 4 more

код равен

       for(int i=0;i<packs.size();i++ ) {

       final PackageInfo p = packs.get(i);

       if(!isSystemPackage(p))
        {
                 String package_name = p.applicationInfo.packageName;

                 appname[i] =p.applicationInfo.loadLabel(getPackageManager()).toString();
            try
            {
                getPackageSizeInfo.invoke(pm,  package_name, new IPackageStatsObserver.Stub()
                {
                    public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException
                    {

                        size[i] = pStats.codeSize/1024; // here error come says make i final


                    }});


          }catch(IllegalAccessException a) {}
            catch(IllegalArgumentException b) {}
            catch(InvocationTargetException c) {}
        }


        //    Log.v("apksize", "appsize = "+sSize+"appname = "+sName);


            }

Если я сделаю i глобальным, то получу NPEи если я сделаю i final, тогда цикл говорит, что удалить final

и 119 строка это appname [i] ...... Как я могу решить эту проблему?

Спасибо залюбая помощь !!

Ответы [ 2 ]

2 голосов
/ 11 января 2012

Если строка 119 выдает исключение NullPointerException, а строка 119 - это строка:

appname[i] =p.applicationInfo.loadLabel(getPackageManager()).toString();

тогда вам нужно будет обработать случай, когда p.applicationInfo.loadLabel(getPackageManager()) возвращает null.

2 голосов
/ 11 января 2012
01-11 15:20:30.373: E/AndroidRuntime(17940): Caused by: java.lang.NullPointerException 

01-11 15:20:30.373: E/AndroidRuntime(17940):    at com.taskmanager.sb.PackageTabActivity$AppDetails.doInBackground(PackageTabActivity.java:119)

Проблемы NPE несложно выяснить. Откройте файл, который, как говорит трассировка стека, имеет проблему, перейдите к номеру строки, на которую он ссылается, и посмотрите на все ссылки на объекты, на которые дается ссылка. Один из них является нулевым - просто так. Пройдите через отладчик, и вы сразу это увидите.

Если эта строка с комментарием равна 119, я бы пришел к выводу, что pstats должно быть нулевым. Вы думали, что инициализировали это правильно, но JVM не согласен. Если нет, найдите строку 119.

Эти пустые блоки улова - очень плохая идея. Вы никогда не узнаете об этом, если получите исключение. Всегда печатайте трассировку стека, например:

try {
    // Do something in here 
} catch (Exception e) {
    e.printStackTrace();
}
...