Как найти метод, который выбрасывает «NullReferenceException:« Ссылка на объект не установлена ​​на экземпляр объекта »? - PullRequest
1 голос
/ 06 ноября 2019

Я уже проверил все подобные вопросы на Stackoverflow. Никто из них не отвечает и не задает один и тот же вопрос.

Есть ли способ найти метод, который пытается ссылаться на указанный нулевой объект?

Exception popup

Iпонять, что он не может сказать, какой объект, поскольку он не знает, однако он должен знать, какой метод пытается использовать нулевую ссылку, но не показывает его. В режиме отладки на экране кода отображается:

«Ваше приложение вошло в состояние прерывания, но нет кода, который можно отобразить, поскольку все потоки выполняли внешний код (обычно системный или структурный код).»

Я нажал «Продолжить выполнение», чтобы прочитать вывод и найти его оттуда, однако в выводе не было ничего релевантного:

**System.NullReferenceException:** 'Loading...'

Thread finished: <Thread Pool> #4
The thread 0x4 has exited with code 0 (0x0).
Thread finished: <Thread Pool> #5
The thread 0x5 has exited with code 0 (0x0).
Thread finished: <Thread Pool> #2
The thread 0x2 has exited with code 0 (0x0).
Thread finished: <Thread Pool> #3
The thread 0x3 has exited with code 0 (0x0).
Thread finished: <Thread Pool> #6
The thread 0x6 has exited with code 0 (0x0).
Thread started: <Thread Pool> #7
Thread started: <Thread Pool> #8
Thread started: <Thread Pool> #9
11-06 14:17:23.932 D/Mono    ( 5445): DllImport attempting to load: '/system/lib/liblog.so'.
11-06 14:17:23.933 D/Mono    ( 5445): DllImport loaded library '/system/lib/liblog.so'.
11-06 14:17:23.933 D/Mono    ( 5445): DllImport searching in: '/system/lib/liblog.so' ('/system/lib/liblog.so').
11-06 14:17:23.933 D/Mono    ( 5445): Searching for '__android_log_print'.
11-06 14:17:23.933 D/Mono    ( 5445): Probing '__android_log_print'.
11-06 14:17:23.933 D/Mono    ( 5445): Found as '__android_log_print'.
11-06 14:17:23.936 I/MonoDroid( 5445): UNHANDLED EXCEPTION:
11-06 14:17:23.938 I/MonoDroid( 5445): System.NullReferenceException: Object reference not set to an instance of an object.
11-06 14:17:23.938 I/MonoDroid( 5445):   at Xamarin.Forms.Grid.NumberOfUnsetRowHeight (Xamarin.Forms.BindableObject child) [0x00014] in D:\a\1\s\Xamarin.Forms.Core\GridCalc.cs:627 
11-06 14:17:23.938 I/MonoDroid( 5445):   at Xamarin.Forms.Grid.MeasureStarredRows () [0x0007b] in D:\a\1\s\Xamarin.Forms.Core\GridCalc.cs:545 
11-06 14:17:23.938 I/MonoDroid( 5445):   at Xamarin.Forms.Grid.MeasureAndContractStarredRows (System.Double width, System.Double height, System.Double totalStarsHeight) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\GridCalc.cs:405 
11-06 14:17:23.938 I/MonoDroid( 5445):   at Xamarin.Forms.Grid.MeasureGrid (System.Double width, System.Double height, System.Boolean requestSize) [0x00117] in D:\a\1\s\Xamarin.Forms.Core\GridCalc.cs:512 
11-06 14:17:23.938 I/MonoDroid( 5445):   at Xamarin.Forms.Grid.OnSizeRequest (System.Double widthConstraint, System.Double heightConstraint) [0x0002a] in D:\a\1\s\Xamarin.Forms.Core\GridCalc.cs:60 
11-06 14:17:23.938 I/MonoDroid( 5445):   at Xamarin.Forms.VisualElement.OnMeasure (System.Double widthConstraint, System.Double heightConstraint) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\VisualElement.cs:762 
11-06 14:17:23.938 I/MonoDroid( 5445):   at Xamarin.Forms.VisualElement.GetSizeRequest (System.Double widthConstraint, System.Double heightConstraint) [0x00053] in D:\a\1\s\Xamarin.Forms.Core\VisualElement.cs:644 
11-06 14:17:23.939 I/MonoDroid( 5445):   at Xamarin.Forms.Layout.GetSizeRequest (System.Double widthConstraint, System.Double heightConstraint) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\Layout.cs:132 
11-06 14:17:23.939 I/MonoDroid( 5445):   at Xamarin.Forms.VisualElement.Measure (System.Double widthConstraint, System.Double heightConstraint, Xamarin.Forms.MeasureFlags flags) [0x00054] in D:\a\1\s\Xamarin.Forms.Core\VisualElement.cs:702 
11-06 14:17:23.939 I/MonoDroid( 5445):   at Xamarin.Forms.StackLayout.CalculateNaiveLayout (Xamarin.Forms.StackLayout+LayoutInformation layout, Xamarin.Forms.StackOrientation orientation, System.Double x, System.Double y, System.Double widthConstraint, System.Double heightConstraint) [0x000a8] in D:\a\1\s\Xamarin.Forms.Core\StackLayout.cs:163 
11-06 14:17:23.939 I/MonoDroid( 5445):   at Xamarin.Forms.StackLayout.CalculateLayout (Xamarin.Forms.StackLayout+LayoutInformation layout, System.Double x, System.Double y, System.Double widthConstraint, System.Double heightConstraint, System.Boolean processExpanders) [0x00058] in D:\a\1\s\Xamarin.Forms.Core\StackLayout.cs:123 
11-06 14:17:23.939 I/MonoDroid( 5445):   at Xamarin.Forms.StackLayout.LayoutChildren (System.Double x, System.Double y, System.Double width, System.Double height) [0x0004e] in D:\a\1\s\Xamarin.Forms.Core\StackLayout.cs:58 
11-06 14:17:23.939 I/MonoDroid( 5445):   at Xamarin.Forms.Layout.UpdateChildrenLayout () [0x00158] in D:\a\1\s\Xamarin.Forms.Core\Layout.cs:266 
11-06 14:17:23.939 I/MonoDroid( 5445):   at Xamarin.Forms.Layout.OnSizeAllocated (System.Double width, System.Double height) [0x0000f] in D:\a\1\s\Xamarin.Forms.Core\Layout.cs:224 
11-06 14:17:23.939 I/MonoDroid( 5445):   at Xamarin.Forms.VisualElement.SizeAllocated (System.Double width, System.Double height) [0x00000] in D:\a\1\s\Xamarin.Forms.Core\VisualElement.cs:784 
11-06 14:17:23.939 I/MonoDroid( 5445):   at Xamarin.Forms.Layout.ForceLayout () [0x00000] in D:\a\1\s\Xamarin.Forms.Core\Layout.cs:125 
11-06 14:17:23.939 I/MonoDroid( 5445):   at Xamarin.Forms.Platform.Android.ViewCellRenderer+ViewCellContainer.Update (Xamarin.Forms.ViewCell cell) [0x00185] in D:\a\1\s\Xamarin.Forms.Platform.Android\Cells\ViewCellRenderer.cs:178 
11-06 14:17:23.939 I/MonoDroid( 5445):   at Xamarin.Forms.Platform.Android.ViewCellRenderer.GetCellCore (Xamarin.Forms.Cell item, Android.Views.View convertView, Android.Views.ViewGroup parent, Android.Content.Context context) [0x00027] in D:\a\1\s\Xamarin.Forms.Platform.Android\Cells\ViewCellRenderer.cs:21 
11-06 14:17:23.939 I/MonoDroid( 5445):   at Xamarin.Forms.Platform.Android.CellRenderer.GetCell (Xamarin.Forms.Cell item, Android.Views.View convertView, Android.Views.ViewGroup parent, Android.Content.Context context) [0x00075] in D:\a\1\s\Xamarin.Forms.Platform.Android\Cells\CellRenderer.cs:51 
11-06 14:17:23.939 I/MonoDroid( 5445):   at Xamarin.Forms.Platform.Android.CellFactory.GetCell (Xamarin.Forms.Cell item, Android.Views.View convertView, Android.Views.ViewGroup parent, Android.Content.Context context, Xamarin.Forms.View view) [0x0001e] in D:\a\1\s\Xamarin.Forms.Platform.Android\Cells\CellFactory.cs:20 
11-06 14:17:23.939 I/MonoDroid( 5445):   at Xamarin.Forms.Platform.Android.ListViewAdapter.GetView (System.Int32 position, Android.Views.View convertView, Android.Views.ViewGroup parent) [0x00200] in D:\a\1\s\Xamarin.Forms.Platform.Android\Renderers\ListViewAdapter.cs:299 
11-06 14:17:23.939 I/MonoDroid( 5445):   at Android.Widget.BaseAdapter.n_GetView_ILandroid_view_View_Landroid_view_ViewGroup_ (System.IntPtr jnienv, System.IntPtr native__this, System.Int32 position, System.IntPtr native_convertView, System.IntPtr native_parent) [0x0001a] in <11a340ccc8de43f09c97400139266ef5>:0 
11-06 14:17:23.939 I/MonoDroid( 5445):   at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.68(intptr,intptr,int,intptr,intptr)
11-06 14:17:23.950 W/.TheStylingRoo( 5445): JNI RegisterNativeMethods: attempt to register 0 native methods for android.runtime.JavaProxyThrowable
11-06 14:17:23.954 D/Mono    ( 5445): DllImport searching in: '__Internal' ('(null)').
11-06 14:17:23.955 D/Mono    ( 5445): Searching for 'java_interop_jnienv_throw'.
11-06 14:17:23.955 D/Mono    ( 5445): Probing 'java_interop_jnienv_throw'.
11-06 14:17:23.955 D/Mono    ( 5445): Found as 'java_interop_jnienv_throw'.
**System.NullReferenceException:** 'Object reference not set to an instance of an object.'

