Java 单击按钮时活动中的NullPointerException

Java 单击按钮时活动中的NullPointerException,java,android,nullpointerexception,android-activity,Java,Android,Nullpointerexception,Android Activity,我有两个活动屏幕。第一个有两个按钮。 Button1根据用户输入处理数据,Button2根据处理结果引导用户进入下一个活动屏幕 每当我点击按钮1,什么都不会发生,而且 当我点击按钮2时,应用程序停止工作,并显示“不幸…”消息。起初,一切进展顺利,但后来我添加了一些代码,应用程序将无法运行 main活动 public class MainActivity extends Activity { @Override public void onCreate(Bundle savedIn

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

每当我点击按钮1,什么都不会发生,而且

当我点击按钮2时,应用程序停止工作,并显示“不幸…”消息。起初,一切进展顺利,但后来我添加了一些代码,应用程序将无法运行

main活动

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");
}
}
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
Logcat:

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");
}
}
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移动编程的初学者,希望您能提供帮助。

尝试替换以下代码:

//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(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");
}
为此:

//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”)您正在尝试从包中读取值。根据以下方法的javadoc:

它返回以前使用
putExtra()
添加的所有附加的映射,或 如果未添加任何内容,则为null

现在,由于您没有使用
putExtra()
main活动中设置任何值,因此对
getExtras()
调用的响应将变为null。因此,您需要在
main活动中调用
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);
                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(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");
}
另外,请在读取包中的值之前进行空检查,如以下代码所示:

//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(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");
}

尝试替换以下代码:

//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(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");
}
为此:

//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”)您正在尝试从包中读取值。根据以下方法的javadoc:

它返回以前使用
putExtra()
添加的所有附加的映射,或 如果未添加任何内容,则为null

现在,由于您没有使用
putExtra()
main活动中设置任何值,因此对
getExtras()
调用的响应将变为null。因此,您需要在
main活动中调用
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);
                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(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");
}
另外,请在读取包中的值之前进行空检查,如以下代码所示:

//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(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");
}

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

另外,在你的接收端,检查你得到的额外服务是否没有

所以试着这样做

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

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

另外,在你的接收端,检查你得到的额外服务是否没有

所以试着这样做

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

发生此错误的原因是您未在“下一步”按钮的“单击意图”事件中传递双值

写下面的代码

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);

它将解决您的问题。

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

写下面的代码

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);

它会解决你的问题。

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

    //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);
        }

    });

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

    //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);
        }

    });

可能会有一些错误

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

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

    Intent myIntent=newintent(view.getContext(),Activity2.class)

这里您使用的是Buttin的
onClickListener的
视图
,但您应该使用
活动上下文
,如
MyActivity。此
应用程序上下文
,如
getApplicationContext()

  • 尝试使用

    startActivity(myIntent)

而不是

startActivityForResult(myIntent, 0);
  • 如果你的问题没有解决,最后一个不太可能的情况可能是
尝试向意图添加标志,如下所示

 Bundle extras = getIntent().getExtras();
 if(extras != null)
 {
    double bmival = extras.getDouble("key");
 }
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  • 您没有在Intent Extras中设置任何值,尽管这会在下一个活动中给您带来错误

    myIntent.putExtra(“键”,bmi值)


    • 可能会有一些错误

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

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

        Intent myIntent=newintent(view.getContext(),Activity2.class)

      这里您使用的是Buttin的
      onClickListener的
      视图
      ,但您应该使用
      活动上下文
      ,如
      MyActivity。此
      应用程序上下文
      ,如
      getApplicationContext()

      • 尝试使用

        startActivity(myIntent)

      而不是

      startActivityForResult(myIntent, 0);
      
      • 如果你的问题没有解决,最后一个不太可能的情况可能是
      尝试向意图添加标志,如下所示

       Bundle extras = getIntent().getExtras();
       if(extras != null)
       {
          double bmival = extras.getDouble("key");
       }
      
      myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      
      • 您没有在Intent Extras中设置任何值,尽管这会在下一个活动中给您带来错误

        myIntent.putExtra(“键”,bmi值)


      请显示logcat日志…@AprilMosca使用startActivity()而不是startActivityForResult(intent1,0);然后是t