寻找空指针异常的原因 [英] Looking for Cause of Null Pointer Exception

查看:120
本文介绍了寻找空指针异常的原因的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我敢肯定有东西,我得到的错误空蓬异常错误背后的简单,但是,我没有看到它。下面是相关的code:

 包com.example.gameexpensetracker;进口android.app.Activity;
进口android.database.Cursor;
进口android.os.Bundle;
进口android.widget.Toast;公共类Chart_screen_activity延伸活动{    双strategyTotalDB;
    DBAdapter DB =新DBAdapter(本);    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.chart_screen_activity);
        db.open();
    pieGraphData();
    }       公共无效pieGraphData(){
                    光标cursor17 = db.rawQuery(SELECT(strategy_total)FROM strategyTotal WHERE _id =(SELECT MAX(_id)FROM strategyTotal),
                    空值);
        如果(cursor17.moveToFirst()){
        strategyTotalDB = cursor17.getDouble(0);
        cursor17.close();
        Toast.makeText(+ strategyTotalDB +!补充说:这一点,新条目,Toast.LENGTH_LONG).show();
        db.close();
        }}}

在LogCat中说,23线和32引起的问题:

  10月12日至29日:46:39.979:D / AndroidRuntime(1754年):关闭VM
十月12日至29日:46:39.979:W / dalvikvm(1754年):主题ID = 1:螺纹未捕获的异常(组= 0x40015560)退出
十月12日至29日:46:39.989:E / AndroidRuntime(1754年):致命异常:主要
十月12日至29日:46:39.989:E / AndroidRuntime(1754年):了java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.gameexpensetracker / com.example.gameexpensetracker.Chart_screen_activity}:显示java.lang.NullPointerException
十月12日至29日:46:39.989:E / AndroidRuntime(1754年):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
十月12日至29日:46:39.989:E / AndroidRuntime(1754年):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
十月12日至29日:46:39.989:E / AndroidRuntime(1754年):在android.app.ActivityThread.access $ 1500(ActivityThread.java:117)
十月12日至29日:46:39.989:E / AndroidRuntime(1754年):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:931)
十月12日至29日:46:39.989:E / AndroidRuntime(1754年):在android.os.Handler.dispatchMessage(Handler.java:99)
十月12日至29日:46:39.989:E / AndroidRuntime(1754年):在android.os.Looper.loop(Looper.java:123)
十月12日至29日:46:39.989:E / AndroidRuntime(1754年):在android.app.ActivityThread.main(ActivityThread.java:3683)
十月12日至29日:46:39.989:E / AndroidRuntime(1754年):在java.lang.reflect.Method.invokeNative(本机方法)
十月12日至29日:46:39.989:E / AndroidRuntime(1754年):在java.lang.reflect.Method.invoke(Method.java:507)
十月12日至29日:46:39.989:E / AndroidRuntime(1754年):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)
十月12日至29日:46:39.989:E / AndroidRuntime(1754年):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
十月12日至29日:46:39.989:E / AndroidRuntime(1754年):在dalvik.system.NativeStart.main(本机方法)
十月12日至29日:46:39.989:E / AndroidRuntime(1754年):由:显示java.lang.NullPointerException
十月12日至29日:46:39.989:E / AndroidRuntime(1754年):在com.example.gameexpensetracker.Chart_screen_activity.pieGraphData(Chart_screen_activity.java:32)
十月12日至29日:46:39.989:E / AndroidRuntime(1754年):在com.example.gameexpensetracker.Chart_screen_activity.onCreate(Chart_screen_activity.java:23)
十月12日至29日:46:39.989:E / AndroidRuntime(1754年):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
十月12日至29日:46:39.989:E / AndroidRuntime(1754年):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
十月12日至29日:46:39.989:E / AndroidRuntime(1754):11 ...更多

下面是我的DBAdapter:

 进口android.content.ContentValues​​;