Этот выводит меня в тупик. Исключение срабатывает при попытке загрузить страницу, которая отображает список клиентов, и другую, которая загружает бронирования. Обратите внимание, что стартовая страница имеет ту же логику для загрузки списка текущих бронирований и работает нормально.

Я проанализировал каждый связанный вопрос и попробовал следующие решения:

  • Шаг за шагомкод. Он запускается в конце любого из двухстраничных конструкторов, не включая конструктор стартовой страницы. Все методы внутри этих конструкторов выполняются нормально.
  • Ищем нули. Никакие объекты или свойства не имеют нулевого значения.
  • Комментирование, попробуйте перехватить и если! Ни один из этих трех не исключает исключения.
  • Воссоздание событий xaml. Я был уверен, что это так, но нет.
  • Глядя на детали исключения. Всплывающее окно «Исключение» не содержит никаких сведений.
  • Изменение асинхронных методов. Представление при запуске, которое отображает бронирования, является практически копией, включая асинхронные методы. Работает нормально.
  • Удаление привязок.
  • Очистка, восстановление, сброс настроек эмулятора Android до заводских настроек. В разном порядке
  • Перезапуск Visual Studio
  • Удаление папки bin и перезагрузка

Соответствующий код:

MainPage.xaml.cs (Только событиезагружает ClientsPage)

