Xamarin.android c 中的“对象引用未设置为对象的实例”#

"Object reference not set to an instance of an object" in Xamarin.android c#

提问人:Vikesh Patil 提问时间:7/11/2019 更新时间:10/17/2019 访问量:11925

问:

我只是想用 Xamarin.android 从 https://learn.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.

我尝试将声明变量的值设置为 null。尝试使用空运算符。

这是我的代码

    {
        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;
        }
    }
C# Xamarin Xamarin.Android NullReferenceException

评论

1赞 TheGeneral 7/11/2019
你需要调试更多,它发生在哪条线上
1赞 Jason 7/11/2019
异常对象的堆栈跟踪应告诉您是哪一行导致了异常,或者您可以使用调试器单步执行代码,直到确定原因。这是基本的 c# 调试
0赞 Vikesh Patil 7/11/2019
调试在以下位置自动停止translateButton.Clicked += OnTranslate;
0赞 StackLloyd 7/11/2019
这不依赖于 Xamarin,你非常清楚地在对象上调用了某些内容。首先,您分配给了它,而不是实例。考虑先看一下基础知识nullnull

答:

2赞 Jason 7/11/2019 #1

调试在 translateButton.Clicked += 处自动停止 OnTranslate的;

这应该告诉你一些事情。在这里,您声明了一个按钮,但从不实例化它

Button translateButton = null;

因此,稍后当您尝试分配事件处理程序时,您的按钮仍为 null,这会导致异常

translateButton.Clicked += OnTranslate;

您需要先实例化按钮

translateButton = new Button();

评论

0赞 Vikesh Patil 7/11/2019
谢谢这解决了我的问题,但是当我单击该按钮时,我的方法仍然不起作用。我会看看我能做些什么。感谢您抽出宝贵时间接受采访。NullReferenceException