进口android.content.Context;
进口android.database.Cursor;
进口android.database.SQLException;
进口android.database.sqlite.SQLiteDatabase;
进口android.database.sqlite.SQLiteOpenHelper;公共类DBAdapter {
    静态最后弦乐KEY_ROWID =_id;
    静态最后弦乐KEY_TITLE =称号;
    静态最后弦乐KEY_PLATFORM =平台;
    静态最后弦乐KEY_GENRE =流派;
    静态最后弦乐KEY_DATE =日期;
    静态最后弦乐KEY_PRICE =价格;
    静态最后弦乐KEY_TOTAL =总;
    静态最后弦乐KEY_WHEREBOUGHT =wherebought;
    静态最后弦乐TAG =DBAdapter;    静态最后弦乐DATABASE_NAME =gamesDB;
    静态最后弦乐DATABASE_TABLE =购买;
    静态最终诠释DATABASE_VERSION = 1;    静态最后弦乐DATABASE_CREATE =CREATE TABLE IF NOT EXISTS购买(_id整数主键自动增量
            +标题文本,文本平台,流派文本,文本日期,价格双,wherebought文本);    静态最后弦乐DATABASE_CREATE2 =CREATE TABLE IF NOT EXISTS grandTotal(_id整数主键自动增量
            +总双);;    静态最后弦乐DATABASE_CREATE3 =CREATE TABLE IF NOT EXISTS strategyTotal(_id整数主键自动增量
            +strategy_prices双,双strategy_total);;    静态最后弦乐DATABASE_CREATE4 =CREATE TABLE IF NOT EXISTS adventureTotal(_id整数主键自动增量
            +adventure_prices双,双adventure_total);;    静态最后弦乐DATABASE_CREATE5 =CREATE TABLE IF NOT EXISTS actionTotal(_id整数主键自动增量
            +action_prices双,双action_total);;    静态最后弦乐DATABASE_CREATE6 =CREATE TABLE IF NOT EXISTS MMOTotal(_id整数主键自动增量
            +mmo_prices双,双mmo_total);;    静态最后弦乐DATABASE_CREATE7 =CREATE TABLE IF NOT EXISTS racingTotal(_id整数主键自动增量
            +r​​acing_prices双,双racing_total);;    静态最后弦乐DATABASE_CREATE8 =CREATE TABLE IF NOT EXISTS rpgTotal(_id整数主键自动增量
            +r​​pg_prices双,双rpg_total);;    静态最后弦乐DATABASE_CREATE9 =CREATE TABLE IF NOT EXISTS simulationTotal(_id整数主键自动增量
            +simulation_prices双,双simulation_total);;    静态最后弦乐DATABASE_CREATE10 =CREATE TABLE IF NOT EXISTS sportsTotal(_id整数主键自动增量
            +sports_prices双,双sports_total);;    静态最后弦乐DATABASE_CREATE11 =CREATE TABLE IF NOT EXISTS otherTotal(_id整数主键自动增量
            +other_prices双,双other_total);;    静态最后弦乐DATABASE_CREATE12 =CREATE TABLE IF NOT EXISTS puzzleTotal(_id整数主键自动增量
            +puzzle_prices双,双puzzle_total);;
    双columntotal,strategyPriceInput,actionPriceInput,adventurePriceInput,MMOPriceInput,racingPriceInput,rpgPriceInput,simulationPriceInput,
    sportsPriceInput,puzzlePriceInput,otherPriceInput;    最后上下文的背景下;    DatabaseHelper DBHelper;
    SQLiteDatabase分贝;    公共DBAdapter(上下文CTX){
        this.context = CTX;
        DBHelper =新DatabaseHelper(背景);
    }    私有静态类DatabaseHelper扩展SQLiteOpenHelper {
        DatabaseHelper(上下文的背景下){
            超(背景下,DATABASE_NAME,空,DATABASE_VERSION);
        }        @覆盖
        公共无效的onCreate(SQLiteDatabase DB){
            尝试{
                db.execSQL(DATABASE_CREATE);
                db.execSQL(DATABASE_CREATE2);
                db.execSQL(DATABASE_CREATE3);
                db.execSQL(DATABASE_CREATE4);
                db.execSQL(DATABASE_CREATE5);
                db.execSQL(DATABASE_CREATE6);
                db.execSQL(DATABASE_CREATE7);
                db.execSQL(DATABASE_CREATE8);
                db.execSQL(DATABASE_CREATE9);
                db.execSQL(DATABASE_CREATE10);
                db.execSQL(DATABASE_CREATE11);
                db.execSQL(DATABASE_CREATE12);
            }赶上(的SQLException E){
                e.printStackTrace();
            }
        }        @覆盖
        公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){
            db.execSQL(DATABASE_CREATE2);
        }
    }    // ---打开数据库---
    公共DBAdapter的open()抛出的SQLException {
        DB = DBHelper.getWritableDatabase();
        返回此;
    }    // ---关闭数据库---
    公共无效的close(){
        DBHelper.close();
    }    // ---插入一条记录到数据库---
    众长insertRecord(标题字符串,字符串平台,字符串类型,
            字串的日期,双价,弦乐wherebought){
        ContentValues​​ initialValues​​ =新ContentValues​​();
        initialValues​​.put(KEY_TITLE,职称);
        initialValues​​.put(KEY_PLATFORM,平台);
        initialValues​​.put(KEY_GENRE,体裁);
        initialValues​​.put(KEY_DATE,日期);
        initialValues​​.put(KEY_PRICE,价格);
        initialValues​​.put(KEY_WHEREBOUGHT,wherebought);
        返回db.insert(DATABASE_TABLE,空,initialValues​​);    }    //删除所有记录    公共无效deleteAll(){
        context.deleteDatabase(DATABASE_NAME);    }    // ---删除一个特定的记录---
    公共布尔deleteRecord(长ROWID){
        返回db.delete(DATABASE_TABLE,KEY_ROWID +=+ ROWID,NULL)> 0;
    }    // ---检索的所有记录---
    公共光标getAllRecords(){
        返回db.query(DATABASE_TABLE,新的String [] {KEY_ROWID,KEY_TITLE,
                KEY_GENRE,KEY_DATE,KEY_PRICE,KEY_WHEREBOUGHT},NULL,NULL,
                NULL,NULL,NULL);
    }    // ---检索特定的记录---
    公共光标getRecord(长ROWID)抛出的SQLException {
        光标mCursor = db.query(真,DATABASE_TABLE,新的String [] {
                KEY_ROWID,KEY_TITLE,KEY_PLATFORM,KEY_GENRE,KEY_DATE,
                KEY_PRICE,KEY_WHEREBOUGHT},KEY_ROWID +=+ ROWID,空,
                NULL,NULL,NULL,NULL);
        如果(mCursor!= NULL){
            mCursor.moveToFirst();
        }
        返回mCursor;
    }    // ---更新的纪录---
    公共布尔updateRecord(长ROWID,标题字符串,字符串的平台,
            字符串类型,字符串日期,双价,弦乐wherebought){
        ContentValues​​ ARGS =新ContentValues​​();
        args.put(KEY_TITLE,职称);
        args.put(KEY_PLATFORM,平台);
        args.put(KEY_GENRE,体裁);
        args.put(KEY_DATE,日期);
        args.put(KEY_PRICE,价格);
        args.put(KEY_WHEREBOUGHT,wherebought);
        返回db.update(DATABASE_TABLE,ARGS,KEY_ROWID +=+ ROWID,NULL)> 0;
    }    公共光标rawQuery(串串,Object对象){
        // TODO自动生成方法存根
        返回null;
    }
}


