«Ссылка на объект не установлена ​​для экземпляра объекта» в Xamarin.android c # - PullRequest
0 голосов
/ 11 июля 2019

Я просто пытался создать простое приложение с Xamarin.android из показанного учебника https://docs.microsoft.com/en-us/learn/modules/create-a-mobile-app-with-xamarin-forms/5-exercise-create-phone-number-translator-app Но когда я его собираю, приложение вылетает.Я попытался отладить и получил ошибку в методе OnTranslate как System.NullReferenceException: Object reference not set to an instance of an object.

Я попытался установить значения объявленных переменных как нулевые.Попытка использования нулевого оператора.

Это мой код

    {
        Entry phoneNumberText = null;
        Button translateButton = null;
        Button callButton = null;
        string translatedNumber;
        public MainPage()
        {
           /*
               Some design code
           */
            translateButton.Clicked += OnTranslate;
            this.Content = panel;
        }

         void OnTranslate(object sender, EventArgs e)
        {
            string enterednum = phoneNumberText.Text;
            translatedNumber = Core.PhonewordTranslator.ToNumber(enterednum);

            if (!string.IsNullOrEmpty(translatedNumber))
            {
                callButton.IsEnabled = true;
                callButton.Text = "Call" + translatedNumber;
            }
            else
            {
                callButton.IsEnabled = false;
                callButton.Text = "Call";
            }
        }

Я установил значения для ввода и эти две кнопки в моем коде дизайна.И это метод перевода строки в число

        {
            if (string.IsNullOrWhiteSpace(raw))
                return null;
            raw = raw?.ToUpperInvariant();
            var newNumber = new StringBuilder();

            foreach (var c in raw)
            {
                if (" -0123456789".Contains(c))
                    newNumber?.Append(c);
                else
                {
                    var result = TranslateToNumber(c);
                    if (result != null)
                        newNumber.Append(result);
                    //bad string?
                    else return null;
                }
            }
            return newNumber?.ToString();
        }

        static bool Contains(this string keystring, char c){
            return keystring?.IndexOf(c) >= 0;
            }

        static readonly string[] digits =
        {
            "ABC", "DEF", "GHI", "JKL", "MNO", "PQRS", "TUV", "WXYZ"
        };
        static int? TranslateToNumber(char c)
        {
            for(int i = 0; i<digits.Length; i++)
            {
                if (digits[i].Contains(c))
                    return 2 + i;
            }
            return null;
        }
    }

1 Ответ

2 голосов
/ 11 июля 2019

отладка останавливается автоматически при translateButton.Clicked + = OnTranslate;

это должно вам кое-что сказать. Здесь вы объявляете кнопку, но никогда не создаете ее экземпляр

Button translateButton = null;

поэтому позже, когда вы попытаетесь назначить обработчик события, ваша кнопка будет по-прежнему нулевой, что вызывает исключение

translateButton.Clicked += OnTranslate;

сначала нужно создать экземпляр кнопки

translateButton = new Button();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...