【问题标题】:NullPointerException in Activity when click on button单击按钮时 Activity 中的 NullPointerException
【发布时间】:2012-12-27 05:29:20
【问题描述】:

我有 2 个活动屏幕。第一个有 2 个按钮。 Button1 根据用户输入处理数据,而 Button2 根据处理结果将用户引导至下一个活动屏幕。

每当我点击 Button1 时,什么都没有发生,并且

当我单击 Button2 时,应用程序停止工作并显示“不幸的是...”消息。起初,一切正常,但后来我添加了一些代码,然后应用程序将无法运行运行。

MainActivity

public class MainActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    //for the header
        View title = getWindow().findViewById(android.R.id.title);
        if (title != null)
        { 
            ViewParent titleBar = title.getParent();
            if (titleBar != null && (titleBar instanceof View))
            { 
                View parentView = (View)titleBar; 
                parentView.setBackgroundColor(Color.RED); 
            }
        }

    //for button2
        Button next = (Button) findViewById(R.id.DGButton);
        next.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View view)
            {
                Intent myIntent = new Intent(view.getContext(), Activity2.class);
                startActivityForResult(myIntent, 0);
            }

        });
    } 

    public void calculateClickHandler(View view)
    {
        //handle the click of button1

        if (view.getId() == R.id.CalculateButton)
        {
         //some codes

    //the next activity screen uses the calculated value for some outputs
         Intent intent1 = new Intent(MainActivity.this, Activity2.class);
        Bundle b = new Bundle();
        b.putDouble("key", bmiValue);
        intent1.putExtras(b);
        startActivityForResult(intent1,0);
    }
    }

活动 2:

public class Activity2 extends Activity
{ 
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        Button next = (Button) findViewById(R.id.BackToBMI);
        next.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                Intent intent = new Intent();
                setResult(RESULT_OK, intent);
                finish();
            }
        });
//some codes

        Bundle b = getIntent().getExtras(); //the nullpointerexception is here
        double bmival = b.getDouble("key");
}
}

Logcat:

12-27 05:15:03.263: E/AndroidRuntime(1091): FATAL EXCEPTION: main
12-27 05:15:03.263: E/AndroidRuntime(1091): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.bmicaldg/com.example.bmicaldg.Activity2}: java.lang.NullPointerException
12-27 05:15:03.263: E/AndroidRuntime(1091):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at android.os.Looper.loop(Looper.java:137)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at android.app.ActivityThread.main(ActivityThread.java:5039)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at java.lang.reflect.Method.invokeNative(Native Method)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at java.lang.reflect.Method.invoke(Method.java:511)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at dalvik.system.NativeStart.main(Native Method)
12-27 05:15:03.263: E/AndroidRuntime(1091): Caused by: java.lang.NullPointerException
12-27 05:15:03.263: E/AndroidRuntime(1091):     at com.example.bmicaldg.Activity2.onCreate(Activity2.java:33)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at android.app.Activity.performCreate(Activity.java:5104)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
12-27 05:15:03.263: E/AndroidRuntime(1091):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
12-27 05:15:03.263: E/AndroidRuntime(1091):     ... 11 more

这也是 MainActivity 的 XML 文件:

按钮1:

<Button
        android:id="@+id/CalculateButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/textView4"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="14dp"
        android:background="#FF0000"
        android:minHeight="30dip"
        android:minWidth="65dip"
        android:onClick="calculateClickHandler"
        android:text="@string/CalculateButton"
        android:textColor="#FFFFFF"
        android:textSize="14sp" />

按钮2:

<Button
        android:id="@+id/DGButton"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:background="#FF0000"
        android:minHeight="30dip"
        android:onClick="calculateClickHandler"
        android:text="@string/DGButton"
        android:textColor="#FFFFFF" />

我是 Android 移动编程的初学者,因此我们将不胜感激。

【问题讨论】:

  • 请显示 logcat 日志...
  • @AprilMosca 使用 startActivity() 而不是 startActivityForResult(intent1,0);然后尝试。
  • 谢谢大家的帮助,我只是在等待模拟器尝试你的建议。
  • @AprilMosca 请看我的回答,它会解决你的问题。

标签: java android nullpointerexception android-activity


