3

我有一个 onClick() 方法,该方法在调用时启动一个新活动,并在当前活动上调用 finish()。当这个方法被调用时;但是,会引发以下异常。在 onDestroy() 方法(抛出异常的位置)中只进行了两次调用。看起来不推荐使用的方法是原因的根源。任何人都可以解释为什么会这样吗?

07-30 23:20:01.774: D/dalvikvm(623): GC_EXTERNAL_ALLOC freed 746 objects / 54680 bytes in 689ms
    07-30 23:20:09.114: E/global(623): Deprecated Thread methods are not supported.
    07-30 23:20:09.114: E/global(623): java.lang.UnsupportedOperationException
    07-30 23:20:09.114: E/global(623):  at java.lang.VMThread.stop(VMThread.java:85)
    07-30 23:20:09.114: E/global(623):  at java.lang.Thread.stop(Thread.java:1379)
    07-30 23:20:09.114: E/global(623):  at java.lang.Thread.stop(Thread.java:1344)
    07-30 23:20:09.114: E/global(623):  at com.home.saket.SplashScreen$1.run(SplashScreen.java:38)
    07-30 23:20:09.665: D/dalvikvm(623): GC_EXTERNAL_ALLOC freed 393 objects / 22200 bytes in 106ms
    07-30 23:20:13.223: I/System.out(623): In constructor
    07-30 23:20:13.363: D/NewUserActivity(623): Checkkkkkkkk
    07-30 23:20:13.363: D/NewUserActivity(623): Checkkkkkkkk22222
    07-30 23:20:14.914: D/AndroidRuntime(623): Shutting down VM
    07-30 23:20:14.964: W/dalvikvm(623): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
    07-30 23:20:15.044: E/AndroidRuntime(623): FATAL EXCEPTION: main
    07-30 23:20:15.044: E/AndroidRuntime(623): java.lang.RuntimeException: Unable to destroy activity {com.home.saket/com.home.saket.DatabaseActivity}: java.lang.NullPointerException
    07-30 23:20:15.044: E/AndroidRuntime(623):  at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3655)
    07-30 23:20:15.044: E/AndroidRuntime(623):  at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3673)
    07-30 23:20:15.044: E/AndroidRuntime(623):  at android.app.ActivityThread.access$2900(ActivityThread.java:125)
    07-30 23:20:15.044: E/AndroidRuntime(623):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
    07-30 23:20:15.044: E/AndroidRuntime(623):  at android.os.Handler.dispatchMessage(Handler.java:99)
    07-30 23:20:15.044: E/AndroidRuntime(623):  at android.os.Looper.loop(Looper.java:123)
    07-30 23:20:15.044: E/AndroidRuntime(623):  at android.app.ActivityThread.main(ActivityThread.java:4627)
    07-30 23:20:15.044: E/AndroidRuntime(623):  at java.lang.reflect.Method.invokeNative(Native Method)
    07-30 23:20:15.044: E/AndroidRuntime(623):  at java.lang.reflect.Method.invoke(Method.java:521)
    07-30 23:20:15.044: E/AndroidRuntime(623):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    07-30 23:20:15.044: E/AndroidRuntime(623):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    07-30 23:20:15.044: E/AndroidRuntime(623):  at dalvik.system.NativeStart.main(Native Method)
    07-30 23:20:15.044: E/AndroidRuntime(623): Caused by: java.lang.NullPointerException
    07-30 23:20:15.044: E/AndroidRuntime(623):  at com.home.saket.DatabaseActivity.onDestroy(DatabaseActivity.java:127)
    07-30 23:20:15.044: E/AndroidRuntime(623):  at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3642)
    07-30 23:20:15.044: E/AndroidRuntime(623):  ... 11 more
    07-30 23:20:17.444: I/Process(623): Sending signal. PID: 623 SIG: 9

我的源代码...

数据库活动.java

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mUsername = (EditText) findViewById(R.id.editUsername);
    mPassword = (EditText) findViewById(R.id.editPassword);
    mNewUser = (Button) findViewById(R.id.buttonNewUser);
    mLogin = (Button) findViewById(R.id.buttonLogin);
    mShowAll = (Button) findViewById(R.id.buttonShowAll);

    mShowAll.setOnClickListener(this);
    mNewUser.setOnClickListener(this);
    mLogin.setOnClickListener(this);
}

