Member 13121956 Ответов: 1

Как обрабатывать необработанное исключение (nullexception) в обработчиках кнопок в xamarin. android


Я делал образец android-приложения для тестирования, и ошибка при создании обработчика кнопок выглядит следующим образом, хотя моя сборка прошла успешно.

Пожалуйста помочь

Ошибка: необработанное исключение: System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта. произошло

Код выглядит следующим образом:

using Android.App;
using Android.Widget;
using Android.OS;

namespace Android_Picture
{
[Activity(Label = "Android Picture", MainLauncher = true, Icon = 
"@drawable/icon")]
public class MainActivity : Activity
{
    Button ButtonPrev;
    Button ButtonNext;
    TextView TextTitle;
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        // Set our view from the "main" layout resource
        // SetContentView (Resource.Layout.Main);

        ButtonPrev = FindViewById<Button>(Resource.Id.buttonPrev);
        ButtonNext = FindViewById<Button>(Resource.Id.buttonNext);
        TextTitle = FindViewById<TextView>(Resource.Id.textTitle);

        ButtonPrev.Click += ButtonPrev_Click; //error
        ButtonNext.Click += ButtonNext_Click;
    }

    private void ButtonNext_Click(object sender, System.EventArgs e)
    {
        TextTitle.Text = "Next Clicked";
        //throw new System.NotImplementedException();
    }

    private void ButtonPrev_Click(object sender, System.EventArgs e)
    {
        TextTitle.Text = "Previous Clicked";
        //throw new System.NotImplementedException();
    }
}
}




Для Меня Главным.axml выглядит следующим образом:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
    android:text="Prev"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/buttonPrev"
    android:layout_alignParentBottom="true" />
<Button
    android:text="Next"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/buttonNext"
    android:layout_alignParentRight="true"
    android:layout_alignParentBottom="true" />
<TextView
    android:text="Medium Text"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/textTitle"
    android:layout_centerHorizontal="true"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="150dp" />
</RelativeLayout>


Что я уже пробовал:

Я попробовал раскомментировать строку

SetContentView (Resource.Layout.Main);


Но все равно получаю эту ошибку

Пожалуйста, помогите!!!

Richard Deeming

Сообщение об ошибке довольно очевидно: вы пытаетесь изменить переменную, которая null.

Это означает, что FindViewById<Button>(Resource.Id.buttonPrev) ответный звонок null почему-то.

Чтобы избежать ошибки, проверьте, является ли кнопка null прежде чем пытаться присоединить обработчик событий.

Чтобы решить эту проблему, отладьте свой код и выясните, почему кнопка не найдена.

Afzaal Ahmad Zeeshan

Поскольку он намеренно спрятал кнопку, его макет был закомментирован в коде, которым он поделился. Вот почему кнопка так и не была надута и не найдена; Смотрите также мой ответ.

1 Ответов

Рейтинг:
0

Afzaal Ahmad Zeeshan

Хотя для обработки ошибок вам нужно будет использовать try...catch блок, тогда как в этом случае это был бы if...else блок для использования.

ButtonPrev = FindViewById<Button>(Resource.Id.buttonPrev);
ButtonNext = FindViewById<Button>(Resource.Id.buttonNext);
TextTitle = FindViewById<TextView>(Resource.Id.textTitle);

if(ButtonPrev != null) {
   ButtonPrev.Click += ButtonPrev_Click; // Would only execute, if not null.
}

// Same here.
// ButtonNext.Click += ButtonNext_Click;

Таким образом, вы убедитесь, что обработчики событий связаны только в том случае, если объекты существуют, потому что если кнопки не существуют — для этого есть несколько причин, таких как неправильный идентификатор, кнопки недоступны в текущем макете, проблема с раздуванием макета, идентификатор отличается и т. д. — Вам даже не нужно реализовывать на них какой-либо обработчик. Это также гарантировало бы, что ошибки не будут подняты.

Главная ошибка

В то время как основная проблема в вашем коде заключается в том, что вы закомментировали макет; если макет включен и кнопка существует, то нет никакого способа, чтобы кнопка оказалась нулевой. Где, как и в вашем коде, вы намеренно сделали это.
// SetContentView (Resource.Layout.Main);

Раскомментируйте эту строку, и она будет работать.