由于测量时间导致空指针异常?
Nullpointerexception because of measuring time?
我想测量第一次按钮点击和第三次按钮点击之间的时间。代码本身工作正常,但当我在我的设备上第三次单击按钮时,我得到了一个空指针异常。
为什么?
代码如下:
public class Game extends Activity implements OnClickListener{
Button start_time;
int i = 0;
TextView textview1;
Button RelativeLayout;
Button gameover;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// RelativeLayout.setClickable(true);
setContentView(R.layout.activity_game);
start_time = (Button) findViewById(R.id.start_time);
start_time.setOnClickListener(this);
textview1 = (TextView) findViewById(R.id.textView1);
gameover = (Button) findViewById(R.id.gameover);
gameover.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
finish();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.game, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
textview1 = (TextView) findViewById(R.id.textView1);
Random r = new Random();
RelativeLayout decorView = (RelativeLayout) start_time.getParent();
int screenWidth = decorView.getWidth();
int screenHeight = decorView.getHeight();
long startTime = SystemClock.elapsedRealtime();
i++;
if (i == 1 ) {
start_time.setX(r.nextInt(screenWidth - start_time.getWidth()));
start_time.setY(r.nextInt(screenHeight - start_time.getHeight()));
}
if (i == 2 ) {
start_time.setX(r.nextInt(screenWidth - start_time.getWidth()));
start_time.setY(r.nextInt(screenHeight - start_time.getHeight()));
}
if (i == 3 ) {
start_time.setX(r.nextInt(screenWidth - start_time.getWidth()));
start_time.setY(r.nextInt(screenHeight - start_time.getHeight()));
}
if (i == 4 ) {
start_time.setX(r.nextInt(screenWidth - start_time.getWidth()));
start_time.setY(r.nextInt(screenHeight - start_time.getHeight()));
}
if (i == 5 ) {
start_time.setX(r.nextInt(screenWidth - start_time.getWidth()));
start_time.setY(r.nextInt(screenHeight - start_time.getHeight()));
}
if (i == 6 ) {
start_time.setX(r.nextInt(screenWidth - start_time.getWidth()));
start_time.setY(r.nextInt(screenHeight - start_time.getHeight()));
}
else if (i == 7) {
long difference = SystemClock.elapsedRealtime() - startTime;
Intent intent = new Intent(Game.this, MainScreen.class);
intent.putExtra("time",difference);
// textview1.setText(intent.getStringExtra("time"));
// textview1.setText(String.valueOf(difference));
finish();
}
}
}
和主要活动:
public class MainScreen extends Activity implements OnClickListener {
Button btn_start;
TextView textview1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_screen);
btn_start = (Button) findViewById(R.id.btn_start);
btn_start.setOnClickListener(this);
textview1 = (TextView) findViewById(R.id.textView1);
}
@Override
public void onClick(View v) {
startActivityForResult(new Intent(this,Game.class), 0);
textview1.setText(getIntent().getStringExtra("time"));
}
}
logcat:
03-09 16:08:10.760: E/AndroidRuntime(6372): FATAL EXCEPTION: main
03-09 16:08:10.760: E/AndroidRuntime(6372): Process: ch.frozensparks.asdf, PID: 6372
03-09 16:08:10.760: E/AndroidRuntime(6372): java.lang.NullPointerException
03-09 16:08:10.760: E/AndroidRuntime(6372): at ch.frozensparks.bftjh.Game.onClick(Game.java:118)
03-09 16:08:10.760: E/AndroidRuntime(6372): at android.view.View.performClick(View.java:4470)
03-09 16:08:10.760: E/AndroidRuntime(6372): at android.view.View$PerformClick.run(View.java:18593)
03-09 16:08:10.760: E/AndroidRuntime(6372): at android.os.Handler.handleCallback(Handler.java:733)
03-09 16:08:10.760: E/AndroidRuntime(6372): at android.os.Handler.dispatchMessage(Handler.java:95)
03-09 16:08:10.760: E/AndroidRuntime(6372): at android.os.Looper.loop(Looper.java:157)
此行出现异常
textview1.setText(getIntent().getStringExtra("time"));
您正在尝试从当前 activity 获取 Intent,但在此处传递给新的 Intent 对象
Intent intent = new Intent(Game.this, MainScreen.class);
intent.putExtra("time",difference);
导航到游戏时,您需要完成主屏幕 Activity。
MainScreen.this.finish();在 MainScreen 的 onClick 方法中。
另外你需要在游戏的onclick中启动activity activity
startActivity(intent)
(首先,我假设 post 顶部的代码是 Game.class 的一部分。)
好的,我认为您误解了 intents 的运作方式。
Intent intent = new Intent(Game.this, MainScreen.class);
intent.putExtra("time", difference);
在这里您要创建一个新的意图(称为 'intent')并将值 'difference' 和键 'time' 放入其中。
然后
textview1.setText(getIntent().getStringExtra("time"));
您在此处尝试访问该值——但您实际上访问的是一个完全不同的意图对象。通过使用 getIntent(),您正在访问用于启动当前 activity 的意图对象,而不是您在其上方定义的对象。 (您还试图从意图中获取额外的 String,但您存储的是 long。)
如果您想访问该意图对象,只需使用:
intent.getStringExtra("time");
所以你的台词是:
textview1.setText(intent.getStringExtra("time"));
但我会这样做:
textview1.setText(String.valueOf(difference));
最后一件事,我无法确定您在顶部代码块中定义 textview1 的位置,但是如果您尝试引用作为 MainScreen 一部分的 textview1,这可能会导致您的问题,因此您可能必须将其设置为 public 或将差异变量传回并在 MainScreen 中设置文本。
我想测量第一次按钮点击和第三次按钮点击之间的时间。代码本身工作正常,但当我在我的设备上第三次单击按钮时,我得到了一个空指针异常。
为什么?
代码如下:
public class Game extends Activity implements OnClickListener{
Button start_time;
int i = 0;
TextView textview1;
Button RelativeLayout;
Button gameover;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// RelativeLayout.setClickable(true);
setContentView(R.layout.activity_game);
start_time = (Button) findViewById(R.id.start_time);
start_time.setOnClickListener(this);
textview1 = (TextView) findViewById(R.id.textView1);
gameover = (Button) findViewById(R.id.gameover);
gameover.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
finish();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.game, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
textview1 = (TextView) findViewById(R.id.textView1);
Random r = new Random();
RelativeLayout decorView = (RelativeLayout) start_time.getParent();
int screenWidth = decorView.getWidth();
int screenHeight = decorView.getHeight();
long startTime = SystemClock.elapsedRealtime();
i++;
if (i == 1 ) {
start_time.setX(r.nextInt(screenWidth - start_time.getWidth()));
start_time.setY(r.nextInt(screenHeight - start_time.getHeight()));
}
if (i == 2 ) {
start_time.setX(r.nextInt(screenWidth - start_time.getWidth()));
start_time.setY(r.nextInt(screenHeight - start_time.getHeight()));
}
if (i == 3 ) {
start_time.setX(r.nextInt(screenWidth - start_time.getWidth()));
start_time.setY(r.nextInt(screenHeight - start_time.getHeight()));
}
if (i == 4 ) {
start_time.setX(r.nextInt(screenWidth - start_time.getWidth()));
start_time.setY(r.nextInt(screenHeight - start_time.getHeight()));
}
if (i == 5 ) {
start_time.setX(r.nextInt(screenWidth - start_time.getWidth()));
start_time.setY(r.nextInt(screenHeight - start_time.getHeight()));
}
if (i == 6 ) {
start_time.setX(r.nextInt(screenWidth - start_time.getWidth()));
start_time.setY(r.nextInt(screenHeight - start_time.getHeight()));
}
else if (i == 7) {
long difference = SystemClock.elapsedRealtime() - startTime;
Intent intent = new Intent(Game.this, MainScreen.class);
intent.putExtra("time",difference);
// textview1.setText(intent.getStringExtra("time"));
// textview1.setText(String.valueOf(difference));
finish();
}
}
}
和主要活动:
public class MainScreen extends Activity implements OnClickListener {
Button btn_start;
TextView textview1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_screen);
btn_start = (Button) findViewById(R.id.btn_start);
btn_start.setOnClickListener(this);
textview1 = (TextView) findViewById(R.id.textView1);
}
@Override
public void onClick(View v) {
startActivityForResult(new Intent(this,Game.class), 0);
textview1.setText(getIntent().getStringExtra("time"));
}
}
logcat:
03-09 16:08:10.760: E/AndroidRuntime(6372): FATAL EXCEPTION: main
03-09 16:08:10.760: E/AndroidRuntime(6372): Process: ch.frozensparks.asdf, PID: 6372
03-09 16:08:10.760: E/AndroidRuntime(6372): java.lang.NullPointerException
03-09 16:08:10.760: E/AndroidRuntime(6372): at ch.frozensparks.bftjh.Game.onClick(Game.java:118)
03-09 16:08:10.760: E/AndroidRuntime(6372): at android.view.View.performClick(View.java:4470)
03-09 16:08:10.760: E/AndroidRuntime(6372): at android.view.View$PerformClick.run(View.java:18593)
03-09 16:08:10.760: E/AndroidRuntime(6372): at android.os.Handler.handleCallback(Handler.java:733)
03-09 16:08:10.760: E/AndroidRuntime(6372): at android.os.Handler.dispatchMessage(Handler.java:95)
03-09 16:08:10.760: E/AndroidRuntime(6372): at android.os.Looper.loop(Looper.java:157)
此行出现异常
textview1.setText(getIntent().getStringExtra("time"));
您正在尝试从当前 activity 获取 Intent,但在此处传递给新的 Intent 对象
Intent intent = new Intent(Game.this, MainScreen.class);
intent.putExtra("time",difference);
导航到游戏时,您需要完成主屏幕 Activity。 MainScreen.this.finish();在 MainScreen 的 onClick 方法中。
另外你需要在游戏的onclick中启动activity activity
startActivity(intent)
(首先,我假设 post 顶部的代码是 Game.class 的一部分。)
好的,我认为您误解了 intents 的运作方式。
Intent intent = new Intent(Game.this, MainScreen.class);
intent.putExtra("time", difference);
在这里您要创建一个新的意图(称为 'intent')并将值 'difference' 和键 'time' 放入其中。
然后
textview1.setText(getIntent().getStringExtra("time"));
您在此处尝试访问该值——但您实际上访问的是一个完全不同的意图对象。通过使用 getIntent(),您正在访问用于启动当前 activity 的意图对象,而不是您在其上方定义的对象。 (您还试图从意图中获取额外的 String,但您存储的是 long。)
如果您想访问该意图对象,只需使用:
intent.getStringExtra("time");
所以你的台词是:
textview1.setText(intent.getStringExtra("time"));
但我会这样做:
textview1.setText(String.valueOf(difference));
最后一件事,我无法确定您在顶部代码块中定义 textview1 的位置,但是如果您尝试引用作为 MainScreen 一部分的 textview1,这可能会导致您的问题,因此您可能必须将其设置为 public 或将差异变量传回并在 MainScreen 中设置文本。