计算 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的主要内容,如果未能解决你的问题,请参考以下文章