java - Activity 因 NullPointerException 而崩溃(也许是我的 SQLite 数据库命令?)

标签 java android

由于 java.lang.nullpointerexception,我将强制关闭此 Activity 。 它很可能与我的 SQLite 数据库命令有关,这是我第一次使用它们。

这是我的代码;

package com.example.gymbuddy;

import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.TextView;

public class Benchmark extends Activity {

//Declaring Database and Table
private final String MY_DATABASE_NAME = "GymBuddy.db";
private final String MY_DATABASE_TABLE = "benchmark";
private static final int iVersion = 1;

//Defining Table
private static class TableClass {
private static final String BenchmarkData = "dataBenchmark";
private static final String COL_VAR = "variable";
private static final String COL_VAL = "value";
}

//To refer to the Database
private SQLiteDatabase db;


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

    db.execSQL(String.format("CREATE_TABLE %s(%s INTEGER PRIMARY KEY, %s TEXT)",
            TableClass.BenchmarkData, TableClass.COL_VAR, TableClass.COL_VAL));

}

public void onStart() {
    super.onStart();

    findViewById(R.id.button5).setOnClickListener(new handleButton5());

}

class handleButton5 implements OnClickListener {
    public void onClick(View v) {

        EditText editText1 = (EditText)findViewById(R.id.editText1);
        String sWeight = editText1.getText().toString();
        final double dWeight = Double.parseDouble(sWeight);

        EditText editText2 = (EditText)findViewById(R.id.editText2);
        String sPush = editText2.getText().toString();
        final double dPush = Double.parseDouble(sPush);

        EditText editText3 = (EditText)findViewById(R.id.editText3);
        String sSit = editText3.getText().toString();
        final double dSit = Double.parseDouble(sSit);

        EditText editText4 = (EditText)findViewById(R.id.editText4);
        String sPull = editText4.getText().toString();
        final double dPull = Double.parseDouble(sPull);

        double dBench = (((Math.floor(dWeight*.0664))*10)-10)+dPush;
        double dFlies = (Math.floor(((Math.floor(dBench*.6)/10)*10)));
        double dLats = ((Math.floor(dWeight*.05))*10)+dPull;
        double dCurls = ((Math.ceil(((dWeight*dPull)*.025)/10))*10);
        if(dCurls<20){
            dCurls = 20;
        }
        double dClose = ((Math.floor(dBench*.065))*10);
        double dRaise = 15;
        double dDcurls = Math.floor(dCurls*.4);
        double dDraise = 10;
        double dLegExt = dWeight*.5;
        double dPress = dWeight-20;
        double dSquat = (Math.floor((Math.floor(dWeight/10))*.6))*10;
        double dTricepExt = dDcurls+10;
        double dTricepKick = dDcurls;
        double dCalf = (Math.floor(dWeight*.035))*10;
        double dDead = (Math.floor(dWeight*.13))*10;

        int iBench = (int)dBench;
        int iFlies = (int)dFlies;
        int iLats = (int)dLats;
        int iCurls = (int)dCurls;
        int iClose = (int)dClose;
        int iRaise = (int)dRaise;
        int iDcurls = (int)dDcurls;
        int iDraise = (int)dDraise;
        int iLegExt = (int)dLegExt;
        int iPress = (int)dPress;
        int iSquat = (int)dSquat;
        int iTricepExt = (int)dTricepExt;
        int iTricepKick = (int)dTricepKick;
        int iCalf = (int)dCalf;
        int iDead = (int)dDead;
        int iSit = (int)dSit;

        TextView TextView1 = (TextView)findViewById(R.id.textView1);
        TextView1.setText(String.valueOf("Bench Press "+ iBench +" lbs"));

        TextView TextView2 = (TextView)findViewById(R.id.textView2);
        TextView2.setText(String.valueOf("Bar Curls "+ iCurls +" lbs"));

        TextView TextView3 = (TextView)findViewById(R.id.textView3);
        TextView3.setText(String.valueOf("Close Grip "+ iClose +" lbs"));

        TextView TextView4 = (TextView)findViewById(R.id.textView4);
        TextView4.setText(String.valueOf("Deltoid Raise "+ iRaise +" lbs"));

        TextView TextView5 = (TextView)findViewById(R.id.textView5);
        TextView5.setText(String.valueOf("Dumbbell Curls "+ iDcurls +" lbs"));

        TextView TextView6 = (TextView)findViewById(R.id.textView6);
        TextView6.setText(String.valueOf("Dumbbell Raise "+ iDraise +" lbs"));

        TextView TextView7 = (TextView)findViewById(R.id.textView7);
        TextView7.setText(String.valueOf("Lat Pull Down "+ iLats +" lbs"));

        TextView TextView8 = (TextView)findViewById(R.id.textView8);
        TextView8.setText(String.valueOf("Leg Extension "+ iLegExt +" lbs"));

        TextView TextView9 = (TextView)findViewById(R.id.textView9);
        TextView9.setText(String.valueOf("Leg Press "+ iPress +" lbs"));

        TextView TextView10 = (TextView)findViewById(R.id.textView10);
        TextView10.setText(String.valueOf("Pec Flies "+ iFlies +" lbs"));

        TextView TextView11 = (TextView)findViewById(R.id.textView11);
        TextView11.setText(String.valueOf("Squats "+ iSquat +" lbs"));

        TextView TextView12 = (TextView)findViewById(R.id.textView12);
        TextView12.setText(String.valueOf("Tricep Extension "+ iTricepExt +" lbs"));

        TextView TextView13 = (TextView)findViewById(R.id.textView13);
        TextView13.setText(String.valueOf("Tricep Kickbacks "+ iTricepKick +" lbs"));

        TextView TextView14 = (TextView)findViewById(R.id.textView14);
        TextView14.setText(String.valueOf("Calf Raises "+ iCalf));

        TextView TextView15 = (TextView)findViewById(R.id.textView15);
        TextView15.setText(String.valueOf("Dead Lift "+ iDead +" lbs"));

        TextView TextView16 = (TextView)findViewById(R.id.textView16);
        TextView16.setText(String.valueOf("Sit Ups "+ iSit));

        }
    }

}

