2012-12-25 25 views
2

日志:NullPointerException异常再次

12-25 03:26:16.003: E/AndroidRuntime(3623): FATAL EXCEPTION: main 
12-25 03:26:16.003: E/AndroidRuntime(3623): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dd.gfit/com.dd.gfit.DaysActivity}: java.lang.NullPointerException 
12-25 03:26:16.003: E/AndroidRuntime(3623):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
12-25 03:26:16.003: E/AndroidRuntime(3623):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
12-25 03:26:16.003: E/AndroidRuntime(3623):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
12-25 03:26:16.003: E/AndroidRuntime(3623):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
12-25 03:26:16.003: E/AndroidRuntime(3623):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-25 03:26:16.003: E/AndroidRuntime(3623):  at android.os.Looper.loop(Looper.java:137) 
12-25 03:26:16.003: E/AndroidRuntime(3623):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
12-25 03:26:16.003: E/AndroidRuntime(3623):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-25 03:26:16.003: E/AndroidRuntime(3623):  at java.lang.reflect.Method.invoke(Method.java:511) 
12-25 03:26:16.003: E/AndroidRuntime(3623):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
12-25 03:26:16.003: E/AndroidRuntime(3623):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
12-25 03:26:16.003: E/AndroidRuntime(3623):  at dalvik.system.NativeStart.main(Native Method) 
12-25 03:26:16.003: E/AndroidRuntime(3623): Caused by: java.lang.NullPointerException 
12-25 03:26:16.003: E/AndroidRuntime(3623):  at com.dd.gfit.DaysActivity.onCreate(DaysActivity.java:22) 
12-25 03:26:16.003: E/AndroidRuntime(3623):  at android.app.Activity.performCreate(Activity.java:5104) 
12-25 03:26:16.003: E/AndroidRuntime(3623):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
12-25 03:26:16.003: E/AndroidRuntime(3623):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
12-25 03:26:16.003: E/AndroidRuntime(3623):  ... 11 more 

下面我已经添加了相关的代码。

MySQLiteHelper.java:

package com.dd.gfit; 

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class MySQLiteHelper extends SQLiteOpenHelper { 

    public static final String TABLE_DAYS = "days"; 

    public static final String COLUMN_ID = "id"; 
    public static final String COLUMN_NAME = "name"; 
    public static final String COLUMN_ID_ROUTINE = "id_routine"; 
    public static final String COLUMN_DAY = "day"; 


    private static final String DATABASE_NAME = "gfit.db"; 
    private static final int DATABASE_VERSION = 1; 

    public MySQLiteHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase database) { 
     // create days table 
     database.execSQL("create table " + TABLE_DAYS + "(" 
       + COLUMN_ID + " integer primary key autoincrement," 
       + COLUMN_ID_ROUTINE + " integer not null," 
       + COLUMN_NAME + " varchar not null," 
       + COLUMN_DAY + " varchar not null" 
       + ")"); 
     database.execSQL("insert into " + TABLE_DAYS + "("+ COLUMN_ID +", "+ COLUMN_ID_ROUTINE +", "+ COLUMN_NAME +", "+ COLUMN_DAY +") VALUES (12, 23, 'Day 1', 'Monday')"); 
     database.execSQL("insert into " + TABLE_DAYS + "("+ COLUMN_ID +", "+ COLUMN_ID_ROUTINE +", "+ COLUMN_NAME +", "+ COLUMN_DAY +") VALUES (21, 23, 'Day 2', 'Tuesday')"); 
     database.execSQL("insert into " + TABLE_DAYS + "("+ COLUMN_ID +", "+ COLUMN_ID_ROUTINE +", "+ COLUMN_NAME +", "+ COLUMN_DAY +") VALUES (33, 23, 'Day 3', 'No Specific Day')"); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_DAYS); 
    onCreate(db); 
    } 

} 

DaysActivity.java:

package com.dd.gfit; 

import android.app.ListActivity; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.widget.SimpleCursorAdapter; 

