Android 当我单击按钮时,我的应用程序正在关闭

Android 当我单击按钮时,我的应用程序正在关闭,android,Android,显示的错误为:E/AndroidRuntime:致命异常:main 流程:com.example.amarjeet.goal,PID:24396 java.lang.IllegalStateException:无法为android执行方法:onClick 在android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) 在android.vie

显示的错误为:E/AndroidRuntime:致命异常:main 流程:com.example.amarjeet.goal,PID:24396 java.lang.IllegalStateException:无法为android执行方法:onClick 在android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) 在android.view.view.performClick上(view.java:6267) 在android.view.view$PerformClick.run(view.java:24763) 位于android.os.Handler.handleCallback(Handler.java:789) 位于android.os.Handler.dispatchMessage(Handler.java:98) 位于android.os.Looper.loop(Looper.java:164) 位于android.app.ActivityThread.main(ActivityThread.java:6548) 位于java.lang.reflect.Method.invoke(本机方法) 在com.android.internal.os.Zygote$MethodAndArgsCaller.run上(Zygote.java:240) 位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 原因:java.lang.reflect.InvocationTargetException 位于java.lang.reflect.Method.invoke(本机方法) 在android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 在android.view.view.performClick上(view.java:6267) 在android.view.view$PerformClick.run(view.java:24763) 位于android.os.Handler.handleCallback(Handler.java:789) 位于android.os.Handler.dispatchMessage(Handler.java:98) 位于android.os.Looper.loop(Looper.java:164) 位于android.app.ActivityThread.main(ActivityThread.java:6548) 位于java.lang.reflect.Method.invoke(本机方法) 在com.android.internal.os.Zygote$MethodAndArgsCaller.run上(Zygote.java:240) 位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 原因:java.lang.NullPointerException:尝试调用虚拟方法“java.lang.CharSequence” 空对象引用上的android.widget.TextView.getText() 位于com.example.amarjeet.goal.MainActivity.winner(MainActivity.java:31) 位于java.lang.reflect.Method.invoke(本机方法) 在android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 在android.view.view.performClick上(view.java:6267) 在android.view.view$PerformClick.run(view.java:24763) 位于android.os.Handler.handleCallback(Handler.java:789) 位于android.os.Handler.dispatchMessage(Handler.java:98) 位于android.os.Looper.loop(Looper.java:164) 位于android.app.ActivityThread.main(ActivityThread.java:6548) 位于java.lang.reflect.Method.invoke(本机方法) 在``com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)上 消息显示if语句中的错误我单击我的按钮它将关闭


当文本视图为空时,将执行对
t1.getText()
t2.getText()
的一个调用。检查它们是否引用了正确的资源,并且它们实际上是在您试图调用
getText()

时创建的,正如Androidas指出的,调用
winner()
时,
t1
t2
都是
null
。但是,可以通过在
onCreate()
方法中保留对
TextView
s的引用来解决此问题,如下所示:

public class MainActivity extends AppCompatActivity {
    public static final String EXTRA_MESSAGE = "com.example.amarjeet.goal";
    TextView t1,t2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
    public void goal1(View view){
        t1=findViewById(R.id.t1);
      t1.setText(""+(Integer.parseInt(t1.getText().toString())+1));
    }
    public  void goal2(View view){
        t2=findViewById(R.id.t2);
        t2.setText(""+(Integer.parseInt(t2.getText().toString())+1));
    }
    public void winner(View view){
        Intent intent =new Intent(this,Winner.class);
        String msg;
        if(Integer.parseInt(t2.getText().toString()) > Integer.parseInt(t1.getText().toString())){
                            msg="Winner is Team B";}
        else if(Integer.parseInt(t1.getText().toString()) > Integer.parseInt(t2.getText().toString())) {
            msg = "Winner is Team A";
        }
        else
            {
            msg="Match is Draw";}
        intent.putExtra(EXTRA_MESSAGE, msg);
        startActivity(intent);
    }
}
这确保您在活动的整个生命周期中始终有对
t1
t2
的引用,当然前提是这些ID是有效的。还要确保从
goal1()
goal2()
方法中删除这些赋值,即

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    t1 = findViewById(R.id.t1);
    t2 = findViewById(R.id.t2);
}

在使用视图的变量或对象之前,需要绑定视图。您正在使用不同的方法绑定
t1
t2
,如果在绑定
t1
t2
之前单击winner按钮,则会导致崩溃。所以下面的代码可能会对您有所帮助

public void goal1(View view) {
  t1.setText(""+(Integer.parseInt(t1.getText().toString())+1));
}

public void goal2(View view){
    t2.setText(""+(Integer.parseInt(t2.getText().toString())+1));
}

在代码中发布xml file.do中的相关代码,如
t1=(TextView)findViewById(R.id.t1)
@VishalYadav假设他瞄准的是Oreo,那么
findViewById()
@MichaelDodd()就不再需要施法了,这可能是
崩溃的原因
@VishalYadav崩溃发生在
winner()
方法的第31行。如果缺少施法,则崩溃将发生在
goal1()
goal2()
方法中。
public class MainActivity extends AppCompatActivity {
    public static final String EXTRA_MESSAGE = "com.example.amarjeet.goal";
    TextView t1,t2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        t1=findViewById(R.id.t1);
        t2=findViewById(R.id.t2);
    }
    public void goal1(View view){

      t1.setText(""+(Integer.parseInt(t1.getText().toString())+1));
    }
    public  void goal2(View view){

        t2.setText(""+(Integer.parseInt(t2.getText().toString())+1));
    }
    public void winner(View view){
        Intent intent =new Intent(this,Winner.class);
        String msg;
        if(Integer.parseInt(t2.getText().toString()) > Integer.parseInt(t1.getText().toString())){
                            msg="Winner is Team B";}
        else if(Integer.parseInt(t1.getText().toString()) > Integer.parseInt(t2.getText().toString())) {
            msg = "Winner is Team A";
        }
        else
            {
            msg="Match is Draw";}
        intent.putExtra(EXTRA_MESSAGE, msg);
        startActivity(intent);
    }
}