Почему возникает ошибка при попытке вызвать метод 'void android.widget.Button.setVisibility(int)', если объект равен null?

Здравствуйте! У меня возникла проблема: когда я добавляю в код строку `<br/> driverRegBtn.setVisibility(View.INVISIBLE);`, приложение вылетает при переходе в этот активити. Я перепробовал множество вариантов, но не могу понять, в чем конкретно ошибка. Хотелось бы получить вашу помощь. 

Вот код активити: 
<pre><code class="java">package com.example.a9station;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class DriverRegLoginActivity extends AppCompatActivity {
    Button signInBtn, driverRegBtn;
    TextView statusDriver, quest;
    EditText driverEmail, driverPassword;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        driverRegBtn = findViewById(R.id.driverReg);
        quest = findViewById(R.id.quest);
        driverEmail = findViewById(R.id.driverEmail);
        driverPassword = findViewById(R.id.driverPassword);
        signInBtn = findViewById(R.id.signIn);
        statusDriver = findViewById(R.id.statusDriver);

        driverRegBtn.setVisibility(View.INVISIBLE);


        //driverRegBtn.setEnabled(false);

       /* quest.setOnClickListener(v -&gt;
        {
           driverRegBtn.setVisibility(View.VISIBLE);
            driverRegBtn.setEnabled(true);

            signInBtn.setVisibility(View.INVISIBLE);
  • 29 января 2025 г. 11:54
Ответы на вопрос 2
Здравствуйте! Ошибка, с которой вы сталкиваетесь, возникает из-за того, что вы пытаетесь вызвать метод `setVisibility(int)` на объекте `driverRegBtn`, который равен `null`. Это происходит потому, что перед вызовом метода вы не инициализировали `driverRegBtn` с помощью `findViewById`.

Проблема может заключаться в том, что вы вызываете `findViewById` до того, как привязали макет вашего активити. Вам необходимо убедиться, что вы установили макет с помощью метода `setContentView()` перед вызовом `findViewById()` для получения ссылок на элементы интерфейса.

Вот шаги, которые нужно предпринять для решения проблемы:

1. Убедитесь, что в вашем проекте существует XML-макет, содержащий элемент `Button` с идентификатором `driverReg`.
2. Перед вызовом `findViewById()` вызовите `setContentView()` с вашим макетом.

Ваш код должен выглядеть примерно так:

```java
package com.example.a9station;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class DriverRegLoginActivity extends AppCompatActivity {
    Button signInBtn, driverRegBtn;
    TextView statusDriver, quest;
    EditText driverEmail, driverPassword;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Устанавливаем макет для активити
        setContentView(R.layout.activity_driver_reg_login); // Укажите ваш XML-файл макета

        // Инициализируем элементы интерфейса
        driverRegBtn = findViewById(R.id.driverReg);
        quest = findViewById(R.id.quest);
        driverEmail = findViewById(R.id.driverEmail);
        driverPassword = findViewById(R.id.driverPassword);
        signInBtn = findViewById(R.id.signIn);
        statusDriver = findViewById(R.id.statusDriver);

        // Устанавливаем видимость кнопки
        driverRegBtn.setVisibility(View.INVISIBLE);

        // Остальной код...
    }
}
```

Не забудьте заменить `R.layout.activity_driver_reg_login` на имя вашего XML-файла макета, если оно у вас другое. Также убедитесь, что идентификаторы всех элементов в XML-файле совпадают с теми, что вы используете в Java-коде. 

После этих изменений ошибка должна исчезнуть. Если она все равно появляется, проверьте лог (Logcat) на предмет дополнительных сообщений об ошибках или предупреждений.
Ошибка возникает из-за того, что вы пытаетесь получить доступ к элементам интерфейса через findViewById() до установки макета активности с помощью setContentView(). В результате переменные driverRegBtn, quest и другие остаются null, и попытка вызвать методы на этих объектах приводит к крашу. 

Исправьте порядок вызовов в onCreate():
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 1. Сначала устанавливаем макет
    setContentView(R.layout.activity_driver_reg_login);
    
    // 2. Теперь инициализируем элементы интерфейса
    driverRegBtn = findViewById(R.id.driverReg);
    quest = findViewById(R.id.quest);
    driverEmail = findViewById(R.id.driverEmail);
    driverPassword = findViewById(R.id.driverPassword);
    signInBtn = findViewById(R.id.signIn);
    statusDriver = findViewById(R.id.statusDriver);
    
    // 3. Теперь можем работать с элементами
    driverRegBtn.setVisibility(View.INVISIBLE);
    
    // Остальной код (EdgeToEdge и т.д.)
    EdgeToEdge.enable(this);
    ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
        Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
        v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
        return insets;
    });
}


Убедитесь, что в вашем XML есть все указанные элементы с правильными android:id.

Для элементов, которые могут быть скрыты/показаны, проверьте начальное состояние видимости в XML (например, android:visibility).

Используйте аннотацию @Nullable или @NonNull для переменных представлений, чтобы получить подсказки от Android Studio.
Похожие вопросы