NullReferenceExceptions kopējie cēloņi MVVMCROSS
NullReferenceExceptions MVVMCross var rasties no vairākiem kopīgiem scenārijiem, kas bieži ir saistīti ar to, kā ietvars apstrādā objekta atsauces un iesiešanas. Šeit ir daži detalizēti šo cēloņu skaidrojumi:
1. Neinicializēti objekti vai īpašības **
Viens no visbiežāk sastopamajiem NullReferenceExceptions cēloņiem ir mēģināt piekļūt inicializēto objektu īpašībām vai metodēm. MVVMCROSS tas var notikt, ja pirms mēģinājuma sasaistīt ar skatu nav pareizi iestatīts skatsModelis vai tajā esošais īpašums. Piemēram, ja ViewModel īpašums netiek inicializēts pirms iesiešanas, piekļuve šim īpašumam izmetīs NullReferenceException.
2. Nepareiza IOK reģistrācija **
MVVMCROSS lielā mērā paļaujas uz atkarības injekciju caur tā SOK (kontroles inversijas) konteineru. Ja komponenti nav pareizi reģistrēti SOK konteinerā, tos var pareizi atrisināt, izraisot atsauces uz nulli. Tas ir īpaši svarīgi, izmantojot platformas specifiskas reģistrācijas, kā redzams iestatīšanas klases metodē “InitiZelastChance”. Nemaz saukt bāzes klases metodi “IniciizelastChance” var radīt problēmas noteiktās platformās, piemēram, MonoTouch [1].
3. Iesiešanas konteksts nav pilnībā iestatīts **
MVVMCROSS pirms iesiešanas uzklāšanas ir pilnībā jāiestata saistošais konteksts. Ja saistošais konteksts nav pareizi inicializēts, mēģinājums saistīt skatus, lai skatītu modeļus, var izraisīt NullReferenceException. Tas jo īpaši attiecas uz skatiem programmatiski, neizmantojot XIB failus [1].
4. mvx.iocprovider ir nulle **
Veidot tādas komandas kā `mvxasynccommand` skatu modeļos, ja` mvx.iocprovider` ir nulle, tas var izraisīt nullReferenceException. Šis jautājums rodas tāpēc, ka SOK pakalpojumu sniedzējs nav inicializēts pirms lietošanas, kas ir izplatīta problēma vienības testos, kur SOK iestatīšana varētu netikt pilnībā izpildīta [3].
5. Nepareiza nosacītā operatoru izmantošana
Lai arī tas nav raksturīgs MVVMCross, tas, izmantojot nulles nosacījumu operatorus (`?.`), Nepareizi var izraisīt nullReferenceException, ja ķēdes starpposma objekti ir nulle. Ir ļoti svarīgi nodrošināt, ka visas ķēdes daļas tiek pareizi inicializētas pirms piekļuves ligzdotajām īpašībām.
6. Trūkst bāzes klases zvani **
MVVMCROSS iestatīšanas klasēs nav izsaukt bāzes klases metodes (piemēram, `inicializeLastChance”) var izraisīt nepieciešamo komponentu nepilnīgu inicializāciju, kā rezultātā izpildlaika laikā rodas atsauces uz nulli [1].
NullReferenceExceptions novēršana
Lai novērstu šos izņēmumus, pārliecinieties, vai visi objekti un īpašības tiek pareizi inicializētas pirms lietošanas. Pārbaudiet, vai SOK reģistrācija ir pareiza un vai bāzes klases metodes tiek sauktas pēc nepieciešamības. Turklāt nulles pārbaužu un nulles nosacījuma operatoru izmantošana var palīdzēt novērst šos izņēmumus, izvairoties no mēģinājumiem atcelt nulles atsauces.
Atsauces:[1] https://stackoverflow.com/questions/18954938/nullreference-exception-during-binding-with-mvvmcross
[2] https://www.site24x7.com/learn/fixing-nullReferenceException-and-Argumentnullexception.html
[3] https://stackoverflow.com/questions/53597908/mvvm-cross-null-references-when-unit-testing-mxvasynccommand/53618570
[4] https://pvs-studio.com/en/blog/posts/csharp/1049/
[5] https://learn.microsoft.com/en-us/dotnet/api/system.nullreferenceException?view=net-9.0
[6.]
[7] https://github.com/mvvmcross/mvvmcross/issues/3115
[8] https://www.mvvmcross.com/documentation/fundamentals/data