【问题标题】:Android Error: Attempt to invoke virtual... setOnClickListener(android.view.View$OnClickListener)' on a null object referenceAndroid 错误:尝试在空对象引用上调用虚拟... setOnClickListener(android.view.View$OnClickListener)'
【发布时间】:2016-06-08 23:06:18
【问题描述】:

我的应用程序关闭并出现错误。请帮忙。

活动类

public class MenuPrincipalActivity extends AppCompatActivity {

    SQLiteDatabase db;
    Button btcadastrar_ferramenta;
    Button btconsultar_ferramenta;
    Button btalterar_dados;
    Button btexcluir_ferramenta;



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

        btcadastrar_ferramenta = (Button)
                findViewById(R.id.btcadastrar_ferramenta);
        btalterar_dados = (Button)
                findViewById(R.id.btalterar_dados);
        btconsultar_ferramenta = (Button)
                findViewById(R.id.btconsultar_ferramenta) ;
        btexcluir_ferramenta = (Button) findViewById(R.id.btexcluir_ferramenta);
        btcadastrar_ferramenta.setOnClickListener ( new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                Intent cadastrarFerramentaActivity = new
                        Intent(MenuPrincipalActivity.this, CadastrarFerramentasActivity.class
                );
                MenuPrincipalActivity.this.startActivity
                        (cadastrarFerramentaActivity);
                btalterar_dados.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View arg0) {
                        Intent consultaFerramentaActivity = new
                                Intent(MenuPrincipalActivity.this,
                                BuscaFerramentasActivity.class);
                        consultaFerramentaActivity.putExtra("opcao_dados", 1);

                        MenuPrincipalActivity.this.startActivity(consultaFerramentaActivity);
                    }
                });


                btconsultar_ferramenta.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View arg0) {
                        Intent consultaFerramentaActivity = new
                                Intent(MenuPrincipalActivity.this, BuscaFerramentasActivity.class);
                        consultaFerramentaActivity.putExtra("opcao_dados", 2);
                        MenuPrincipalActivity.this.startActivity(consultaFerramentaActivity);
                    }
                });
                btexcluir_ferramenta.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View argO) {
                        Intent consultaFerramentaActivity = new
                                Intent(MenuPrincipalActivity.this, BuscaFerramentasActivity.class);
                        consultaFerramentaActivity.putExtra("opcao_dados", 3);
                        MenuPrincipalActivity.this.startActivity(consultaFerramentaActivity);
                    }
                });
                try {
                    db = openOrCreateDatabase("banco_dados", Context.MODE_PRIVATE, null);
                    db.execSQL("create table if not exists  " + "ferramentas(numreg integer primary key " +
                            "autoincrement, nome_ferramenta text not null," +
                            "fabricante text not null, " + "preco float not null," +
                            "cor text not null, referencia text not null)");
                } catch (Exception e) {
                    MostraMensagem("Erro" + e.toString());
                }
            }

            public void MostraMensagem(String str) {
                AlertDialog.Builder dialogo = new AlertDialog.Builder(MenuPrincipalActivity.this);
                dialogo.setTitle("Aviso");
                dialogo.setMessage(str);
                dialogo.setNeutralButton("OK", null);
                dialogo.show();
            }

        } );}}

CadastrarFerramentasActivity 类

public class CadastrarFerramentasActivity extends Activity {

    EditText ednome_ferramenta, edfabricante, edpreco, edcor, edreferencia;

    Button btcadastrar, btfechar;

