尝试在空对象引用错误上调用虚方法?

时间:2016-01-28 23:40:33

标签: android nullpointerexception findviewbyid

我的程序打开一个登录页面,然后移动到一个带有两个按钮的页面(转到计数器并转到扫描条形码)。

此时非常基本,但我卡住了,因为我按了扫描条形码按钮,它移动到新页面很好,但是如果我按下'去反击'按钮(进入计时器类),程序崩溃 - 即使有一个类为它做的。

它给了我这个错误:

  

尝试调用虚方法' void android.widget.Button.setOnClickListener(android.view.View $ OnClickListener)'在null对象引用上。

这是我的代码

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class page1 extends AppCompatActivity implements View.OnClickListener {

Button scanner,go2count;

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

    scanner = (Button) findViewById(R.id.scanner);
    go2count = (Button) findViewById(R.id.go2count);

    scanner.setOnClickListener(this);
    go2count.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    switch(v.getId()){
        case R.id.scanner:
            startActivity(new Intent(this, ScanPage.class));
            break;

        case R.id.go2count:
            startActivity(new Intent(this, ChronoPage.class));
            break;
    }
}

所以,如果我按下扫描仪'按钮,它工作正常。但是,如果我按下' go2count'按钮,程序给我提到的错误。

这是天文台代码:

import android.os.Bundle;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Chronometer;
import android.widget.Button;

public class ChronoPage extends AppCompatActivity implements View.OnClickListener {

private Button start;
private Button stop;
private Button resume;
private Button reset;
private long time = 0;

private Chronometer myChrono;

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

public void uI(){
    start = (Button) findViewById(R.id.bStart);
    start.setOnClickListener(this);

    stop = (Button) findViewById(R.id.bStop);
    stop.setOnClickListener(this);

    resume = (Button) findViewById((R.id.bResume));
    resume.setOnClickListener(this);

    reset = (Button) findViewById(R.id.bReset);
    reset.setOnClickListener(this);

    myChrono = (Chronometer) findViewById(R.id.chronometer);
}

@Override
public void onClick(View v){
    if (v == start){
        myChrono.setBase(SystemClock.elapsedRealtime());
        myChrono.start();
    }
    else if (v == stop){
        time = SystemClock.elapsedRealtime();
        myChrono.stop();
       // printing();
    }
    else if (v == resume){
        myChrono.setBase(myChrono.getBase() + SystemClock.elapsedRealtime() - time);
        myChrono.start();
    }
    else if (v == reset){
        myChrono.setBase(SystemClock.elapsedRealtime());
    }
}

}

另一篇文章说试图取消选中"使用主机GPU"在AVD经理中,但也没有解决问题。 其他帖子具有相同的错误,但更具体到他们的代码。感谢所有帮助!

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_height="match_parent"
     android:padding="10dp"
     android:layout_width="match_parent">

<ImageView
     android:id="@+id/logo1"
     android:layout_marginTop="100dp"
     android:layout_width="150dp"
     android:layout_height="150dp"
     android:layout_gravity="center_horizontal"
     android:src="@drawable/swordlogocopy"/>

<Button
    android:id="@+id/scanner"
    android:text="Scan Barcode"
    android:textColor="#DDC004"
    android:background="#000000"
    android:layout_width="100dp"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"/>

<Button
    android:id="@+id/go2count"
    android:text="Go to counter"
    android:textColor="#DDC004"
    android:background="#000000"
    android:layout_width="100dp"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="30dp"
    android:layout_height="wrap_content" />

Chrono Page的XML布局:

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_height="match_parent"
     android:padding="10dp"
     android:layout_width="match_parent">

<ImageView
    android:id="@+id/logo1"
    android:layout_marginTop="100dp"
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_gravity="center_horizontal"
    android:src="@drawable/swordlogocopy"/>

<Chronometer
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:textColor="#000000"
    android:id="@+id/chronometer1" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/start"
    android:layout_gravity="center_horizontal"
    android:id="@+id/bStart"
    android:textColor="#DDC004"
    android:background="#000000"
    android:layout_marginTop="50dp"/>

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/stop"
    android:layout_gravity="center_horizontal"
    android:textColor="#DDC004"
    android:background="#000000"
    android:layout_marginTop="5dp"
    android:id="@+id/bStop" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/resume"
    android:layout_gravity="center_horizontal"
    android:textColor="#DDC004"
    android:background="#000000"
    android:layout_marginTop="5dp"
    android:id="@+id/bResume" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/reset"
    android:layout_gravity="center_horizontal"
    android:textColor="#DDC004"
    android:background="#000000"
    android:layout_marginTop="5dp"
    android:id="@+id/bReset" />

1 个答案:

答案 0 :(得分:0)

如果出现此错误,则很可能findViewById(id)未在xml中找到Button变量来设置相应的Button,因此返回null。尝试在此视图上设置OnClickListener时,会导致NullpointerException

检查所有Button ID是否有效