【解决方案1】:

发生此错误是因为您没有在下一个按钮的单击事件中传递双精度值。

写下代码

Intent intent1 = new Intent(MainActivity.this, Activity2.class);
intent1.putExtra("key", bmiValue);
startActivity(intent1);

而不是下面关于下一个按钮的点击事件和calculateClickHandler() 方法的意图代码的代码。

Intent myIntent = new Intent(view.getContext(), Activity2.class);
startActivityForResult(myIntent, 0);

它会解决你的问题。

【讨论】:

  • 在我的 xml 文件中,android:onClick 按钮的值是否与 calculateClickHandler 相同?
  • @AprilMosca 然后写 startActivity(intent1);而不是 startActivityForResult(intent1,0);在 calculateClickHandler() 方法上。
【解决方案2】:

尝试替换以下代码:

//for button2
        Button next = (Button) findViewById(R.id.DGButton);
        next.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View view)
            {
                Intent myIntent = new Intent(view.getContext(), Activity2.class);
                startActivityForResult(myIntent, 0);
            }

        });

用这个:

//for button2
        Button next = (Button) findViewById(R.id.DGButton);
        next.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View view)
            {
                Intent myIntent = new Intent(MainActivity.this, Activity2.class);
                startActivityForResult(myIntent, 0);
            }

        });

EDIT1:在 logcat 日志后更新..

double bmival = b.getDouble("key"); 方法的最后一行,您正试图从包中读取值。根据方法getExtras()的以下javadoc:

它返回之前使用putExtra() 添加的所有附加组件的映射,或者 如果没有添加任何内容,则为 null。

现在,由于您没有使用putExtra()MainActivity 中设置任何值,因此您在对getExtras() 的调用的响应中得到空值。所以你需要在MainActivity 中调用putExtra() 将一些值传递给Activity2,如下代码:

//for button2
        Button next = (Button) findViewById(R.id.DGButton);
        next.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View view)
            {
                Intent myIntent = new Intent(view.getContext(), Activity2.class);
                 //Assuming bmival is a class variable that has the value that you want to pass on to Activity2
                  myIntent.putExtra("key",bmival);

                startActivityForResult(myIntent, 0);
            }

        });

另外,请在从捆绑包中读取值之前进行空检查,如下面的代码:

if(b!=null){
   double bmival = b.getDouble("key");
}

【讨论】:

【解决方案3】:

可能会有一些错误,

  • 第一个也是最可能的情况可能是您没有在清单文件中定义第二个活动。因此,首先检查您是否已在清单文件中定义了所有活动。

  • 下面的说法是完全错误的。

    Intent myIntent = new Intent(view.getContext(), Activity2.class);

在这里,您使用的是 Buttin 的 onClickListener 中的 View,但您应该使用 Activity Context,例如 MyActivity.thisApplication's Context,例如 getApplicationContext()

  • 尝试使用

    startActivity(myIntent);

而不是

startActivityForResult(myIntent, 0);
  • 如果您的问题根本没有解决,最后一个不太可能的情况可能是,

尝试向意图添加标志,像这样

myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  • 你没有在 Intent Extras 中设置任何值,虽然它会在下一个 Activity 中给你一个错误,

    myIntent.putExtra("key", bmiValue);

【讨论】:

    【解决方案4】:

    我想你正在寻找这个,试试这个

        //for button2
        Button next = (Button) findViewById(R.id.DGButton);
        next.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                Intent myIntent = new Intent(MainActivity.this, Activity2.class);
                Bundle b = new Bundle();
                b.putDouble("key", bmiValue);
                intent1.putExtras(b);
                startActivityForResult(myIntent, 0);
            }
    
        });
    

    【讨论】:

      【解决方案5】:

      最好使用startActivity() 而不是startActivityForResult(intent1,0)

      并且在你的接收方检查你是否得到额外的东西

      所以试试这样

       Bundle extras = getIntent().getExtras();
       if(extras != null)
       {
          double bmival = extras.getDouble("key");
       }
      

      【讨论】:

        猜你喜欢
        • 2015-12-20
        • 1970-01-01
        • 2017-10-14
        • 1970-01-01
        • 1970-01-01
        • 2018-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多