Java Android Intent让我的应用程序崩溃,为什么?

Java Android Intent让我的应用程序崩溃,为什么?,java,android,debugging,android-layout,android-intent,Java,Android,Debugging,Android Layout,Android Intent,因此,我在没有通过分数变量的情况下试用了我的应用程序,它成功了。但是如果我尝试使用它,它根本不会起作用 主要类别: int start = 10; // start Play Intent public void onPlay(View view){ Intent playIntent = new Intent(this, Quiz_1.class); playIntent.putExtra("Score", start); startActivity(playIn

因此,我在没有通过分数变量的情况下试用了我的应用程序,它成功了。但是如果我尝试使用它,它根本不会起作用

主要类别:

int start = 10;



// start Play Intent
public void onPlay(View view){
    Intent playIntent = new Intent(this, Quiz_1.class);
    playIntent.putExtra("Score", start);
    startActivity(playIntent);
}
以及
测验1
课程:

public class Quiz_1 extends Activity {
int printScore;
TextView printPoints;


@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.quiz_1);
    printPoints = (TextView) findViewById(R.id.q_result);
}

Intent intent = getIntent();
int score = intent.getIntExtra("Score", 0);
String printFin = String.valueOf(score);

public void q_result(View view){
    printPoints.setText(printFin);
}
我确信,当我试图将开始值传递给我的其他活动时,我犯了一些错误。在那里,我想将textView的文本更改为以前的int start值=10

所以,

第一项活动: int t start=10

第二。活动: 积分=开始

printScore(它是一个TextView)setText=score

所有Java代码都必须在一个方法中。这里,最后三行不在任何方法中,因此不执行

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.quiz_1);
    printPoints = (TextView) findViewById(R.id.q_result);

} <----- move this closing brace

Intent intent = getIntent();
int score = intent.getIntExtra("Score", 0);
String printFin = String.valueOf(score);    

} <----- to here
@覆盖
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.quick_1);
printPoints=(TextView)findViewById(R.id.q_结果);

}您需要在类似
onCreate

Intent intent = getIntent();
int score = intent.getIntExtra("Score", 0);
String printFin = String.valueOf(score);
但是,崩溃仍然可能发生,因此最好在堆栈跟踪之后进行

编辑:


将所有代码更改为

public class Quiz_1 extends Activity {
int printScore;
TextView printPoints;


int score = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
      setContentView(R.layout.quiz_1);

     Bundle extras = getIntent().getExtras(); 
    if (extras != null) 
     {
       score   = extras.getInt("Score");
    }


    printPoints = (TextView) findViewById(R.id.q_result);
 printPoints.setText(String.valueOf(score));
}

如果您想将一个值传递给另一个意图,可以查看下面的代码

您可以像intents一样放置键值对,并且可以在您调用的活动中检索这些值。你可以研究:-

Intent returnIntent = new Intent(getApplicationContext, SecondActivity.class);
returnIntent.putExtra("name","abc");
startActivity(returnIntent,11);
在其他活动结果方法中,您可以

Bundle extras = getIntent().getExtras(); 
if (extras != null) {
String name = bundle.getString("name");
    // and get whatever data you are adding
}

您可以查看此链接。

我已经浏览了此链接-

我可能发现了一个错误

案例1:-您正在passScore键中传递defaultScore值,并在Quiz1.Java中检索它 MainActivity.Java->

startQuiz.putExtra("passScore", defaultScore);
测验1.Java->

  current_score   = extras.getInt("passScore");
   quiz1.putExtra("passNewScore", current_score);
案例2:-您正在passNewScore中通过当前的_分数,并在Quiz2.Java中检索它
测验1.Java->

  current_score   = extras.getInt("passScore");
   quiz1.putExtra("passNewScore", current_score);
Quiz2.Java

  current_score   = extras.getInt("passScore");
  getScore = extras.getInt("passNewScore");
现在,这里的错误是:- 在quiz2.java中,您正在当前_score中提取passScore,因为这个键值放在了您的主_活动中,而不是您调用quiz2.java的quiz1.java中

因此,要在quiz2.java中检索这个值,必须在quiz1.java中再次传递它,从这里调用quiz2 intent

要更正它,请修改quiz1.java:-

public void on_quiz_1_wrong(View view){  // button clicked the wrong answer
   current_score = current_score - 2;
   Intent quiz1 = new Intent(this, Quiz_2.class);
   startActivity(quiz1);
   quiz1.putExtra("passNewScore", current_score);
   quiz1.putExtra("passScore", whatever value you want to pass here);

}


它将不起作用
,这意味着什么?你在清单中声明了测验1吗?你在任何方法之外都有几行代码那么,我应该更改什么?我需要为类中的每一件事都使用方法吗?没有执行????那是错误的。可能您当时的意思是getIntent()返回null?谢谢,您是世界上最好的程序员!!!!!!!!!你是编程高手!!非常感谢你,你帮助了我很多,你救了我的命@blackbelt getIntent()将永远不会执行。这超出了任何方法。@Simon虽然解决方案是正确的,但原因并非100%正确。这是因为当类(
Activity
,在此上下文中)创建时,变量将用值初始化(可以使用方法的返回值)。这意味着,这3行将在调用
onCreate()
之前执行,并将
null
返回到
intent
。因此,在
intent.getIntExtra(“Score”,0)
上抛出
NullPointerException
,正如@blackbelt所说的那样。@user2547460也将
字符串printFin
声明为类成员,如果它不是
onCreate
的本地变量,并且您正在
q_result
中使用它,但是如果我想传递多个变量呢?但不是来自同一个班级,我会通过intent将默认分数变量传递给该活动,但我也会传递来自不同活动的另一个值op代码中有方法
public void q_result(View View){printPoints.setText(printFin);}
,它在哪里?为什么我需要使用if和extras=null,不;如果它可以在没有ti的情况下工作,那么为什么要使用if语句呢???请解释@user2547460如果要检查extras是否为null,那么这只是一个好的检查。但是你有方法点击按钮你需要设置文本但是没有公共的无效q_结果(视图){printPoints.setText(printFin);}
@Jack K Foani如果extras仍然为空怎么办
printPoints=(TextView)findViewById(R.id.q_结果);printPoints.setText(String.valueOf(score))执行此操作?如果其仍然为空,则表示启动
测验1
类的活动未发送意向额外
分数
,因此您不能使用额外分数,因为第一次检查时它为空如果为空,分数将设置为
测验1
类中定义的0原始分数,但是如果Extras不为null,
分数将被更改为新分数,该分数是通过intent发送到活动的。Putextra但是如果我想传递多个变量?但不是来自同一个类,我会通过intent将一个默认分数变量传递给该活动,但我也会传递来自不同活动的另一个值我无法理解你想说什么,但是你可以通过调用putExtra方法传递无限数量的键值对。我将编辑你的答案,以便你理解我,我将复制不起作用的代码,好吗?