这是我的 LogCat;

09-22 18:12:34.190: D/dalvikvm(540): Not late-enabling CheckJNI (already on)
09-22 18:12:35.649: D/dalvikvm(540): GC_FOR_ALLOC freed 77K, 3% free 9962K/10179K, paused 67ms
09-22 18:12:35.669: I/dalvikvm-heap(540): Grow heap (frag case) to 11.786MB for 2069904-byte allocation
09-22 18:12:35.779: D/dalvikvm(540): GC_CONCURRENT freed 1K, 3% free 11982K/12231K, paused 4ms+14ms
09-22 18:12:35.979: D/dalvikvm(540): GC_FOR_ALLOC freed <1K, 3% free 11983K/12231K, paused 39ms
09-22 18:12:36.010: I/dalvikvm-heap(540): Grow heap (frag case) to 13.685MB for 1991824-byte allocation
09-22 18:12:36.129: D/dalvikvm(540): GC_CONCURRENT freed <1K, 3% free 13928K/14215K, paused 5ms+26ms
09-22 18:12:36.439: D/gralloc_goldfish(540): Emulator without GPU emulation detected.
09-22 18:12:42.999: D/AndroidRuntime(540): Shutting down VM
09-22 18:12:43.010: W/dalvikvm(540): threadid=1: thread exiting with uncaught exception (group=0x409961f8)
09-22 18:12:43.029: E/AndroidRuntime(540): FATAL EXCEPTION: main
09-22 18:12:43.029: E/AndroidRuntime(540): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.gymbuddy/com.example.gymbuddy.Benchmark}: java.lang.NullPointerException
09-22 18:12:43.029: E/AndroidRuntime(540):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
09-22 18:12:43.029: E/AndroidRuntime(540):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
09-22 18:12:43.029: E/AndroidRuntime(540):  at android.app.ActivityThread.access$600(ActivityThread.java:122)
09-22 18:12:43.029: E/AndroidRuntime(540):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
09-22 18:12:43.029: E/AndroidRuntime(540):  at android.os.Handler.dispatchMessage(Handler.java:99)
09-22 18:12:43.029: E/AndroidRuntime(540):  at android.os.Looper.loop(Looper.java:137)
09-22 18:12:43.029: E/AndroidRuntime(540):  at android.app.ActivityThread.main(ActivityThread.java:4340)
09-22 18:12:43.029: E/AndroidRuntime(540):  at java.lang.reflect.Method.invokeNative(Native Method)
09-22 18:12:43.029: E/AndroidRuntime(540):  at java.lang.reflect.Method.invoke(Method.java:511)
09-22 18:12:43.029: E/AndroidRuntime(540):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-22 18:12:43.029: E/AndroidRuntime(540):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-22 18:12:43.029: E/AndroidRuntime(540):  at dalvik.system.NativeStart.main(Native Method)
09-22 18:12:43.029: E/AndroidRuntime(540): Caused by: java.lang.NullPointerException
09-22 18:12:43.029: E/AndroidRuntime(540):  at com.example.gymbuddy.Benchmark.onCreate(Benchmark.java:34)
09-22 18:12:43.029: E/AndroidRuntime(540):  at android.app.Activity.performCreate(Activity.java:4465)
09-22 18:12:43.029: E/AndroidRuntime(540):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
09-22 18:12:43.029: E/AndroidRuntime(540):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
09-22 18:12:43.029: E/AndroidRuntime(540):  ... 11 more

