初心者。今日、明示的なインテントを使用してアクティビティ間をジャンプするコードを作成しましたが、クラス内でインテントのメンバー変数を定義し、それをメソッドで使用するとプログラムがクラッシュしました。これはなぜですか?
リーリーコードは上記の通りですが、エラーメッセージは次のとおりです:
原因: java.lang.NullPointerException: 仮想メソッド「java.lang.String android.content.Context.getPackageName()」を呼び出そうとしました null オブジェクト参照
「null オブジェクト参照」で getPackageName() 仮想メソッドを呼び出すときにエラーが発生したと言われています。
最初は、これが空で問題が発生しているのではないかと思い、コードを変更しました:
リーリーしかし、エラーは依然として発生し、エラーメッセージは同じままです。条件判断により、これが空ではないことはわかっていますが、それでも null 参照と言われるのはなぜですか?
phpcn_u15822017-05-16 13:37:09
これを行う前に、まず
Activity
与Context
之间的关系: 虽然Activity
继承了Context
, 但是它却不是真正的实现类, 真正的实现可能是ContextWrapper#getBaseContext()
返されたオブジェクトに対応するクラスを理解する必要があります。
Activity
是ContextWrapper
的子类, 所以我们先找到并打开ContextWrapper.java
ソースコード、キーコードは次のとおりです:
ContextWrapper
里基于Context
的调用都是直接使用mBase
来间接实现调用的. 那么这个mBase
是什么时候被赋值的呢? 找到并打开ActivityThread.java
、キーコードが割り当てられているコード部分を見つけることができます:
上記のことから、以下のことがわかります: Activity
时, ContextWrapper#getBaseContext()
返回的是null, 因此, 不能在构造函数或者构造成员变量时直接调用与Context
に関連する関数とクラスをインスタンス化して、必要に応じてライフサイクル関数で呼び出します。
伊谢尔伦2017-05-16 13:37:09
クラスはアクティビティ クラスを継承し、ライフ サイクルがあり、すべてのロジックはこれらのライフ サイクルで実行されます。つまり、一般に、ロジック コードはそれらのライフ サイクルのメソッドで記述される必要があります。 onCreate メソッドとそこにページを書き込むと、メソッドの識別子の命名も標準化されていません
。