2011-04-25 3 views
1

나는 이런 일이 왜 이해가 안 지속적으로이 예외가 발생되고이있는 응용 프로그램 ...내 응용 프로그램이 안드로이드에서 파이널 라이저 예외를 던지고있는 이유는 무엇입니까?

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 [email protected] 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 [email protected] 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 [email protected] 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 [email protected] 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 [email protected] 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 [email protected] 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 [email protected] 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 [email protected] 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 [email protected] 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) 

있습니다. 즉 c.close()는 문제가 될 수있는 것을 db.close()

앞에 오는 ... 난 내 모든 커서를 닫은, 또한 내가 데이터베이스하기 전에 커서를 닫았?

미리 감사드립니다.

편집 : 내가 그것을 데이터베이스

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; 
    } 
    } 
} 
+1

일부 코드를 보지 않고 오류 메시지가 말하는 것 이상을 말할 수 없습니다. –

+0

일반적으로이 예외가 throw되는시기는 ...? – user590849

+0

우리에게 완전한 오류를 보여주십시오. 첫 번째 3 줄뿐만 아니라 ... – WarrenFaith

답변

2

당신은 checkIfThereIsEvent()의 끝을 향한 else 누락 다루는 하나이기 때문에이 클래스가 예외를 일으키는 생각합니다. 그가 제거되지 않으면

, 단순히 각 Cursor 당신이 Log의 호출을 통해서 자신을 열고 로그온 한 후 유출되는 하나입니다 Cursor 파악하는 로그 항목을 비교합니다. 또한

:

  • 는 경로를 하드 와이어하지 마십시오. /data/data/com.helios.NauticDates을 제거하십시오. SQLiteOpenHelper을 사용하거나 getDatabasePath()을 사용하십시오.
  • 데이터베이스를 계속해서 열고 닫는 데는 아무런 가치가 없습니다. , SQLiteOpenHelper을 사용하여 해당 클래스에이 방법을 가하고, 및 유지 고려해주십시오 SQLiteOpenHelper 더 오래 (예를 들어, 활동이나 서비스, 또는 전체 앱의 싱글의 수명) CommonsWare에
+0

if가 return을 포함하기 때문에 else는 중요하지 않으므로 if 문이 true 일 때 else 메서드가되는 블록을 메서드가 실행하지 않습니다. – WarrenFaith

+0

@WarrenFaith : 그래, 괜찮을 거라고 생각했는데, 나는 그것을 대비하여 지적하고 싶었다. – CommonsWare

2

가산 :

checkEventInDatabase()에서 c.getCount()이 0이 아닌 경우 c 변수를 재 할당하면 절대로 닫지 않는 커서가 만들어집니다.

다음을 수행하십시오. getCount() 또는 getColumnCount()을 반복적으로 호출 할 때마다 신이 새끼 고양이를 죽입니다! (getData() 참조)

관련 문제