【问题标题】:null pointer exception calling a method调用方法的空指针异常
【发布时间】:2013-09-17 09:35:33
【问题描述】:

我的应用程序中有 2 个活动,在第二个活动中,我有代码在单击“关于”android 操作栏图标时运行。在第一个活动中,我有相同的操作栏菜单项,我想再次调用这个“关于”方法,但是当我点击它时,我有空指针异常。有人帮忙吗?

这是在第二个活动中定义的方法 - JokeDetailsActivity

public void aboutMe(){
    AlertDialog.Builder dialog = new AlertDialog.Builder(JokeDetailsActivity.this);
    dialog.setTitle("About");
    dialog.setMessage("Hello! I'm ..., the creator of this application."
               +"If there is any bug found please freely e-mail me. "+
                "\n ...."
               );
    dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {

           @Override
           public void onClick(DialogInterface dialog, int which) {
               dialog.cancel();

           }
       });
       dialog.show();              
}

当我在第一个活动中调用它时

case R.id.action_about:

        JokeDetailsActivity jd = new JokeDetailsActivity();
        jd.aboutMe();
        return true;
    }

这就是我遇到的错误

09-12 20:11:42.748: E/AndroidRuntime(1032): FATAL EXCEPTION: main
09-12 20:11:42.748: E/AndroidRuntime(1032): java.lang.NullPointerException
09-12 20:11:42.748: E/AndroidRuntime(1032):     at            android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:140)
09-12 20:11:42.748: E/AndroidRuntime(1032):     at           android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:103)
09-12 20:11:42.748: E/AndroidRuntime(1032):     at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:143)
09-12 20:11:42.748: E/AndroidRuntime(1032):     at android.app.AlertDialog$Builder.<init>(AlertDialog.java:360)
09-12 20:11:42.748: E/AndroidRuntime(1032):     at ie.myjokes.JokeDetailsActivity.aboutMe(JokeDetailsActivity.java:293)
09-12 20:11:42.748: E/AndroidRuntime(1032):     at ie.myjokes.CategoryActivity.onOptionsItemSelected(CategoryActivity.java:140)
09-12 20:11:42.748: E/AndroidRuntime(1032):     at android.app.Activity.onMenuItemSelected(Activity.java:2548)

【问题讨论】:

    标签: android android-activity nullpointerexception menuitem


    【解决方案1】:

    将该方法声明为static 并将其称为JokeDetailsActivity.aboutMe(yourActivityContext)。不要创建活动对象并记住传递context,然后您可以使用它来创建对话框。 @Hi-Tech KitKat Android 给出了更详细的答案。

    【讨论】:

    • 不,不要在活动上创建静态方法。
    • @323 好的。想知道有什么影响吗?
    • 首先,上面的代码显然不起作用,因为没有可用于提供ContextActivity 封闭实例。上面的代码应该移到调用它的活动中;如果从多个位置调用它,它应该是一个活动之外的静态方法。
    • @323go 我同意需要传递上下文才能使其工作。正如您所说,将其移动到一些常见的Util 文件等中是一个很好的设计,如果它在多个地方被调用,则使其成为静态(尽管如果上下文通过,它仍然可以从第一个活动中访问)。所以答案的问题是上下文没有通过并且设计不好,对吗?很公平:)
    【解决方案2】:

    这是什么

     JokeDetailsActivity jd = new JokeDetailsActivity();
     jd.aboutMe();
    

    如果你想启动 Activity,你应该使用 Intent 来实现

    你不应该实例化活动

    创建一个单独的 Class pass Context 并在那里创建你的 aboutMe() 方法,然后重用它

    或者,您可以在其中将其创建为静态方法

    public static void aboutMe(Context mContext){
        AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
        dialog.setTitle("About");
        dialog.setMessage("Hello! I'm ..., the creator of this application."
                   +"If there is any bug found please freely e-mail me. "+
                    "\n ...."
                   );
        dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
    
               @Override
               public void onClick(DialogInterface dialog, int which) {
                   dialog.cancel();
    
               }
           });
           dialog.show();              
    }
    

    然后像这样使用它

    JokeDetailsActivity.aboutMe(getApplicationContext());
    

    【讨论】:

    • 我可以将“this”作为上下文传递吗?
    • 你应该传递 ActivityName.this
    • 如果你不在任何线程或 UI 线程之外,那么你可以传递 'this'
    【解决方案3】:

    不,不要这样做

    JokeDetailsActivity jd = new JokeDetailsActivity();
    

    由于您没有正确的Context,因此您会收到以下行中的错误。

    AlertDialog.Builder dialog = new AlertDialog.Builder(JokeDetailsActivity.this);
    

    您试图在一个Activity 中调用它,但使用另一个ActivityContext

    你有几个选择

    1 只需在您的另一个 Activity 中重新创建此函数,然后 用正确的Context (ActivityName.this) 将其称为Activity

    2 创建一个单独的类,所有这些Activities 都可以调用以使用此函数并将正确的Context 传递给该类。

    3 将此方法放入 BaseActivity 并让您的 Activities 扩展此 BaseActivity 并将该方法放置在那里。

    我记得#4

    您还可以创建一个单独的Activity,例如AboutActivity,以处理/显示您想要的任何内容,并通过将以下行添加到您的manifest 中的&lt;activity 标记给它一个Dialog Theme

    android:theme="@android:style/Theme.Dialog"
    

    那么您只需从您需要的任何地方开始Activity

    【讨论】:

      【解决方案4】:

      是的,就是这样,您可以启动一个 Activity,例如:

          Intent intent = new Intent(this, YourActivity.class);
          startActivity(intent);
      

      【讨论】:

        【解决方案5】:

        你不能像这样实例化一个 Activity 类并使用它。 Activity 的创建由 Android 系统处理,它需要获取 Context 和其他东西(这是你没有的东西,当你实例化 AltertDialog 构建器时确实会用到,因此会出现空指针异常) .我建议您将该方法 aboutMe 设为静态方法,并将 Context 对象传递给它:

        public static void aboutMe(Context context){
            AlertDialog.Builder dialog = new AlertDialog.Builder(context);
            dialog.setTitle("About");
            dialog.setMessage("Hello! I'm ..., the creator of this application."
                       +"If there is any bug found please freely e-mail me. "+
                        "\n ...."
                       );
            dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        
                   @Override
                   public void onClick(DialogInterface dialog, int which) {
                       dialog.cancel();
        
                   }
               });
               dialog.show();              
        }
        

        【讨论】:

        • 可以实例化activity
        • 但它会通过运行时异常
        • 顺便说一句,在人们对静态方法给出不好的反馈之前 - 在这种情况下,它可能是静态方法的一个好案例,因为它几乎没有与类的特定数据或类似的东西相关那个。
        • 另外,我还不能对其他内容添加评论,但您根本不需要使用 Intent。如果您使用 Intent,您将开始另一个活动。 PO 不希望这样。他只想继续他的第二个活动,但显示一个关于他的对话
        • 我只是在谈论你使用 CanNot 但你可以导致异常仅此而已
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-30
        • 1970-01-01
        • 1970-01-01
        • 2020-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多