初心者。今日、明示的なインテントを使用してアクティビティ間をジャンプするコードを作成しましたが、クラス內(nèi)でインテントのメンバー変數(shù)を定義し、それをメソッドで使用するとプログラムがクラッシュしました。これはなぜですか?
リーリーコードは上記の通りですが、エラーメッセージは次のとおりです:
原因: java.lang.NullPointerException: 仮想メソッド「java.lang.String android.content.Context.getPackageName()」を呼び出そうとしました null オブジェクト參照
「null オブジェクト參照」で getPackageName() 仮想メソッドを呼び出すときにエラーが発生したと言われています。
最初は、これが空で問題が発生しているのではないかと思い、コードを変更しました:
リーリーしかし、エラーは依然として発生し、エラーメッセージは同じままです。條件判斷により、これが空ではないことはわかっていますが、それでも null 參照と言われるのはなぜですか?
小伙看你根骨奇佳,潛力無限,來學(xué)PHP伐。
これを行う前に、まず
Activity
與Context
之間的關(guān)系: 雖然Activity
繼承了Context
, 但是它卻不是真正的實現(xiàn)類, 真正的實現(xiàn)可能是ContextWrapper#getBaseContext()
返されたオブジェクトに対応するクラスを理解する必要があります。
Activity
是ContextWrapper
的子類, 所以我們先找到并打開ContextWrapper.java
ソースコード、キーコードは次のとおりです:
ContextWrapper
里基于Context
的調(diào)用都是直接使用mBase
來間接實現(xiàn)調(diào)用的. 那么這個mBase
是什么時候被賦值的呢? 找到并打開ActivityThread.java
、キーコードが割り當(dāng)てられているコード部分を見つけることができます:
上記のことから、以下のことがわかります: Activity
時, ContextWrapper#getBaseContext()
返回的是null, 因此, 不能在構(gòu)造函數(shù)或者構(gòu)造成員變量時直接調(diào)用與Context
に関連する関數(shù)とクラスをインスタンス化して、必要に応じてライフサイクル関數(shù)で呼び出します。
クラスはアクティビティ クラスを継承し、ライフ サイクルがあり、すべてのロジックはこれらのライフ サイクルで実行されます。つまり、一般に、ロジック コードはそれらのライフ サイクルのメソッドで記述される必要があります。 onCreate メソッドとそこにページを書き込むと、メソッドの識別子の命名も標(biāo)準(zhǔn)化されていません
。