2012-01-02 13 views
2

私が取り組んでいるアプリケーションで致命的なエラーが発生しました。ログファイルとコードは次のとおりです。私はそれが主要な活動にも達していないと言うことができるからです。Android致命的なエラー「アクティビティをインスタンス化できません」

ログファイル:

Shutting down VM 
threadid=1: thread exiting with uncaught exception (group=0x401db760) 
FATAL EXCEPTION: main 
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{A3.cal/A3.cal.A3Activity}: java.lang.NullPointerException 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1739) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831) 
    at android.app.ActivityThread.access$500(ActivityThread.java:122) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:132) 
    at android.app.ActivityThread.main(ActivityThread.java:4123) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:491) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
    at android.content.ContextWrapper.getResources(ContextWrapper.java:81) 
    at android.view.View.<init>(View.java:2366) 
    at android.view.View.<init>(View.java:2411) 
    at android.widget.TextView.<init>(TextView.java:371) 
    at android.widget.Button.<init>(Button.java:108) 
    at android.widget.Button.<init>(Button.java:104) 
    at android.widget.Button.<init>(Button.java:100) 
    at A3.cal.A3Activity.<init>(A3Activity.java:32) 
    at java.lang.Class.newInstanceImpl(Native Method) 
    at java.lang.Class.newInstance(Class.java:1301) 
    at android.app.Instrumentation.newActivity(Instrumentation.java:1022) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1730) 
    ... 11 more 

コード:

package A3.cal; 

import java.util.Calendar; 
import android.app.Activity; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.view.Display; 
import android.view.Gravity; 
import android.view.View; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.Button; 
import android.widget.DatePicker; 
import android.widget.EditText; 
import android.widget.LinearLayout; 
import android.widget.PopupWindow; 
import android.widget.Spinner; 
import android.widget.TextView; 
import android.widget.TimePicker; 

public class A3Activity extends Activity { 
    public int currentMonth = 0; 
    private TextView[] dayTableTV = new TextView[6*7]; 
    private Integer[] dayTable = null; 
    public Integer currentYear = 0; 
    public int firstDayOfWeek = 0; 
    public boolean leapYear = false; 
    private PopupWindow createEventPopup = null; 
    boolean click = false; 
    private Button closeAddEventButton = new Button(this); 
    private Button submitAddEventButton = new Button(this); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     makeTable(); 

     Button addEvent = (Button) findViewById(R.id.addEvent); 
     addEvent.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       if(click == false){ 
        addEventPopup(); 
        click = true; 
       }else{ 
        createEventPopup.dismiss(); 
        click = false; 
       } 
      } 
     }); 

     Button nextMonthButton = (Button) findViewById(R.id.nextMonthButton); 
     nextMonthButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       changeMonthNext(getMonth(currentMonth, 1)); 
      } 
     }); 

     Button previousMonthButton = (Button) findViewById(R.id.previousMonthButton); 
     previousMonthButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       changeMonthBack(getMonth(currentMonth, -1)); 
      } 
     }); 

     closeAddEventButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       createEventPopup.dismiss(); 
      } 
     }); 

     submitAddEventButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       submitEvent(); 
      } 

     }); 

    } 

あり、この後のより多くのコードですが、文字を保存するために、私はそれを投稿していないです。あなたがそれを必要とする場合は、コメントに私に教えてください。

答えて

5

onCreateのように、ボタンを他の場所で初期化します。 Buttonインスタンスは、インスタンス変数初期化子(closeAddEventButtonsubmitAddEventButton)でインスタンス化されるとき


問題はthis年代(A3Activity)の状態です。

インスタンス変数初期化子はコンストラクタの前に実行されますが、オブジェクトはそのコンストラクタが実行されるまで完全には初期化されません。それ以前に参照されたオブジェクトは不確定状態になります。

(状態を決定することができ、私はちょうどインスタンスがまだ完全には使用可能ではないかもしれない平均)Button初期化フローにおける

何かA3Activityから初期化されていない値を使用しNPEをスロー。 (。JLS 12.5: Creation of New Class Instances詳細インスタンスの初期化プロセス)初期化子は、テキスト上の順(JLS 12.4.2)で実行していることに留意し

は、コンストラクタの前に、ここでは簡単なデモです:FYI

public class ThisHere { 
    public String aww; 
    public String notYet = this.aww; 

    GedankenExperiment wat = new GedankenExperiment(this); 

    // public class GedankenExperiment { 
    //  public GedankenExperiment(thatThere) { 
    //   thatThere.aww = ??? 
    //  } 
    // } 

    public ThisHere() { 
     this.aww = "Hi there"; 
    } 

    public static void main(String[] args) { 
     ThisHere thisHere = new ThisHere(); 
     System.out.println("aww=" + thisHere.aww); 
     // > aww=Hi there (initialized in ctor) 
     System.out.println("notYet=" + thisHere.notYet); 
     // > notYet=null (initialized before ctor) 
    } 
} 

、TELL-物語記号は、このでしたログの行:

私が最初に見た唯一のログラインは、最初のステップでは、およびJavaパッケージを提供します。 <init>という部分はメソッドにはないので、インスタンスの初期化子と何か関係があります。

スタックトレースには、Buttonイニシャライザエントリが含まれています。それに加えてコンストラクタにthisを使用することは、それが唯一の実際の可能性であることを意味しました。

+0

これはうまくいきましたが、なぜそれを行うことができないのですか。また、どのようにonClickイベントを動的ボタンに割り当てるのですか? - 感謝万円! – Reid

関連する問題