public void onClick(View v) {

    switch (v.getId()) {

    case R.id.buttonLogin:

        String uname = mUsername.getText().toString();
        String pass = mPassword.getText().toString();

        if (uname.equals("") || uname == null) {
            Toast.makeText(getApplicationContext(), "Username Empty",
                    Toast.LENGTH_SHORT).show();
        } else if (pass.equals("") || pass == null) {
            Toast.makeText(getApplicationContext(), "Password Empty",
                    Toast.LENGTH_SHORT).show();
        } else {
            boolean validLogin = validateLogin(uname, pass,
                    DatabaseActivity.this);
            if (validLogin) {
                System.out.println("In Valid");
                Intent i_login = new Intent(DatabaseActivity.this,
                        UserLoggedInPage.class);
                startActivity(i_login);
                finish();
            }
        }
        break;

    case R.id.buttonNewUser:

        try {
            Intent i = new Intent(DatabaseActivity.this,
                    NewUserActivity.class);
            startActivity(i);
        } catch (Exception e) {
            // TODO: handle exception
        }

        finish();
        break;

    case R.id.buttonShowAll:
        Intent i_admin = new Intent(DatabaseActivity.this, AdminPage.class);
        startActivity(i_admin);
        finish();
        break;
    }
}

public boolean validateLogin(String uname, String pass, Context context) {

    mydb = new DbHelper(context);
    SQLiteDatabase db = mydb.getReadableDatabase();
    // SELECT
    String[] columns = { "_id" };

    // WHERE clause
    String selection = "username=? AND password=?";

    // WHERE clause arguments
    String[] selectionArgs = { uname, pass };

    Cursor cursor = null;
    try {
        // SELECT _id FROM login WHERE username=uname AND password=pass
        cursor = db.query(DbHelper.SAKET_TABLE_NAME, columns, selection,
                selectionArgs, null, null, null);

        startManagingCursor(cursor);
    } catch (Exception e) {
        e.printStackTrace();
    }
    int numberOfRows = cursor.getCount();

    if (numberOfRows <= 0) {

        Toast.makeText(getApplicationContext(),
                "Login Failed..\nTry Again", Toast.LENGTH_SHORT).show();
        return false;
    }

    return true;
}

protected void onDestroy() {
    super.onDestroy();
    mydb.close();
}

}

新用户活动.java

    protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.signup);
    Log.d(TAG, "Checkkkkkkkk");

    mRegister = (Button) findViewById(R.id.buttonRegister);
    mCancel = (Button) findViewById(R.id.buttonCancel);
    mUsername = (EditText) findViewById(R.id.editUsername);
    mPassword = (EditText) findViewById(R.id.editPassword);
    mEmail = (EditText) findViewById(R.id.editEmail);

    mRegister.setOnClickListener(this);
    mCancel.setOnClickListener(this);
    Log.d(TAG, "Checkkkkkkkk22222");
}

public void onClick(View v) {

    switch (v.getId()) {

    case R.id.buttonCancel:
        Intent i = new Intent(NewUserActivity.this, DatabaseActivity.class);
        startActivity(i);
        finish();
        break;

    case R.id.buttonRegister:
        String uname = mUsername.getText().toString();
        String pass = mPassword.getText().toString();
        String email = mEmail.getText().toString();
        boolean invalid = false;

        if (uname.equals("")) {
            invalid = true;
            Toast.makeText(getApplicationContext(), "Username Missing",
                    Toast.LENGTH_SHORT).show();
        } else if (pass.equals("")) {
            invalid = true;
            Toast.makeText(getApplicationContext(), "Password Missing",
                    Toast.LENGTH_SHORT).show();
        } else if (email.equals("")) {
            invalid = true;
            Toast.makeText(getApplicationContext(), "Email ID Missing",
                    Toast.LENGTH_SHORT).show();
        }

        if (invalid == false) {
            try {
                addEntry(uname, pass, email);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Intent i_register = new Intent(NewUserActivity.this,
                    DatabaseActivity.class);
            startActivity(i_register);
            finish();
        }

        break;
    }
}

public void addEntry(String uname, String pass, String email)
        throws Exception {

    SQLiteDatabase db = myDb.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put("username", uname);
    values.put("password", pass);
    values.put("email", email);

    try {
        db.insert(DbHelper.SAKET_TABLE_NAME, null, values);
        Toast.makeText(getApplicationContext(), "Inserted",
                Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
protected void onDestroy() {
    super.onDestroy();
    myDb.close();
}
4

1 回答 1

4
java.lang.NullPointerException  because your object mydb is null

1.mydb = new DbHelper(context);在你的onCreate()

或者

2.要么删除mydb.close(); from onDestroy()

或检查null您的onDestroy()

protected void onDestroy() {
    super.onDestroy();
    if(myDb!=null)
    {
    myDb.close();
    }
}
于 2013-07-30T18:05:21.237 回答