解决方案

DBAdapter.rawQuery()未实现,它只是返回一个存根无效。试图调用 moveToFirst()在此引用导致NPE。

也就是说,变化

 公共光标rawQuery(串串,Object对象){
    // TODO自动生成方法存根
    返回null;
}

要像

 公共光标rawQuery(SQL字符串,字串[] args){
    返回db.rawQuery(SQL,参数);
}

I'm sure there's something simple behind the error Null Pont Exception error I am getting, but, I don't see it. Here's the relevant code:

package com.example.gameexpensetracker;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.Toast;

public class Chart_screen_activity extends Activity {       

    double strategyTotalDB;
    DBAdapter db = new DBAdapter(this); 



    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chart_screen_activity);
        db.open();  
    pieGraphData();
    }  

       public void pieGraphData() {
                    Cursor cursor17 = db.rawQuery("SELECT (strategy_total) FROM strategyTotal WHERE _id=(SELECT max(_id) FROM strategyTotal)",
                    null);
        if (cursor17.moveToFirst()){ 
        strategyTotalDB = cursor17.getDouble(0);
        cursor17.close();
        Toast.makeText(this, "New entry"+strategyTotalDB+ "added!", Toast.LENGTH_LONG).show();
        db.close();
        }}}

The LogCat says lines 23 and 32 are causing the problem:

