为什么我的应用程序抛出异常终结android系统中? [英] why is my application throwing finalizer exception in android?

查看:168
本文介绍了为什么我的应用程序抛出异常终结android系统中?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个应用程序中,不断有此异常被抛出...

  18 04-25:47:38.024:信息/ dalvikvm(10290):未捕获的异常被抛出终结(将被放弃):
04-25 18:47:38.035:信息/ dalvikvm(10290):Ljava /朗/ IllegalStateException异常;:最终化光标android.database.sqlite.SQLiteCursor@44dd1e68对空尚未停用或关闭
04-25 18:47:38.035:信息/ dalvikvm(10290):在android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-25 18:47:38.035:信息/ dalvikvm(10290):在dalvik.system.NativeStart.run(本机方法)
04-25 18:47:38.044:信息/ dalvikvm(10290):未捕获的异常被抛出终结(将被放弃):
04-25 18:47:38.064:信息/ dalvikvm(10290):Ljava /朗/ IllegalStateException异常;:最终化光标android.database.sqlite.SQLiteCursor@44e4c048对空尚未停用或关闭
04-25 18:47:38.064:信息/ dalvikvm(10290):在android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-25 18:47:38.064:信息/ dalvikvm(10290):在dalvik.system.NativeStart.run(本机方法)
04-25 18:47:38.074:信息/ dalvikvm(10290):未捕获的异常被抛出终结(将被放弃):
04-25 18:47:38.094:信息/ dalvikvm(10290):Ljava /朗/ IllegalStateException异常;:最终化光标android.database.sqlite.SQLiteCursor@44e35310对空尚未停用或关闭
04-25 18:47:38.094:信息/ dalvikvm(10290):在android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-25 18:47:38.094:信息/ dalvikvm(10290):在dalvik.system.NativeStart.run(本机方法)
04-25 18:47:38.104:信息/ dalvikvm(10290):未捕获的异常被抛出终结(将被放弃):
04-25 18:47:38.104:信息/ dalvikvm(10290):Ljava /朗/ IllegalStateException异常;:最终化光标android.database.sqlite.SQLiteCursor@44e7f738对空尚未停用或关闭
04-25 18:47:38.104:信息/ dalvikvm(10290):在android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-25 18:47:38.104:信息/ dalvikvm(10290):在dalvik.system.NativeStart.run(本机方法)
04-25 18:47:38.114:信息/ dalvikvm(10290):未捕获的异常被抛出终结(将被放弃):
04-25 18:47:38.136:信息/ dalvikvm(10290):Ljava /朗/ IllegalStateException异常;:最终化光标android.database.sqlite.SQLiteCursor@44e04a90对空尚未停用或关闭
04-25 18:47:38.136:信息/ dalvikvm(10290):在android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-25 18:47:38.136:信息/ dalvikvm(10290):在dalvik.system.NativeStart.run(本机方法)
04-25 18:47:38.155:信息/ dalvikvm(10290):未捕获的异常被抛出终结(将被放弃):
04-25 18:47:38.155:信息/ dalvikvm(10290):Ljava /朗/ IllegalStateException异常;:最终化光标android.database.sqlite.SQLiteCursor@44e944f0对空尚未停用或关闭
04-25 18:47:38.155:信息/ dalvikvm(10290):在android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-25 18:47:38.155:信息/ dalvikvm(10290):在dalvik.system.NativeStart.run(本机方法)
04-25 18:47:38.164:信息/ dalvikvm(10290):未捕获的异常被抛出终结(将被放弃):
04-25 18:47:38.184:信息/ dalvikvm(10290):Ljava /朗/ IllegalStateException异常;:最终化光标android.database.sqlite.SQLiteCursor@44e90548对空尚未停用或关闭
04-25 18:47:38.184:信息/ dalvikvm(10290):在android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-25 18:47:38.184:信息/ dalvikvm(10290):在dalvik.system.NativeStart.run(本机方法)
04-25 18:47:38.194:信息/ dalvikvm(10290):未捕获的异常被抛出终结(将被放弃):
04-25 18:47:38.194:信息/ dalvikvm(10290):Ljava /朗/ IllegalStateException异常;:最终化光标android.database.sqlite.SQLiteCursor@44e6b0c8对空尚未停用或关闭
04-25 18:47:38.194:信息/ dalvikvm(10290):在android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-25 18:47:38.194:信息/ dalvikvm(10290):在dalvik.system.NativeStart.run(本机方法)
04-25 18:47:38.204:信息/ dalvikvm(10290):未捕获的异常被抛出终结(将被放弃):
04-25 18:47:38.225:信息/ dalvikvm(10290):Ljava /朗/ IllegalStateException异常;:最终化光标android.database.sqlite.SQLiteCursor@44e4af40对空尚未停用或关闭
04-25 18:47:38.237:信息/ dalvikvm(10290):在android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-25 18:47:38.245:信息/ dalvikvm(10290):在dalvik.system.NativeStart.run(本机方法)