最佳答案

所以,问题是这样的:

db.execSQL([...]);

你调用它但是你的数据库没有初始化所以首先你需要初始化它:

一小段代码:

DataSource handler = new DataSource(this);
SQLiteDatabase db = handler.getWritableDatabase();

...接下来使用 Cursors 等...

你的方法太糟糕了。非常好的和清晰的方法是使用 SQLiteOpenHelper,这个类包装了您实现目标所需的一切。

这是一个简单的例子:

public class DataSource extends SQLiteOpenHelper {

    protected static final String DB_NAME = "BmiCalcHistoryDatabase";
    protected static final int START_DB_VERSION = 1;

    /* columns */
    protected static final String TABLE_NAME = "CalcHistory";
    protected static final String KEY_ID = "id";
    protected static final String KEY_RESULT = "result";
    protected static final String KEY_TYPE = "type";
    protected static final String KEY_DATE = "calcDate";

    public DataSource(Context cntx) {
        super(cntx, DB_NAME, null, START_DB_VERSION);
    }

    public void onCreate(SQLiteDatabase db) {
        String CREATE_QUERY = "CREATE TABLE " + TABLE_NAME + "("
                + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                + KEY_RESULT + " TEXT NOT NULL, "
                + KEY_TYPE + " TEXT NOT NULL, "
                + KEY_DATE + " TEXT NOT NULL" + ");";
        db.execSQL(CREATE_QUERY);
    }

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String DELETE_QUERY = "DROP TABLE IF EXISTS " + TABLE_NAME;
        db.execSQL(DELETE_QUERY);
        onCreate(db);
    }
}

你需要阅读一些教程,所以检查一下:

关于java - Activity 因 NullPointerException 而崩溃(也许是我的 SQLite 数据库命令?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12546521/

相关文章:

android - 如何通过声音推送云消息?

android - 如何在 Android 中设置 EditText 的最大字符数?

java - 如何在odata4j的ODataConsumer中添加头信息?

java - 端口绑定(bind) - 12 Factor App

java - 创建另一个线程

android - 如何计算android gcm有效负载长度

android - Android中设备的速度

android - 如何在 Android Things 上设置设备所有者?

java - 在 jar 文件 Java Spring 中加载资源

java - 使用 Enumeration<E> 的 hasMoreElements() 和 nextElement() 方法打印列表,第一次成功,添加一些元素后第二次失败