private async void Button_Clicked(object sender, EventArgs e)
        {
            try
            {
                await Navigation.PushAsync(new Clients_Page());
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex);
            }
        }

Clients_Page.xaml.cs (только конструктор)

public partial class Clients_Page : ContentPage
    {
        public Clients_Page()
        {
            InitializeComponent();
            Clients_ViewModel viewModel = new Clients_ViewModel();
            viewModel.LoadClients(); 
            BindingContext = viewModel;
// Commenting all but InitializeComponent (Including Bindings in xaml) has no effect, so the ViewModel is not to blame
        } // EXCEPTION FIRES AFTER THIS LINE

Clients_ViewModel.cs

class Clients_ViewModel : INotifyPropertyChanged
    {
        //PROPERTIES_________________________________________________________
        public event PropertyChangedEventHandler PropertyChanged;
        private IRepository database { get; }
        private ObservableCollection<Client> clients;
        public ObservableCollection<Client> Clients
        {
            get { return clients; }
            set
            {
                if (value != clients)
                {
                    clients = value;
                    if (PropertyChanged != null)
                    {
                        NotifyPropertyChanged("Clients");
                    }
                }
            }
        }

        public async void LoadClients()
        {
                Clients = new ObservableCollection<Client>(await database.GetAllClients());

        }

        private void NotifyPropertyChanged(String propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (null != handler)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public Clients_ViewModel()
        {
            database = App.Database_IRepository;
        }

    }//endclass
}//endnamespace

Repository.cs (Justзадача GetAllClients)

        public async Task<List<Client>> GetAllClients()
        {
            return await database.Table<Client>().OrderBy(c => c.FirstName).ToListAsync();
        }

Xaml - это просто ListView, использующий ItemsSource = "{Binding Clients}" с ViewCell, использующим Text = "{Binding FirstName}"

Я опытный сотладка, и было бы весело найти метод с нулевой ссылкой на объект. Мне просто нужно знать, как заставить отладчик выявлять указанный метод.

ОБНОВЛЕНИЕ 1: Исключение срабатывает, даже когда все привязки в xaml удалены и вызов модели представления удален. Также я попытался прокомментировать весь Clients_Page.xaml, кроме ContentPage и основной сетки, и ошибка все еще срабатывает. Так что это не может быть ViewModel или xaml

ОБНОВЛЕНИЕ 2: ошибка возникает даже при изменении события щелчка для перехода на новую новую страницу

1 Ответ

0 голосов
/ 06 ноября 2019

решено

Мне пришлось удалить NavigationPage.SetHasNavigationBar (this, false);из конструктора Main_Page.xaml.cs (полный блок показан ниже)

public Main_Page()
        {
            InitializeComponent();
            //NavigationPage.SetHasNavigationBar(this, false);
            Main_ViewModel viewModel = new Main_ViewModel();
            viewModel.LoadCurrentBookings();
            BindingContext = viewModel;
        }

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

...