0

私はAndroidが初めてで、null Pointerの例外で立ち往生しています。防御コーディングも試しましたが、それでもエラーが表示されます。

ここに私のコードがあります:

public class MainActivity extends Activity {

    private ArrayList<SubjectType> subjects;
    private ArrayList<Days> days;
    private ExpandableListAdapter adapter;
    private ExpandableListView exv;
    private String DayNames[] = {"Monday","Tuesday","Wednesday","Thursday","Friday"};
    private String TypeName[]=  {"Lecture","Practical","Tutorial"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        loadContent();

        exv = (ExpandableListView) findViewById(R.id.expandableListView1);
        adapter = new ExpandableListAdapter(MainActivity.this, subjects);
        exv.setAdapter(adapter);
        collapseAll();


    }

    private void collapseAll() {
        for(int i=0;i<3;i++)
        {
            exv.collapseGroup(i);
        }
    }

    private void loadContent() {

            int daySize,typeSize;
            Days day_1 = null;
            boolean False = false;
            SubjectType sub1=null;
            daySize = 5;
            typeSize = 3;

            for(int i=0;i<daySize;i++)
            {
                if(DayNames[i]!=null)
                {
                    Days day_12 = day_1;
                    day_12.setDayAttributes(DayNames[i], False);
                    days.add(day_1);
                }
            }

            for(int j=0;j<typeSize;j++)
            {
                SubjectType sub12 = sub1;
                sub12.setChecked(false);
                if(days!=null&&TypeName[j]!=null&&sub12!=null&&sub12!=null)
                {
                sub12.setDays(days);
                sub12.setSubjectTypeName(TypeName[j]);
                subjects.add(sub12);
                }
            }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

および log-cat 表示:

07-05 17:14:26.942: E/AndroidRuntime(991): FATAL EXCEPTION: main
07-05 17:14:26.942: E/AndroidRuntime(991): java.lang.RuntimeException: Unable to start activity ComponentInfo{trying.expandables/trying.expandables.MainActivity}: java.lang.NullPointerException
07-05 17:14:26.942: E/AndroidRuntime(991):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
07-05 17:14:26.942: E/AndroidRuntime(991):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-05 17:14:26.942: E/AndroidRuntime(991):  at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-05 17:14:26.942: E/AndroidRuntime(991):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-05 17:14:26.942: E/AndroidRuntime(991):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-05 17:14:26.942: E/AndroidRuntime(991):  at android.os.Looper.loop(Looper.java:137)
07-05 17:14:26.942: E/AndroidRuntime(991):  at android.app.ActivityThread.main(ActivityThread.java:5041)
07-05 17:14:26.942: E/AndroidRuntime(991):  at java.lang.reflect.Method.invokeNative(Native Method)
07-05 17:14:26.942: E/AndroidRuntime(991):  at java.lang.reflect.Method.invoke(Method.java:511)
07-05 17:14:26.942: E/AndroidRuntime(991):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-05 17:14:26.942: E/AndroidRuntime(991):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-05 17:14:26.942: E/AndroidRuntime(991):  at dalvik.system.NativeStart.main(Native Method)
07-05 17:14:26.942: E/AndroidRuntime(991): Caused by: java.lang.NullPointerException
07-05 17:14:26.942: E/AndroidRuntime(991):  at trying.expandables.MainActivity.loadContent(MainActivity.java:54)
07-05 17:14:26.942: E/AndroidRuntime(991):  at trying.expandables.MainActivity.onCreate(MainActivity.java:23)
07-05 17:14:26.942: E/AndroidRuntime(991):  at android.app.Activity.performCreate(Activity.java:5104)
07-05 17:14:26.942: E/AndroidRuntime(991):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
07-05 17:14:26.942: E/AndroidRuntime(991):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
07-05 17:14:26.942: E/AndroidRuntime(991):  ... 11 more

助けてください!

4

4 に答える 4

2

onCreateloadContentルーチンの 3 行目で呼び出します。

loadContent呼び出すルーチン内で:

days.add(day_1);

最初の for ループ。宣言:

private ArrayList<Days> days;

...これはインスタンス化されません。使用する前に、これをどこかに置いてください。

days = new ArrayList<Days>();

編集:

他の人が言ったように。についても同じことを行いますsubjects

于 2013-07-05T17:41:10.180 に答える
2

のロジックが正しくありませんloadContent

Days day_1 = null;

...後で、別の割り当てなしday_1で...

Days day_12 = day_1;                          // Sets day12 to null.
day_12.setDayAttributes(DayNames[i], False);  // boom
于 2013-07-05T17:41:34.687 に答える
2

スタックトレースの最も興味深い行は

07-05 17:14:26.942: E/AndroidRuntime(991):  at trying.expandables.MainActivity.loadContent(MainActivity.java:54)

(非常に多くの場合、システム以外のコードに言及している最初の行から調べるのが最適です)

私のカウントによると、54行目は

subjects.add(sub12);

あなたのコードのどこにも、NPEを説明するサブジェクトが初期化されているのが見えません。

編集: 間違った行を見ていましたが、TheCapn と Joachim Isaksson によって既に指摘されているように、原因は同じです。そして、私は今あなたがそうするのを見ます

        SubjectType sub1=null;
        ...
            SubjectType sub12 = sub1;
            sub12.setChecked(false); // <--- same BOOM, other line.

ここでパターンが見え始めていますか?

また、次のような密度の高いものは避けてください。

if(days!=null&&TypeName[j]!=null&&sub12!=null&&sub12!=null)

なぜなら

if( (days!=null) && (TypeName[j]!=null) && (sub12!=null) && (sub12!=null) )

目にははるかに簡単です...

于 2013-07-05T17:35:46.357 に答える