开发者

What is wrong with my program? why is the nullpointerexception thrown? Android

开发者 https://www.devze.com 2023-02-26 19:48 出处:网络
I am a freshman in android programming. My teacher gave me an android project. part of my code is here. anyone can help me? thanks a lot.

I am a freshman in android programming. My teacher gave me an android project. part of my code is here. anyone can help me? thanks a lot.

public class tablecontroller extends ListActivity {
    private int mNoteNumber = 1;
    private Dbadapter mDbHelper;
    changetonextlayout pointer;
    SimpleCursorAdapter notes;

    public tablecontroller(changetonextlayout point){
        pointer = point;
        mDbHelper = new Dbadapter(point);
        mDbHelper.open();
        fillData();
    }

    public void createNote() {
        try{
        String noteName = "Note " + mNoteNumber ++;
        mDbHelper.createNote(noteName, "");
        fillData();
        }
        catch (Exception e)
        {
        // this is the line of code that sends a real error message to the log
        Log.e("ERROR", "ERROR IN CODE: " + e.toString());

        // this is the line that prints out the location in
        // the code where the error occurred.
        e.printStackTrace();
        }
    }

    public void fillData() {
        // Get all of the notes from the database and create the item list
        Cursor c = mDbHelper.fetchAllNotes();
        startManagingCursor(c);

        String[] from = new String[] {Dbadapter.KEY_TITLE };
        int[] to = new int[] { R.id.text1 };

        // Now create an array adapter and set it to display using our row
        SimpleCursorAdapter notes =
            new SimpleCursorAdapter(pointer, R.layout.notes_row, c, from, to);
        try{
        setListAdapter(notes);
        }
        catch (Exception e)
        {
        // this is the line of code that sends a real error message to the log
        Log.e("ERROR", "ERROR IN CODE: " + e.toString());

        // this is the line that prints out the location in
        // the code where the error occurred.
        e.printStackTrace();
        }
    }
}

Why does the function setListAdaper throw out the NullPointerException?

I initialize the class in another file.

public class changetonextlayout extends Activity implements OnClickListener{
        protected Context pointer;
        private tablecontroller controller;

        public void onCreate(Bundle savedInstanceState) {
            try
            {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main2);
            controller = new tablecontroller(this);

            Button buttonback = (Button) findViewById(R.id.button3);
            buttonback.setOnClickListener(this);

            Button buttonsearch = (Button) findViewById(R.id.button4);
            buttonsearch.setOnClickListener(this);

            Button buttonadd = (Button) findViewById(R.id.button5);
            buttonadd.setOnClickListener(this);
            }
            catch (Exception e)
            {
            // this is the line of code that sends a real error message to the log
            Log.e("ERROR", "ERROR IN CODE: " + e.toString());

            // this is the line that prints out the location in
            // the code where the error occurred.
            e.printStackTrace();
            }

        }

        public void onClick(View v) {
            // TODO Auto-generated method stub
            int id = v.getId();

            switch (id)
            {
            case 0x7f060013:
                //action of buttonback
                Intent intent = new Intent();
                setResult(RESULT_OK, intent);
                finish();
                break;
            case 0x7f060014:
                //action of buttonsearch
                break;
            case 0x7f060015:
                //action of buttonadd
                controller.createNote();
                break;

            }
        }
    }

The dbadapter which i just copy from the android tutorial is below.

public class Dbadapter {
    public static final String KEY_TITLE = "title";
    public static final String KEY_BODY = "body";
    public static final String KEY_ROWID = "_id";

    private static final String TAG = "Dbadapter";
    private DatabaseHelper mDbHelper;
    private SQLiteDatabase mDb;

    /**
     * Database creation sql statement
     */
    private static final String DATABASE_CREATE =
            "create table notes (_id integer primary key autoincrement, "
                    + "title text not null, body text not null);";

    private static final String DATABASE_NAME = "data";
    private static final String DATABASE_TABLE = "notes";
    private static final int DATABASE_VERSION = 2;

    private final Context mCtx;

    private static class DatabaseHelper extends SQLite开发者_如何学JAVAOpenHelper {

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

        @Override
        public void onCreate(SQLiteDatabase db) {

            db.execSQL(DATABASE_CREATE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS notes");
            onCreate(db);
        }
    }

    /**
     * Constructor - takes the context to allow the database to be
     * opened/created
     * 
     * @param ctx the Context within which to work
     */
    public Dbadapter(Context ctx) {
        this.mCtx = ctx;
    }

    /**
     * Open the notes database. If it cannot be opened, try to create a new
     * instance of the database. If it cannot be created, throw an exception to
     * signal the failure
     * 
     * @return this (self reference, allowing this to be chained in an
     *         initialization call)
     * @throws SQLException if the database could be neither opened or created
     */
    public Dbadapter open() throws SQLException {
        mDbHelper = new DatabaseHelper(mCtx);
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }

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


    /**
     * Create a new note using the title and body provided. If the note is
     * successfully created return the new rowId for that note, otherwise return
     * a -1 to indicate failure.
     * 
     * @param title the title of the note
     * @param body the body of the note
     * @return rowId or -1 if failed
     */
    public long createNote(String title, String body) {
        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_TITLE, title);
        initialValues.put(KEY_BODY, body);

        return mDb.insert(DATABASE_TABLE, null, initialValues);
    }

    /**
     * Delete the note with the given rowId
     * 
     * @param rowId id of note to delete
     * @return true if deleted, false otherwise
     */
    public boolean deleteNote(long rowId) {

        return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
    }

    /**
     * Return a Cursor over the list of all notes in the database
     * 
     * @return Cursor over all notes
     */
    public Cursor fetchAllNotes() {

        return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE,
                KEY_BODY}, null, null, null, null, null);
    }

    /**
     * Return a Cursor positioned at the note that matches the given rowId
     * 
     * @param rowId id of note to retrieve
     * @return Cursor positioned to matching note, if found
     * @throws SQLException if note could not be found/retrieved
     */
    public Cursor fetchNote(long rowId) throws SQLException {

        Cursor mCursor =

                mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
                        KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null,
                        null, null, null, null);
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;

    }

    /**
     * Update the note using the details provided. The note to be updated is
     * specified using the rowId, and it is altered to use the title and body
     * values passed in
     * 
     * @param rowId id of note to update
     * @param title value to set note title to
     * @param body value to set note body to
     * @return true if the note was successfully updated, false otherwise
     */
    public boolean updateNote(long rowId, String title, String body) {
        ContentValues args = new ContentValues();
        args.put(KEY_TITLE, title);
        args.put(KEY_BODY, body);

        return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
    }
}


Never implement a constructor on an Activity. Move all of that code to your (missing) onCreate() method.

If your teacher did not teach you about onCreate() in the first lecture or so, then we have problems.

0

精彩评论

暂无评论...
验证码 换一张
取 消