草庐IT

android - 单击新用户按钮后应用程序强制关闭

coder 2023-12-28 原文

我有一个 onClick() 方法,它在被调用时启动一个新 Activity ,并在当前 Activity 上调用 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

我的源代码...

DatabaseActivity.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();
}

NewUserActivity.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();
}

最佳答案

java.lang.NullPointerException  because your object mydb is null

1.onCreate()

中使用 mydb = new DbHelper(context);

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

或在 onDestroy()

中检查 null

喜欢

protected void onDestroy() {
    super.onDestroy();
    if(myDb!=null)
    {
    myDb.close();
    }
}

关于android - 单击新用户按钮后应用程序强制关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17954131/

有关android - 单击新用户按钮后应用程序强制关闭的更多相关文章

  1. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  2. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  3. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  4. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  5. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  6. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  7. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  8. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

    我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

  9. ruby - 如何关闭 ruby​​ gem "Spreadsheet?"中的文件 - 2

    下面的代码在我第一次运行它时就可以正常工作:require'rubygems'require'spreadsheet'book=Spreadsheet.open'/Users/me/myruby/Mywks.xls'sheet=book.worksheet0row=sheet.row(1)putsrow[1]book.write'/Users/me/myruby/Mywks.xls'当我再次运行它时,我会收到更多消息,例如:/Library/Ruby/Gems/1.8/gems/spreadsheet-0.6.5.9/lib/spreadsheet/excel/reader.rb:11

  10. ruby-on-rails - 如何在 Gem 中获取 Rails 应用程序的根目录 - 2

    是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在

随机推荐