为什么我的应用程序抛出异常终结android系统中? [英] why is my application throwing finalizer exception in 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 useSQLiteOpenHelper
or usegetDatabasePath()
. - 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 yourSQLiteOpenHelper
around longer (e.g., lifetime of your activity or service, or a singleton for your whole app)
这篇关于为什么我的应用程序抛出异常终结android系统中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!