12-29 10:46:39.979: D/AndroidRuntime(1754): Shutting down VM
12-29 10:46:39.979: W/dalvikvm(1754): threadid=1: thread exiting with uncaught exception (group=0x40015560)
12-29 10:46:39.989: E/AndroidRuntime(1754): FATAL EXCEPTION: main
12-29 10:46:39.989: E/AndroidRuntime(1754): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.gameexpensetracker/com.example.gameexpensetracker.Chart_screen_activity}: java.lang.NullPointerException
12-29 10:46:39.989: E/AndroidRuntime(1754):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
12-29 10:46:39.989: E/AndroidRuntime(1754):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
12-29 10:46:39.989: E/AndroidRuntime(1754):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
12-29 10:46:39.989: E/AndroidRuntime(1754):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
12-29 10:46:39.989: E/AndroidRuntime(1754):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-29 10:46:39.989: E/AndroidRuntime(1754):     at android.os.Looper.loop(Looper.java:123)
12-29 10:46:39.989: E/AndroidRuntime(1754):     at android.app.ActivityThread.main(ActivityThread.java:3683)
12-29 10:46:39.989: E/AndroidRuntime(1754):     at java.lang.reflect.Method.invokeNative(Native Method)
12-29 10:46:39.989: E/AndroidRuntime(1754):     at java.lang.reflect.Method.invoke(Method.java:507)
12-29 10:46:39.989: E/AndroidRuntime(1754):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
12-29 10:46:39.989: E/AndroidRuntime(1754):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
12-29 10:46:39.989: E/AndroidRuntime(1754):     at dalvik.system.NativeStart.main(Native Method)
12-29 10:46:39.989: E/AndroidRuntime(1754): Caused by: java.lang.NullPointerException
12-29 10:46:39.989: E/AndroidRuntime(1754):     at com.example.gameexpensetracker.Chart_screen_activity.pieGraphData(Chart_screen_activity.java:32)
12-29 10:46:39.989: E/AndroidRuntime(1754):     at com.example.gameexpensetracker.Chart_screen_activity.onCreate(Chart_screen_activity.java:23)
12-29 10:46:39.989: E/AndroidRuntime(1754):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
12-29 10:46:39.989: E/AndroidRuntime(1754):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
12-29 10:46:39.989: E/AndroidRuntime(1754):     ... 11 more

Here's my DBAdapter:

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

public class DBAdapter {
    static final String KEY_ROWID = "_id";
    static final String KEY_TITLE = "title";
    static final String KEY_PLATFORM = "platform";
    static final String KEY_GENRE = "genre";
    static final String KEY_DATE = "date";
    static final String KEY_PRICE = "price";
    static final String KEY_TOTAL = "total";
    static final String KEY_WHEREBOUGHT = "wherebought";
    static final String TAG = "DBAdapter";

    static final String DATABASE_NAME = "gamesDB";
    static final String DATABASE_TABLE = "purchases";
    static final int DATABASE_VERSION = 1;

    static final String DATABASE_CREATE = "CREATE TABLE IF NOT EXISTS purchases(_id integer primary key autoincrement, "
            + "title text , platform text, genre text , date text , price double , wherebought text );";

    static final String DATABASE_CREATE2 = "CREATE TABLE IF NOT EXISTS grandTotal(_id integer primary key autoincrement, "
            + "total double);";

    static final String DATABASE_CREATE3 = "CREATE TABLE IF NOT EXISTS strategyTotal(_id integer primary key autoincrement, "
            + "strategy_prices double, strategy_total double);";

    static final String DATABASE_CREATE4 = "CREATE TABLE IF NOT EXISTS adventureTotal(_id integer primary key autoincrement, "
            + "adventure_prices double, adventure_total double);";

    static final String DATABASE_CREATE5 = "CREATE TABLE IF NOT EXISTS actionTotal(_id integer primary key autoincrement, "
            + "action_prices double, action_total double);";

    static final String DATABASE_CREATE6 = "CREATE TABLE IF NOT EXISTS MMOTotal(_id integer primary key autoincrement, "
            + "mmo_prices double, mmo_total double);";

    static final String DATABASE_CREATE7 = "CREATE TABLE IF NOT EXISTS racingTotal(_id integer primary key autoincrement, "
            + "racing_prices double, racing_total double);";

    static final String DATABASE_CREATE8 = "CREATE TABLE IF NOT EXISTS rpgTotal(_id integer primary key autoincrement, "
            + "rpg_prices double, rpg_total double);";

    static final String DATABASE_CREATE9 = "CREATE TABLE IF NOT EXISTS simulationTotal(_id integer primary key autoincrement, "
            + "simulation_prices double, simulation_total double);";

