当前位置: 首页 > 知识库问答 >
问题:

为什么我的Android应用程序在类的开头用findViewById(R.id.*****)初始化变量时会因NullPointerException崩溃?

赵钊
2023-03-14

此代码(顶部的块已注释)成功运行:

public class MainActivity extends AppCompatActivity {

    /*
    EditText username = (EditText)findViewById(R.id.editText_Username);
    EditText password = (EditText)findViewById(R.id.editText_Password);
    TextView inputdata = (TextView)findViewById(R.id.textView_InputData);
    TextView welcome = (TextView)findViewById(R.id.textView_Welcome);
    Button login=(Button)findViewById(R.id.button_Login);
    Button anotherLogin=(Button)findViewById(R.id.button_Login_Another);
    */

    public void doLoginOnClick(View v)
    {
        String s1=username.getText().toString();
        inputdata.setText(s1);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton)findViewById(R.id.fab); 
        fab.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    } 
 
}

我试图捕获的组件ID使用

findViewById(R.id.**)

正如你所看到的,我在代码的开头将这段代码放在了注释中。

EditText username = (EditText)findViewById(R.id.editText_Username);
EditText password = (EditText)findViewById(R.id.editText_Password);
TextView inputdata = (TextView)findViewById(R.id.textView_InputData);
TextView welcome = (TextView)findViewById(R.id.textView_Welcome);
Button login=(Button)findViewById(R.id.button_Login);
Button anotherLogin=(Button)findViewById(R.id.button_Login_Another);

如果我删除上面的注释并运行它(在emulator和real device中),程序会立即崩溃,我很惊讶这里出了什么问题?

甚至我也试图使用构造函数初始化同样的事情。

但如果我把它放在onCreate()中,就不会崩溃了?为什么?

我试图获取用户名和密码的信息,并使用

EditText username = (EditText)findViewById(R.id.editText_Username);
EditText password = (EditText)findViewById(R.id.editText_Password);
TextView inputdata = (TextView)findViewById(R.id.textView_InputData);
inputdata.setText(username.getText.toString()+" "+password.getText.toString());

有更好或更简单的方法吗?

共有3个答案

王扬
2023-03-14

嘿,我看到你正在定义和初始化实例变量。我要做的是定义实例变量-EditText username,然后在onCreate方法中初始化它们-username=(EditText)findViewById(R.id.EditText_username)

不初始化实例变量的原因是,在onCreate方法中的setContentView之后,元素才准备就绪——我可能会有错误,但我的最佳做法是定义实例变量,然后在onCreate方法中初始化它们

魏襦宗
2023-03-14

添加此代码

 EditText username =  findViewById(R.id.editText_Username);
 EditText password = findViewById(R.id.editText_Password);
 TextView inputdata = findViewById(R.id.textView_InputData);
 TextView welcome = findViewById(R.id.textView_Welcome);
 Button login = findViewById(R.id.button_Login);
 Button anotherLogin = findViewById(R.id.button_Login_Another);

在里面

onCreate(); 

方法之后

setContentView(R.layout.activity_main);
爱繁
2023-03-14

实例成员变量在实例本身初始化时初始化。现在进行findViewById()

onCreate()之前,您的活动还没有内部需要的窗口。在setContentView()(您应该在onCreate()中调用)之前,也找不到任何视图。

因此,在onCreative()setContentView()之后初始化视图引用。

 类似资料:
  • 当我启动这个新游戏时,激活我的应用程序崩溃,但它只在我初始化

  • 我有一个应用程序崩溃的点:“New Downloader(this,mURL);”: 02-25 15:40:55.405 619-619/them.vertretungsplan e/androidruntime:致命异常:main java.lang.verifyerror:thems.vertretungsplan.downloader at thems.vertretungsplan.ve

  • 问题内容: 我在服务器上运行批处理作业时遇到问题,而在开发工作站上的Eclipse上运行良好。 我已经使用Roo设置了Spring环境,创建了一个实体,并进行了一些工作,并在我的develompent盒上对其进行了良好的测试。我初始化上下文并完成工作,但是当我在服务器上运行批处理时,上下文未正确初始化。这是代码: 这是日志和异常: 关于发生了什么任何想法或提示吗?我的类路径设置为$ PROJECT

  • 经过测试,它在非android程序上工作,但在android上初始化后立即崩溃。日志cat也没有生成任何错误消息。我从CircularFifoBuffer找到了这个。 编辑2: 08-05 21:12:48.837:I//system/bin/batteryd(1189):1566474 v_bat 3.678(3.677),i_supply 0.500,i_demand 0.282=>v_bat

  • 每当我请求权限时,我的应用程序就会崩溃。作为清单标记的子项,我在清单中定义了正确的使用权限。它没有给出任何错误,只是一个弹出窗口说包安装程序已经停止,监视器中有一行说“sendUserActionEvent()mView==null”,我不确定这与崩溃有关。 这是我请求权限的片段: 最低sdk设置为23,在三星Galaxy S7上进行测试。 你可以在这里看到完整的代码https://github.

  • 问题内容: 我有以下代码,试图在ListView中创建一个简单的ListAdapter(我之前曾使用过此代码,这是我更改过的唯一地方): 逐步执行时,什么都没有发生,但是在运行时,我得到NullPointerExceptionin ChoreoGrapher.doCallbacks,当我创建一个empty时ArrayList,它不会崩溃: 是什么ChoreoGrapher,为什么会导致我的应用崩溃