2016-03-30 6 views
1

になります。以前は奇妙なクラッシュがありましたが、クラッシュレポーターにはこれらのログがあります。 You can find the entire class here, where the variable is called "sPaint" (it was static initially).プライベートメンバ変数は、私は私のAndroidアプリでこのようになりますクラスを持つヌル

  • I have searched for the usage of the variable and the only place it is assigned is indeed inside the null check.

  • は、以前は「ペイント」を「静的ファイナル」として宣言されましたが、私は内部で再びそれを割り当てるために「最終」それを削除する必要がありましたヌルチェック。 Staticはずっと前に削除されていましたが、問題が "最終"だったときにも問題は発生しました。

    私のキャリアでは、以前は静的メソッドや変数を扱う際に、初期化順序に奇妙な問題がありましたが、何も静的でなく割り当てられていないので、何が起こるのか全く分かりません。

    私の唯一の推測は、線に沿ったものです:私のメソッドは、いくつかのオーバーロードされたレイアウトメソッドから呼び出されます。

    @Override 
    public void setPadding(int left, int top, int right, int bottom) { 
        super.setPadding(left, top, right, bottom); 
        init(); 
    } 
    

    リフレクションなどを使用して、クラスが初期化される前にメソッドを見つけて呼び出すことは可能ですか?

    と最後に:はい、コードは醜い、確かに非常に古く、おそらく完全な書き換えを使用することができますが、それは問題少ない奇妙な:)

+0

誰が 'aNonStaticMethod'を呼び出しますか?そのプライベートアクセスによって暗示されるように、常に同じクラス(MyButton)から呼び出されますか? – Eran

+0

あなたはどこでこのメソッドを呼び出していますか? –

+0

'Paint'コンストラクタで何か問題が起こることはありますか? – Keppil

答えて

0

あなたの実際の「aNonStaticMethod」ことはありません(缶などinitという名前のリンクされたコードに表示されます - BTW、関連するすべての実際のコードを質問の本文に含める必要があります)は、クラスの複数のメソッドによって呼び出されます。これらのメソッドの中には、スーパークラスのメソッドをオーバーライドするものがあります。これらのオーバーライドされたメソッドのいずれかがスーパークラスコンストラクタによって呼び出された場合、クラスのインスタンス変数が初期化される前にメソッドが呼び出され、メンバーがまだnullである理由が説明されます。

良い解決策は、オーバーライドされたメソッドでそのメソッドを呼び出さないようにすることです。

関連する問題