计算 apk 大小时的 NPE

Posted

技术标签:

【中文标题】计算 apk 大小时的 NPE【英文标题】:NPE while calculating the apk size 【发布时间】:2012-01-11 10:16:34 【问题描述】:

我想计算用户在手机上安装的应用程序的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,则 for 循环会说删除 final

而119行就是那个appname[i]...... 我该如何解决这个问题?

感谢您的帮助!!

【问题讨论】:

【参考方案1】:

如果第 119 行是抛出 NullPointerException 异常的行,而第 119 行是这一行:

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

那么你需要处理p.applicationInfo.loadLabel(getPackageManager())返回null的情况。

【讨论】:

【参考方案2】:
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 问题并不难解决。打开堆栈跟踪说有问题的文件,转到它引用的行号,然后查看所有被取消引用的对象引用。其中之一是 null - 就这么简单。在调试器中单步执行,您会立即看到它。

如果带有注释的那一行是 119,我会得出结论 pstats 必须为空。您认为您已正确初始化它,但 JVM 不同意。如果没有,请查找第 119 行。

那些空的 catch 块是一个非常个坏主意。如果您遇到异常,您将永远不会知道。始终打印堆栈跟踪,如下所示:

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

【讨论】:

我无法弄清楚尝试捕获行执行方式的行为。该课程可在此处找到。 ***.com/questions/8801769/…请帮我弄清楚。 我不确定我是否理解您在说什么。请参阅上面的示例。

以上是关于计算 apk 大小时的 NPE的主要内容,如果未能解决你的问题,请参考以下文章

安卓计算APK的应用大小数据大小缓存大小等。

安卓计算APK的应用大小数据大小缓存大小等。

在 iOS 7 中重新计算旋转时的子视图大小

怎样设置kmplayer 关闭时能保持之前播放时的窗口大小?

计算结构体的大小

结构体大小的计算,对齐