我不明白为什么会这样。我关闭了我所有的游标和我也有数据库之前关闭游标...
c.close()到来之前 db.close()

可能是什么问题?

感谢您提前。

编辑:
我认为这个类是导致异常,因为它是处理数据库只有一个

 包com.helios.NauticDates;进口java.text.DateFormat中;
进口java.text.ParseException;
进口java.text.SimpleDateFormat的;
进口java.util.Date;进口android.database.Cursor;
进口android.database.sqlite.SQLiteDatabase;
进口android.util.Log;公共类HandleDatabase {    公共无效的ExecuteSQL(查询字符串){
        SQLiteDatabase DB = SQLiteDatabase.openDatabase(
                /data/data/com.helios.NauticDates/CalendarEvent.sqlitedb
                空,SQLiteDatabase.OPEN_READWRITE);
        db.execSQL(查询);
        db.close();
    }    公共布尔checkCategory(字符串名称){
        // TODO自动生成方法存根
        SQLiteDatabase DB = SQLiteDatabase.openDatabase(
                /data/data/com.helios.NauticDates/CalendarEvent.sqlitedb
                空,SQLiteDatabase.OPEN_READWRITE);
        查询字符串=SELECT * FROM EventCategories其中,类别名称='
                +姓名+';
        光标C = db.rawQuery(查询,NULL);
        如果(c.getCount()== 0){
            c.close();
            db.close();
            返回true;
        }其他{
            c.close();
            db.close();
            返回false;
        }
    }    公众的String [] []的getData(字符串[] COLUMNNAMES,字符串表名){
        SQLiteDatabase DB = SQLiteDatabase.openDatabase(
                /data/data/com.helios.NauticDates/CalendarEvent.sqlitedb
                空,SQLiteDatabase.OPEN_READWRITE);
        查询字符串=选择;
        的for(int i = 0; I< columnnames.length;我++){
            如果(ⅰ== columnnames.length - 1)
                查询+ = COLUMNNAMES [I] +;
            其他
                查询+ = COLUMNNAMES [I] +,;
        }
        查询+ =从+表名+,其中事件ID = 128;
        光标C = db.rawQuery(查询,NULL);
        的String [] []结果=新的String [c.getColumnCount()] [c.getCount()];
        的for(int i = 0; I< c.getColumnCount();我++){
            c.moveToFirst();
            对于(INT J = 0; J< c.getCount(); J ++){
                结果[I] [J] = c.getString(c.getColumnIndex(COLUMNNAMES [I]));
                Log.i(的getData,结果[I] [J]);
                c.moveToNext();
            }
        }
        c.close();
        db.close();
        返回结果;
    }    公共布尔checkIfThereIsEvent(字符串CDATE,日期的currentdate){
        日期ENDDATE =(日期)currentdate.clone();
        enddate.setHours(0);
        enddate.setMinutes(0);
        enddate.setSeconds(0);
        字符串EDATE =(字符串)android.text.format.DateFormat.format(
                YYYY-MM-DD,结束日期);        Log.i(handledatabase,CDATE + - + EDATE);
        SQLiteDatabase DB = SQLiteDatabase.openDatabase(
                /data/data/com.helios.NauticDates/CalendarEvent.sqlitedb
                空,SQLiteDatabase.OPEN_READWRITE);
        查询字符串=选择日期时间(startdat,'unixepoch')AS STD,日期时间(enddat,'unixepoch')截至FROM EventDetails WHERE((性病LT ='
                + CDATE
                +'和结束> ='
                + CDATE
                +')||(日期(enddat,'unixepoch')='1970-01-01'和日期(startdat,'unixepoch')='
                + EDATE +'))LIMIT 1;
        Log.i(thequery查询);
        光标C = db.rawQuery(查询,NULL);
        如果(c.getCount()大于0){
            c.close();
            db.close();
            返回true;
        }
        {
            c.close();
            db.close();
            返回false;
        }
    }    公共布尔checkEventInDatabase(字符串dateofchange,字符串事件ID){
        SQLiteDatabase DB = SQLiteDatabase.openDatabase(
                /data/data/com.helios.NauticDates/CalendarEvent.sqlitedb
                空,SQLiteDatabase.OPEN_READWRITE);
        查询字符串='+事件ID +限制1,从哪里EventDetails事件ID =选择*';
        光标C = db.rawQuery(查询,NULL);
        如果(c.getCount()== 0){
            c.close();
            db.close();
            返回false;
        }
        其他{
            查询='+事件ID +,从那里EventDetails事件ID =选择*,',改变='+ dateofchange +限制1;
            C = db.rawQuery(查询,NULL);
            如果(c.getCount()大于0){
                c.close();
                db.close();
                返回true;
            }
            其他{
                c.close();
                db.close();
                返回true;
            }
    }
}    公共布尔checkIfEventChanged(字符串dateofchange,字符串事件ID){
        SQLiteDatabase DB = SQLiteDatabase.openDatabase(
                /data/data/com.helios.NauticDates/CalendarEvent.sqlitedb
                空,SQLiteDatabase.OPEN_READWRITE);
        查询字符串='+事件ID +,从那里EventDetails事件ID =选择*,',改变='+ dateofchange +限制1;
        光标C = db.rawQuery(查询,NULL);
        如果(c.getCount()大于0){
            c.close();
            db.close();
            返回false;
        }
        其他{
            c.close();
            db.close();
            返回true;
    }
    }
}


解决方案

您缺少一个其他 checkIfThereIsEvent年底()

如果那不明确起来,只需登录每个光标你通过为登录通话打开自己,然后比较日志条目找出哪些光标是一个被泄露。

还有:


  • 从不硬线路径。摆脱 /data/data/com.helios.NauticDates 的。要么使用 SQLiteOpenHelper 或使用 getDatabasePath()

  • 有一个在不断地打开和关闭数据库这样没有价值。请考虑使用 SQLiteOpenHelper ,把该类的这些方法,并保持你的 SQLiteOpenHelper 的时间更长(如寿命,你活动或服务,或为您的整个应用程序单身)

i have an application in which there is constantly this exception being thrown...

04-25 18:47:38.024: INFO/dalvikvm(10290): Uncaught exception thrown by finalizer (will be discarded):
04-25 18:47:38.035: INFO/dalvikvm(10290): Ljava/lang/IllegalStateException;: Finalizing cursor android.database.sqlite.SQLiteCursor@44dd1e68 on null that has not been deactivated or closed
04-25 18:47:38.035: INFO/dalvikvm(10290):     at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-25 18:47:38.035: INFO/dalvikvm(10290):     at dalvik.system.NativeStart.run(Native Method)
04-25 18:47:38.044: INFO/dalvikvm(10290): Uncaught exception thrown by finalizer (will be discarded):
04-25 18:47:38.064: INFO/dalvikvm(10290): Ljava/lang/IllegalStateException;: Finalizing cursor android.database.sqlite.SQLiteCursor@44e4c048 on null that has not been deactivated or closed
04-25 18:47:38.064: INFO/dalvikvm(10290):     at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-25 18:47:38.064: INFO/dalvikvm(10290):     at dalvik.system.NativeStart.run(Native Method)
04-25 18:47:38.074: INFO/dalvikvm(10290): Uncaught exception thrown by finalizer (will be discarded):
04-25 18:47:38.094: INFO/dalvikvm(10290): Ljava/lang/IllegalStateException;: Finalizing cursor android.database.sqlite.SQLiteCursor@44e35310 on null that has not been deactivated or closed
04-25 18:47:38.094: INFO/dalvikvm(10290):     at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-25 18:47:38.094: INFO/dalvikvm(10290):     at dalvik.system.NativeStart.run(Native Method)
04-25 18:47:38.104: INFO/dalvikvm(10290): Uncaught exception thrown by finalizer (will be discarded):
04-25 18:47:38.104: INFO/dalvikvm(10290): Ljava/lang/IllegalStateException;: Finalizing cursor android.database.sqlite.SQLiteCursor@44e7f738 on null that has not been deactivated or closed
04-25 18:47:38.104: INFO/dalvikvm(10290):     at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-25 18:47:38.104: INFO/dalvikvm(10290):     at dalvik.system.NativeStart.run(Native Method)
04-25 18:47:38.114: INFO/dalvikvm(10290): Uncaught exception thrown by finalizer (will be discarded):
04-25 18:47:38.136: INFO/dalvikvm(10290): Ljava/lang/IllegalStateException;: Finalizing cursor android.database.sqlite.SQLiteCursor@44e04a90 on null that has not been deactivated or closed
04-25 18:47:38.136: INFO/dalvikvm(10290):     at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-25 18:47:38.136: INFO/dalvikvm(10290):     at dalvik.system.NativeStart.run(Native Method)
04-25 18:47:38.155: INFO/dalvikvm(10290): Uncaught exception thrown by finalizer (will be discarded):
04-25 18:47:38.155: INFO/dalvikvm(10290): Ljava/lang/IllegalStateException;: Finalizing cursor android.database.sqlite.SQLiteCursor@44e944f0 on null that has not been deactivated or closed
04-25 18:47:38.155: INFO/dalvikvm(10290):     at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-25 18:47:38.155: INFO/dalvikvm(10290):     at dalvik.system.NativeStart.run(Native Method)
04-25 18:47:38.164: INFO/dalvikvm(10290): Uncaught exception thrown by finalizer (will be discarded):
04-25 18:47:38.184: INFO/dalvikvm(10290): Ljava/lang/IllegalStateException;: Finalizing cursor android.database.sqlite.SQLiteCursor@44e90548 on null that has not been deactivated or closed
04-25 18:47:38.184: INFO/dalvikvm(10290):     at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-25 18:47:38.184: INFO/dalvikvm(10290):     at dalvik.system.NativeStart.run(Native Method)
04-25 18:47:38.194: INFO/dalvikvm(10290): Uncaught exception thrown by finalizer (will be discarded):
04-25 18:47:38.194: INFO/dalvikvm(10290): Ljava/lang/IllegalStateException;: Finalizing cursor android.database.sqlite.SQLiteCursor@44e6b0c8 on null that has not been deactivated or closed
04-25 18:47:38.194: INFO/dalvikvm(10290):     at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-25 18:47:38.194: INFO/dalvikvm(10290):     at dalvik.system.NativeStart.run(Native Method)
04-25 18:47:38.204: INFO/dalvikvm(10290): Uncaught exception thrown by finalizer (will be discarded):
04-25 18:47:38.225: INFO/dalvikvm(10290): Ljava/lang/IllegalStateException;: Finalizing cursor android.database.sqlite.SQLiteCursor@44e4af40 on null that has not been deactivated or closed
04-25 18:47:38.237: INFO/dalvikvm(10290):     at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
04-25 18:47:38.245: INFO/dalvikvm(10290):     at dalvik.system.NativeStart.run(Native Method)

i don't understand why this is happening. i have closed all my cursors, and also i have closed the cursors before the databases... ie c.close() comes before db.close()

what could be the problem?

thank you in advance.

EDIT: i think this class is causing the exception because it is the only one dealing with databases

package com.helios.NauticDates;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

public class HandleDatabase {

    public void executeSql(String query) {
        SQLiteDatabase db = SQLiteDatabase.openDatabase(
                "/data/data/com.helios.NauticDates/CalendarEvent.sqlitedb",
                null, SQLiteDatabase.OPEN_READWRITE);
        db.execSQL(query);
        db.close();
    }

    public boolean checkCategory(String name) {
        // TODO Auto-generated method stub
        SQLiteDatabase db = SQLiteDatabase.openDatabase(
                "/data/data/com.helios.NauticDates/CalendarEvent.sqlitedb",
                null, SQLiteDatabase.OPEN_READWRITE);
        String query = "select * from EventCategories where categoryname ='"
                + name + "'";
        Cursor c = db.rawQuery(query, null);
        if (c.getCount() == 0) {
            c.close();
            db.close();
            return true;
        } else {
            c.close();
            db.close();
            return false;
        }
    }

    public String[][] getData(String[] columnnames, String tablename) {
        SQLiteDatabase db = SQLiteDatabase.openDatabase(
                "/data/data/com.helios.NauticDates/CalendarEvent.sqlitedb",
                null, SQLiteDatabase.OPEN_READWRITE);
        String query = "select ";
        for (int i = 0; i < columnnames.length; i++) {
            if (i == columnnames.length - 1)
                query += columnnames[i] + " ";
            else
                query += columnnames[i] + ",";
        }
        query += "from " + tablename + " where eventid=128";
        Cursor c = db.rawQuery(query, null);
        String[][] result = new String[c.getColumnCount()][c.getCount()];
        for (int i = 0; i < c.getColumnCount(); i++) {
            c.moveToFirst();
            for (int j = 0; j < c.getCount(); j++) {
                result[i][j] = c.getString(c.getColumnIndex(columnnames[i]));
                Log.i("getdata", result[i][j]);
                c.moveToNext();
            }
        }
        c.close();
        db.close();
        return result;
    }

    public boolean checkIfThereIsEvent(String cdate, Date currentdate) {
        Date enddate = (Date) currentdate.clone();
        enddate.setHours(0);
        enddate.setMinutes(0);
        enddate.setSeconds(0);
        String edate = (String) android.text.format.DateFormat.format(
                "yyyy-MM-dd", enddate);

        Log.i("handledatabase", cdate + "-" + edate);
        SQLiteDatabase db = SQLiteDatabase.openDatabase(
                "/data/data/com.helios.NauticDates/CalendarEvent.sqlitedb",
                null, SQLiteDatabase.OPEN_READWRITE);
        String query = "SELECT datetime(startdat, 'unixepoch') AS std, datetime(enddat, 'unixepoch') AS end FROM EventDetails WHERE ((std <= '"
                + cdate
                + "' AND end >= '"
                + cdate
                + "' )||( date(enddat,'unixepoch') = '1970-01-01' AND date(startdat,'unixepoch') = '"
                + edate + "')) LIMIT 1";
        Log.i("thequery", query);
        Cursor c = db.rawQuery(query, null);
        if (c.getCount() > 0) {
            c.close();
            db.close();
            return true;
        }
        {
            c.close();
            db.close();
            return false;
        }
    }

    public boolean checkEventInDatabase(String dateofchange, String eventid) {
        SQLiteDatabase db = SQLiteDatabase.openDatabase(
                "/data/data/com.helios.NauticDates/CalendarEvent.sqlitedb",
                null, SQLiteDatabase.OPEN_READWRITE);
        String query = "select * from EventDetails where eventid='"+eventid+"' limit 1";
        Cursor c = db.rawQuery(query, null);
        if(c.getCount()==0){
            c.close();
            db.close();
            return false;
        }
        else{
            query = "select * from EventDetails where eventid='"+eventid+"'and changed='"+dateofchange+"' limit 1";
            c= db.rawQuery(query, null);
            if(c.getCount()>0){
                c.close();
                db.close();
                return true;
            }
            else{
                c.close();
                db.close();
                return true;
            }
    }
}

    public boolean checkIfEventChanged(String dateofchange, String eventid) {
        SQLiteDatabase db = SQLiteDatabase.openDatabase(
                "/data/data/com.helios.NauticDates/CalendarEvent.sqlitedb",
                null, SQLiteDatabase.OPEN_READWRITE);
        String query = "select * from EventDetails where eventid='"+eventid+"'and changed='"+dateofchange+"' limit 1";
        Cursor c= db.rawQuery(query, null);
        if(c.getCount()>0){
            c.close();
            db.close();
            return false;
        }
        else{
            c.close();
            db.close();
            return true; 
    }
    }
}

解决方案

You are missing an else towards the end of checkIfThereIsEvent().

If that does not clear it up, simply log each Cursor you open yourself via a call to Log, and then compare the log entries to figure out which Cursor is the one being leaked.

Also:

  • Never hardwire paths. Get rid of /data/data/com.helios.NauticDates. Either use SQLiteOpenHelper or use getDatabasePath().
  • There is no value in continuously opening and closing your database this way. Please consider using SQLiteOpenHelper, putting these methods on that class, and keeping your SQLiteOpenHelper around longer (e.g., lifetime of your activity or service, or a singleton for your whole app)

这篇关于为什么我的应用程序抛出异常终结android系统中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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