【问题标题】:NPE while calculating the apk size计算 apk 大小时的 NPE
【发布时间】: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]...... 我该如何解决这个问题?

感谢您的帮助!!

【问题讨论】:

    标签: java android variables nullpointerexception filesize


    【解决方案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();
      }
      

      【讨论】:

      • 我无法弄清楚尝试捕获行执行方式的行为。该课程可在此处找到。 stackoverflow.com/questions/8801769/…请帮我弄清楚。
      • 我不确定我是否理解您在说什么。请参阅上面的示例。
      猜你喜欢
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 2021-09-22
      相关资源
      最近更新 更多