public class DaysActivity extends ListActivity { 
    private DaysDataSource datasource; 
    private long routineDataID; 
    private SimpleCursorAdapter dataAdapter; 

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

    routineDataID = getIntent().getLongExtra("routineDataID", 1); 

     Cursor cursor = datasource.fetchAllDays(routineDataID); 

     // The desired columns to be bound 
     String[] columns = new String[] { MySQLiteHelper.COLUMN_NAME, MySQLiteHelper.COLUMN_DAY }; 

     // the XML defined views which the data will be bound to 
     int[] to = new int[] { R.id.listitem_day_name, R.id.listitem_day_day }; 

     // create the adapter using the cursor pointing to the desired data 
     dataAdapter = new SimpleCursorAdapter(this, R.layout.listitem_day, cursor, columns, to, 0); 

     // Assign adapter to ListView 
     setListAdapter(dataAdapter); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.activity_days, menu); 
     return true; 
    } 

} 

DaysDataSource.java:

package com.dd.gfit; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 

public class DaysDataSource { 

    // Database fields 
    private SQLiteDatabase database; 
    private MySQLiteHelper dbHelper; 
    private String[] allColumns = { MySQLiteHelper.COLUMN_ID, MySQLiteHelper.COLUMN_ID_ROUTINE, MySQLiteHelper.COLUMN_NAME, MySQLiteHelper.COLUMN_DAY }; 

    public DaysDataSource(Context context) { 
    dbHelper = new MySQLiteHelper(context); 
    } 

    public void open() throws SQLException { 
    database = dbHelper.getWritableDatabase(); 
    } 

    public void close() { 
    dbHelper.close(); 
    } 

    public Cursor fetchAllDays(long id) { 
     Cursor mCursor = database.query(MySQLiteHelper.TABLE_DAYS, allColumns, null, null, null, MySQLiteHelper.COLUMN_ID_ROUTINE + " = " + id, null); 

     if (mCursor != null) { 
      mCursor.moveToFirst(); 
     } 

     return mCursor; 
    } 
} 

listitem_day.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center_vertical" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/listitem_day_name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="5dp" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:text="Day Name" /> 

    <TextView 
     android:id="@+id/listitem_day_day" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="5dp" 
     android:text="Monday" 
     android:textAppearance="?android:attr/textAppearanceSmall" /> 

</LinearLayout> 

如何为DaysActivity的意图被称为:

Toast toast = Toast.makeText(this, String.valueOf(id), Toast.LENGTH_SHORT); 
toast.show(); 

Intent startDaysActivity = new Intent(this, DaysActivity.class); 
startDaysActivity.putExtra("routineDataID", id); 
this.startActivity(startDaysActivity); 

我知道routineDataID被传递成功,因为Toast正确显示id

为什么我得到一个NullPointerException?

回答

3

更改您的代码为:

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

    routineDataID = getIntent().getLongExtra("routineDataID", 1); 

    datasource=new DaysDataSource(DaysActivity.this); //<<missing this line 

    datasource.open() ; //<<< Open db here  

    Cursor cursor = datasource.fetchAllDays(routineDataID); 
    // your code here... 

你没有被传递活动的背景下

+1

哇,我没有打开(),要么。谢谢。 – scarhand

0
Cursor cursor = datasource.fetchAllDays(routineDataID); 

数据源初始化数据源是空

+0

通过给出一些关于如何避免该问题的建议,可以改进此答案。可能是构造函数需要加强,或者函数调用存在一些排序问题,或者在已识别的行中检查不足。你的诊断,到目前为止,是正确的;它并不是那么有用。 (答案被标记为“低质量帖子” - 我应用的编辑是琐事,你应该发现自己)。 –

+0

我的答案很清楚,对于被问的问题,问题是**为什么**我已经回答**因为**我没有写这段代码,并且有几种方法可以使数据源不为null,我认为所有的都是简单的:) **圣诞节快乐 !!!** –