【问题标题】:Basic SQLite app throwing runtime exception基本 SQLite 应用程序抛出运行时异常
【发布时间】:2014-03-18 14:49:56
【问题描述】:

我是 android 编程新手,我正在尝试开发一个抛出运行时异常的基本 SQLite 应用程序。为此,我将代码分为三个类,分别是 Mainactivity、DBhelper 和 Message。我没有得到问题在代码中的实际位置。我在下面给出了在 AVD 中运行时的 Logcat。

03-18 20:07:56.904: E/Trace(736): error opening trace file: No such file or directory (2)
03-18 20:07:57.434: D/AndroidRuntime(736): Shutting down VM
03-18 20:07:57.474: W/dalvikvm(736): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
03-18 20:07:57.494: E/AndroidRuntime(736): FATAL EXCEPTION: main
03-18 20:07:57.494: E/AndroidRuntime(736): java.lang.RuntimeException: Unable to start activity ComponentInfo{one.example.sqlitetesting/one.example.sqlitetesting.MainActivity}: java.lang.NullPointerException
03-18 20:07:57.494: E/AndroidRuntime(736):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
03-18 20:07:57.494: E/AndroidRuntime(736):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
03-18 20:07:57.494: E/AndroidRuntime(736):  at android.app.ActivityThread.access$600(ActivityThread.java:130)
03-18 20:07:57.494: E/AndroidRuntime(736):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
03-18 20:07:57.494: E/AndroidRuntime(736):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-18 20:07:57.494: E/AndroidRuntime(736):  at android.os.Looper.loop(Looper.java:137)
03-18 20:07:57.494: E/AndroidRuntime(736):  at android.app.ActivityThread.main(ActivityThread.java:4745)
03-18 20:07:57.494: E/AndroidRuntime(736):  at java.lang.reflect.Method.invokeNative(Native Method)
03-18 20:07:57.494: E/AndroidRuntime(736):  at java.lang.reflect.Method.invoke(Method.java:511)
03-18 20:07:57.494: E/AndroidRuntime(736):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
03-18 20:07:57.494: E/AndroidRuntime(736):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-18 20:07:57.494: E/AndroidRuntime(736):  at dalvik.system.NativeStart.main(Native Method)
03-18 20:07:57.494: E/AndroidRuntime(736): Caused by: java.lang.NullPointerException
03-18 20:07:57.494: E/AndroidRuntime(736):  at android.widget.Toast.<init>(Toast.java:92)
03-18 20:07:57.494: E/AndroidRuntime(736):  at android.widget.Toast.makeText(Toast.java:238)
03-18 20:07:57.494: E/AndroidRuntime(736):  at one.example.sqlitetesting.Message.<init>(Message.java:9)
03-18 20:07:57.494: E/AndroidRuntime(736):  at one.example.sqlitetesting.DbHelper.<init>(DbHelper.java:19)
03-18 20:07:57.494: E/AndroidRuntime(736):  at one.example.sqlitetesting.MainActivity.onCreate(MainActivity.java:14)
03-18 20:07:57.494: E/AndroidRuntime(736):  at android.app.Activity.performCreate(Activity.java:5008)
03-18 20:07:57.494: E/AndroidRuntime(736):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
03-18 20:07:57.494: E/AndroidRuntime(736):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
03-18 20:07:57.494: E/AndroidRuntime(736):  ... 11 more
03-18 20:08:01.104: I/Process(736): Sending signal. PID: 736 SIG: 9`

这是 Mainactivity 类:

package one.example.sqlitetesting;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

DbHelper X;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    X=new DbHelper(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

这里是 DBhelper 类:

package one.example.sqlitetesting;

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

public class DbHelper extends SQLiteOpenHelper {

static String AKHIL_DATABASE="mydatabase";
String TABLE_NAME="usersdata";
static int version=1;
Context context;

//this is a super class constructor which 
public DbHelper(Context context) {
    super(context, AKHIL_DATABASE, null, version);//parameters: context,name of DB, custom cursor(null:defaul),version
    context=this.context;
    Message m=new Message(context, "constructer called");
}



@Override
public void onCreate(SQLiteDatabase db) {

    //create table usersdata (_id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(255));
    String query="create table "+TABLE_NAME+" usersdata (_id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(255));";
    try {
        db.execSQL(query);
        Message m=new Message(context, "onccreate is called");
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        Message m=new Message(context, ""+e);
    }
}


@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {

    try {
        db.execSQL("drop table userdata if exists;");
        onCreate(db);
    } catch (SQLException e) {
        // TODO Auto-generated catch block

    }

}

}

这是 Message 类,它提供不同级别的 toast 消息: package one.example.sqlitetesting;

import android.content.Context;
import android.widget.Toast;

public class Message {
public Message(Context context,String message)
{
    Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}
}

【问题讨论】:

  • toast 上出现错误,可能您的上下文为空

标签: java android eclipse sqlite


【解决方案1】:

在您的DBHelper() 中有context=this.context; 应该是this.context = context 的行

您正在使用对象context 覆盖context 参数,该对象当时尚未初始化。因此,我希望您的 contextnull

【讨论】:

  • 现在我没有收到运行时异常,但即使我正在更改版本,onCreate 方法也没有执行。我在 fileexplorer>package @super-qua 中找不到数据库
  • OnCreate不是每次打开数据库时都会调用,而是在第一次创建数据库时调用。请参阅此答案以获得更多帮助:stackoverflow.com/a/5024277/3071356
猜你喜欢
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多