    static final String DATABASE_CREATE10 = "CREATE TABLE IF NOT EXISTS sportsTotal(_id integer primary key autoincrement, "
            + "sports_prices double, sports_total double);";

    static final String DATABASE_CREATE11 = "CREATE TABLE IF NOT EXISTS otherTotal(_id integer primary key autoincrement, "
            + "other_prices double, other_total double);";

    static final String DATABASE_CREATE12 = "CREATE TABLE IF NOT EXISTS puzzleTotal(_id integer primary key autoincrement, "
            + "puzzle_prices double, puzzle_total double);";


    double columntotal, strategyPriceInput, actionPriceInput, adventurePriceInput, MMOPriceInput, racingPriceInput, rpgPriceInput, simulationPriceInput, 
    sportsPriceInput, puzzlePriceInput, otherPriceInput;



    final Context context;

    DatabaseHelper DBHelper;
    SQLiteDatabase db;

    public DBAdapter(Context ctx) {
        this.context = ctx;
        DBHelper = new DatabaseHelper(context);
    }

    private static class DatabaseHelper extends SQLiteOpenHelper {
        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            try {
                db.execSQL(DATABASE_CREATE);
                db.execSQL(DATABASE_CREATE2);
                db.execSQL(DATABASE_CREATE3);
                db.execSQL(DATABASE_CREATE4);
                db.execSQL(DATABASE_CREATE5);
                db.execSQL(DATABASE_CREATE6);
                db.execSQL(DATABASE_CREATE7);
                db.execSQL(DATABASE_CREATE8);
                db.execSQL(DATABASE_CREATE9);
                db.execSQL(DATABASE_CREATE10);
                db.execSQL(DATABASE_CREATE11);
                db.execSQL(DATABASE_CREATE12);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL(DATABASE_CREATE2);
        }
    }

    // ---opens the database---
    public DBAdapter open() throws SQLException {
        db = DBHelper.getWritableDatabase();
        return this;
    }

    // ---closes the database---
    public void close() {
        DBHelper.close();
    }

    // ---insert a record into the database---
    public long insertRecord(String title, String platform, String genre,
            String date, double price, String wherebought) {
        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_TITLE, title);
        initialValues.put(KEY_PLATFORM, platform);
        initialValues.put(KEY_GENRE, genre);
        initialValues.put(KEY_DATE, date);
        initialValues.put(KEY_PRICE, price);
        initialValues.put(KEY_WHEREBOUGHT, wherebought);
        return db.insert(DATABASE_TABLE, null, initialValues);

    }





    // delete all records

    public void deleteAll() {
        context.deleteDatabase(DATABASE_NAME);

    }

    // ---deletes a particular record---
    public boolean deleteRecord(long rowId) {
        return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
    }

    // ---retrieves all the records---
    public Cursor getAllRecords() {
        return db.query(DATABASE_TABLE, new String[] { KEY_ROWID, KEY_TITLE,
                KEY_GENRE, KEY_DATE, KEY_PRICE, KEY_WHEREBOUGHT }, null, null,
                null, null, null);
    }

    // ---retrieves a particular record---
    public Cursor getRecord(long rowId) throws SQLException {
        Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {
                KEY_ROWID, KEY_TITLE, KEY_PLATFORM, KEY_GENRE, KEY_DATE,
                KEY_PRICE, KEY_WHEREBOUGHT }, KEY_ROWID + "=" + rowId, null,
                null, null, null, null);
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;
    }

    // ---updates a record---
    public boolean updateRecord(long rowId, String title, String platform,
            String genre, String date, double price, String wherebought) {
        ContentValues args = new ContentValues();
        args.put(KEY_TITLE, title);
        args.put(KEY_PLATFORM, platform);
        args.put(KEY_GENRE, genre);
        args.put(KEY_DATE, date);
        args.put(KEY_PRICE, price);
        args.put(KEY_WHEREBOUGHT, wherebought);
        return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
    }

    public Cursor rawQuery(String string, Object object) {
        // TODO Auto-generated method stub
        return null;
    }




}

解决方案

Your DBAdapter.rawQuery() is not implemented, it's just a stub that returns null. Attempting to call moveToFirst() on this null reference causes the NPE.

That is, change

public Cursor rawQuery(String string, Object object) {
    // TODO Auto-generated method stub
    return null;
}

to something like

public Cursor rawQuery(String sql, String[] args) {
    return db.rawQuery(sql, args);
}

这篇关于寻找空指针异常的原因的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