[英]Object reference not set to an instance of an object - Null Reference Exception
[英]How to find out which object reference is null, when an “Object reference not set to an instance of an object” exception is recorded in Crashlytics?
我有一個使用 Crashlytics 發布的游戲,可以在 Android 和 iOS 上運行。
我有"Object reference not set to an instance of an object"
異常的記錄,這些異常告訴我在哪個方法中遇到了空引用,但不確切地是哪個引用,或發生在哪一行。
代碼在本地測試中運行成功,但在實際使用場景中,可能會出現空引用。
請注意,在 Unity 中,這可能意味着一個實際的 MonoBehaviour 對象被銷毀並且不再可用,因此在任何地方添加空檢查無濟於事。 我想確切地知道哪個對象已被銷毀,以便我可以找出導致異常的事件序列。
我想過每隔幾行就添加一個帶有更新值的Crashlytics.SetCustomKey()
,這樣我至少可以猜測發生在哪一行,這樣我就可以做出更好的猜測。
但是你有什么更好的策略建議嗎?
編輯:這個問題已被標記為重復,所以我在描述為什么它不是提到的問題的重復。
我已經知道為什么會發生 NullReferenceException,如果它發生在我本地,我可以修復它。 這個問題是與上述重復項不同的問題。 問題是關於一個復雜的情況,當一系列事件導致某些對象被銷毀時,它們預計不會被銷毀。
我的問題更多地與更好地利用 Crashlytics 相關,而不是與 NullReferenceException 相關。
為了更好地描述這種情況,這是一個棋盤游戲。 每一輪游戲都會在棋盤上創建一些棋子,當玩家觸摸棋盤時,棋盤上會創建一些高亮對象,因此玩家可以選擇可以移動棋子的位置。
作為一個可能的例子,當玩家重新開始游戲或在任何情況下離開游戲時,這些對象都會被銷毀。
但是另一項工作可能會在刷新后完成它的工作(可能是 AI 思維),然后期望船上有物體,而它們不再存在!
我真的不知道要分享什么代碼,我想我需要分享項目的很大一部分。 而且我認為這也無濟於事。 因為我不是在尋找問題的直接答案。 但我通常會問如何更好地獲取有關 Crashlytics 記錄的 NullReferenceExceptions 的更多信息。
我也已經搜索過,但沒有找到針對我的具體問題的解決方案。
所以考慮到所描述的情況,我知道異常發生的方法。 當我在 Crashlytics 中有記錄時,您認為我如何知道該異常發生在哪一行,或者哪個對象為空? (除了我自己提到的解決方案)
編輯 2 :我最初認為堆棧跟蹤可能會分散人們對實際問題的注意力,但查看評論,我認為它確實有幫助。
這是堆棧跟蹤:
Non-fatal Exception: java.lang.Exception: NullReferenceException : Object reference not set to an instance of an object. at OfflineGameScreen.MoveSuggestionTouched(OfflineGameScreen) at OfflineGameScreen+<MakeNextMoveByBot>d__74.MoveNext(OfflineGameScreen+<MakeNextMoveByBot>d__74) at System.Threading.ContextCallback.Invoke(System.Threading.ContextCallback) at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext) at System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner.Run(System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner) at System.Action.Invoke(System.Action) at System.Threading.SendOrPostCallback.Invoke(System.Threading.SendOrPostCallback) at UnityEngine.UnitySynchronizationContext+WorkRequest.Invoke(UnityEngine.UnitySynchronizationContext+WorkRequest) at UnityEngine.UnitySynchronizationContext.Exec(UnityEngine.UnitySynchronizationContext)
當然,如果您的代碼不知道詳細信息,但是您可以在銷毀時以及在引發錯誤之前記錄對象的 InstanceID。 這可能會導致您進入可能發生異常的邏輯鴻溝。
小心nullchecks ,主要是在Updates()
因為它們不是“免費的”,因為 unity 有它自己的==
運算符實現來處理典型的if (myGameObject == null) {}
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.