    SQLiteDatabase db;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cadastrar_ferramentas);
        ednome_ferramenta= (EditText)
                findViewById(R.id. ednome_ferramenta);
        edfabricante = (EditText) findViewById(R. id .edfabricante);
        edpreco = (EditText) findViewById(R. id . edpreco);
        edcor = (EditText) findViewById(R. id.edcor);
        edreferencia = (EditText) findViewById(R. id .edreferencia);
        btcadastrar = (Button) findViewById(R.id.btcadastrar_ferramenta);
        btcadastrar .setOnClickListener(new View.OnClickListener() {

            @Override public void onClick(View view) {
                String nome_ferramenta = ednome_ferramenta. getText( ) . toString() ;
                String fabricante = edfabricante.getText() .toString();
                String preco = edpreco.getText() .toString() ;
                String cor = edcor.getText() .toString();
                String referencia = edreferencia.getText() . toString();
                ContentValues valor = new ContentValues();
                valor. put ( "nome_ferramenta " , nome_ferramenta);
                valor. put ( "fabricante " , fabricante);
                valor. put ( "preco " , Float . parseFloat(preco));
                valor. put ("cor", cor) ;
                valor. put ( " referencia " , referencia) ;
                db. insert ( "ferramentas " , null, valor);
                AlertDialog.Builder dialogo = new
                        AlertDialog.Builder  (CadastrarFerramentasActivity. this) ;
                dialogo. setTitle( "Aviso");
                dialogo. setMessage( "Dados cadastrados com sucesso! " ) ;
                dialogo. setNeutralButton( "OK" , new DialogInterface.OnClickListener() {
                    @Override  public void onClick(DialogInterface argO, int argl) {
                                CadastrarFerramentasActivity.this.finish();
                            }});
                                dialogo. show( ) ;

                            }

    });
        btfechar = (Button) findViewById(R. id .btfechar); btfechar. setOnClickListener(new View. OnClickListener() {
            @Override
            public void onClick(View argO) {
                CadastrarFerramentasActivity.this.finish();
            }});
                try {
                    db = openOrCreateDatabase("banco_dados",
                            Context.MODE_PRIVATE, null);
                } catch (Exception e) {
                    MostraMensagem("Erro" + e.toString());
                }
            }

            public void MostraMensagem(String str) {
                AlertDialog.Builder dialogo = new AlertDialog.Builder(CadastrarFerramentasActivity.this);
                dialogo.setTitle("Aviso");
                dialogo.setMessage(str);
                dialogo.setNeutralButton("OK ", null);
                dialogo.show();
            }
        }

给出的错误是这样的:

06-08 20:09:46.136 6894-6894/com.example.iohananabc.ferramentas E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.iohananabc.ferramentas, PID: 6894
     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.iohananabc.ferramentas/com.example.iohananabc.ferramentas.CadastrarFerramentasActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
         at android.app.ActivityThread.access$800(ActivityThread.java:144)
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
         at android.os.Handler.dispatchMessage(Handler.java:102)
         at android.os.Looper.loop(Looper.java:135)
         at android.app.ActivityThread.main(ActivityThread.java:5221)
         at java.lang.reflect.Method.invoke(Native Method)
         at java.lang.reflect.Method.invoke(Method.java:372)
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
         at com.example.iohananabc.ferramentas.CadastrarFerramentasActivity.onCreate(CadastrarFerramentasActivity.java:33)
         at android.app.Activity.performCreate(Activity.java:5937)
         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
         at android.app.ActivityThread.access$800(ActivityThread.java:144) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
         at android.os.Handler.dispatchMessage(Handler.java:102) 
         at android.os.Looper.loop(Looper.java:135) 
         at android.app.ActivityThread.main(ActivityThread.java:5221) 
         at java.lang.reflect.Method.invoke(Native Method)

【问题讨论】:

  • 代码中的哪一行发生了这个错误?请发布完整的 logcat。
  • 您是否还可以包含CadastrarFerramentasActivity 活动的布局xml 文件?这可能是因为您在findViewById() 中为btcadastrar 使用的id。您可能指的布局不同。
  • 似乎这是有问题的按钮:btcadastrar .setOnClickListener。检查您用于findViewById 的ID。
  • CadastrarFerramentasActivity.onCreate 第 33 行有什么内容?
  • 第 33 行是:btcadastrar .setOnClickListener(new View.OnClickListener

标签: java android android-layout nullpointerexception


【解决方案1】:

Pelo nome das classes acredito que você fale português, então o motivo é que um dos comandos findViewById() deve estar retornando nulo ou o cast está dando errado, então verifique se no arquivo de layout as ids dos botões estão corretas。

如果您不会说葡萄牙语。发生的事情是 findViewById() 命令之一返回 null 或强制转换操作失败。所以你要做的是检查你的布局文件,看看按钮的 id 是否设置正确;

【讨论】:

    【解决方案2】:

    自从我要求 xml 布局以来已经有一段时间了,但仍未发布,我将继续发布我的分析作为答案。

    在您的错误日志中,它指向一个setOnClickListener(),在您的CadastrarFerramentasActivity 中有一个NPE,并且根据您提供的代码sn-p,唯一调用它的是btfechar.setOnClickListener

    关于为什么会发生这种情况的一种解释是因为您的findViewId() 引用了一个不在您设置的活动布局(即R.layout.activity_cadastrar_ferramentas)中的id(在您的代码中使用R.id.btfechar)。

    请检查您的布局 xml 文件,并告诉我会发生什么(最好更新您的帖子)。

    干杯!

    【讨论】:

      猜你喜欢
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-11
      • 2016-11-19
      相关资源
      最近更新 更多