2012-11-22 14 views
6

Nie rozumiem, dlaczego kompilator nie ostrzega mnie o nie łapaniu lub rzucaniu SQLException. Tutaj jest sytuacja:Brak błędu/ostrzeżenia kompilatora dla niezaakceptowania wyjątków catch/throwing

Mam zdefiniowane ten interfejs:

public interface GenericDatabaseManager { 
    public void createTables(DataBase model) throws SQLException; 
} 

Potem stworzył tę klasę, która implementuje dany interfejs:

public class SqliteHelper extends SQLiteOpenHelper implements 
     GenericDatabaseManager { 

    @Override 
    public void createTables(DataBase model) throws SQLException { 
     // Code that throws SQLException 
    } 

iw końcu dzwonię to SqliteHelper.createTables () stąd:

public class DatabaseManager extends CoreModule { 
    private boolean createUpdateDB(final String dbString, final String appId) { 
     // Previous code... 

     if (oldVer == -1) { 
      dbCoreModel.addModel(dbModel); 
      dbCoreModel.getManager().createTables(dbModel); 
      return true; 
     } 

     // More code... 
    } 

} 

dbCoreModel.getManager() zwraca GenericDatabaseManager wystąpienie. Ale kompilator nie pokazuje żadnego błędu na linii dbCoreModel.getManager().createTables(dbModel);, chociaż ta linia wyrzuca SQLException.

Czy ktoś ma pojęcie o tym, dlaczego tak się dzieje? Z góry dziękuję.

EDIT: o SQLException nie trzeba przechwytywać, ponieważ jest to RuntimeException. This is not true. Oto przykład:

import java.sql.SQLException; 

interface Interface { 
    public void throwsSQLException() throws SQLException; 
} 

class Test implements Interface { 

    @Override 
    public void throwsSQLException() throws SQLException { 
     throw new SQLException(); 
    } 
} 

public class Main { 

    public static void main(String[] args) { 
     Interface i = new Test(); 
     i.throwsSQLException(); 
     System.out.println("Finished"); 
    } 

} 

Kompilator nie pokazuje błąd w i.throwsSQLException(); w tym przypadku.

+0

Bezużyteczne, aby zapytać, czy "Poprzedni kod ..." zawiera "try {" i "Więcej kodu ..." zawiera '} catch (SQLException e) {', right ? : D –

+0

Tak, nie try/catch oczywiście – m0skit0

+2

Następnie, jak PC. odpowiedziałeś, nie używasz 'java.sql.SQLException', ale' android.database.SQLException'. Sprawdź swoje 'import's. –

Odpowiedz

12

android.database.SQLException to wyjątek środowiska wykonawczego.

W języku java nie ma konieczności przechwytywania ani zadeklarowania rzutów dla wyjątków w czasie wykonywania. Przeczytaj szczegółowy opis o RuntimeExceptions w java here

+0

[Wyjątek SQLEx] (http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/SQLException.html) nie jest wyjątkiem czasu wykonywania. – m0skit0

+6

'Android.database.SQLException' to' RuntimeException', ['java.sql.SQLException'] (http://docs.oracle.com/javase/7/docs/api/java/sql/SQLException.html) nie jest. – Kai

+0

pytanie dotyczy 'Android.database.SQLException', a nie' java.sql.SQLException' –

Powiązane problemy