検索

ホームページ  >  に質問  >  本文

Android のバグ - Android では、なぜインテントの初期化をメソッドの外に記述できないのですか?

初心者。今日、明示的なインテントを使用してアクティビティ間をジャンプするコードを作成しましたが、クラス内でインテントのメンバー変数を定義し、それをメソッドで使用するとプログラムがクラッシュしました。これはなぜですか?

リーリー

コードは上記の通りですが、エラーメッセージは次のとおりです:

原因: java.lang.NullPointerException: 仮想メソッド「java.lang.String android.content.Context.getPackageName()」を呼び出そうとしました null オブジェクト参照

「null オブジェクト参照」で getPackageName() 仮想メソッドを呼び出すときにエラーが発生したと言われています。

最初は、これが空で問題が発生しているのではないかと思い、コードを変更しました:

リーリー

しかし、エラーは依然として発生し、エラーメッセージは同じままです。条件判断により、これが空ではないことはわかっていますが、それでも null 参照と言われるのはなぜですか?

伊谢尔伦伊谢尔伦2774日前940

全員に返信(3)返信します

  • phpcn_u1582

    phpcn_u15822017-05-16 13:37:09

    これを行う前に、まず ActivityContext之间的关系: 虽然Activity继承了Context, 但是它却不是真正的实现类, 真正的实现可能是ContextWrapper#getBaseContext()返されたオブジェクトに対応するクラスを理解する必要があります。

    ActivityContextWrapper的子类, 所以我们先找到并打开ContextWrapper.javaソースコード、キーコードは次のとおりです:

    リーリー

    ContextWrapper里基于Context的调用都是直接使用mBase来间接实现调用的. 那么这个mBase是什么时候被赋值的呢? 找到并打开ActivityThread.java、キーコードが割り当てられているコード部分を見つけることができます:

    リーリー

    上記のことから、以下のことがわかります: Activity时, ContextWrapper#getBaseContext()返回的是null, 因此, 不能在构造函数或者构造成员变量时直接调用与Context に関連する関数とクラスをインスタンス化して、必要に応じてライフサイクル関数で呼び出します。

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-05-16 13:37:09

    クラスはアクティビティ クラスを継承し、ライフ サイクルがあり、すべてのロジックはこれらのライフ サイクルで実行されます。つまり、一般に、ロジック コードはそれらのライフ サイクルのメソッドで記述される必要があります。 onCreate メソッドとそこにページを書き込むと、メソッドの識別子の命名も標準化されていません

    返事
    0
  • 天蓬老师

    天蓬老师2017-05-16 13:37:09

    onCreate() メソッドをオーバーライドする必要があります

    返事
    0
  • キャンセル返事