переопределенный метод не вызывает исключение (реализуется в Java) - PullRequest
0 голосов
/ 20 февраля 2019

Я практиковал использование интерфейсов в Java, но у меня есть небольшая проблема, когда я хочу запустить один из моих классов.Это ошибка:

./Jbdc.java:18: error: introducir() in Jbdc cannot implement introducir()  in InterfazBD
public void introducir() throws Exception

overridden method does not throw Exception
 1 error

Большинство ошибок, которые мне показывает компилятор, происходят оттуда.Я говорю вам, я изучаю использование интерфейсов, и я действительно не знаю, как их правильно использовать ... поэтому я не знаю, как я мог бы решить этот тип ошибки .. это мой код:

 (Principal)
public class App{

public static void main(String arg[]){

    JsonRead json = new JsonRead();
    Jbdc sqlite = new Jbdc();
    grabarJson(json);
    introducirSQL(sqlite);
}

    public static void grabarJson(InterfazGrabar fichero){
    fichero.grabar();
    }

    public static void grabarTxt(InterfazGrabar fichero){
    fichero.grabar();
    }

    public static void introducirSQL(InterfazBD fichero){
    fichero.introducir();
    }
}

и файл Jbdc

 Jbdc (this file enter the data in a database)

public class Jbdc implements InterfazBD{

private static final String URL = "jdbc:sqlite:test.db";
    public void introducir() throws Exception{
        createDb();
        createTable();
        Aula a = null;
        int contador = 0;
        try {
            FileInputStream inFile = new FileInputStream("aula.dat");
            ObjectInputStream in = new ObjectInputStream(inFile);
            while (inFile.available()>0) {
                a = (Aula)in.readObject();
                String materiaslista ="";
                String nombre = a.getNombre();
                String grupo = a.getGrupo();
                int tutor= a.getTutor();
                ArrayList<String> materias = a.getMaterias();
                for (int counter = 0; counter < materias.size(); counter++) {             
                    materiaslista = materiaslista + materias.get(counter) + ",";
                }
                insertDatos(nombre,grupo,tutor,materiaslista);
            }

    }
    catch(IOException e)
    {
        System.err.println("ERROR");
    }
        System.out.println("¡Listo!");
    }

    private static void insertDatos(String nombre,String grupo, int tutor,String materiaslista) {
        final String SQL = "INSERT INTO datos VALUES(?,?,?,?)";
        try (Connection con = getConnection(); PreparedStatement ps = con.prepareStatement(SQL);) {
            ps.setString(1, nombre); 
            ps.setString(2, grupo);
            ps.setInt(3, tutor);
            ps.setString(4, materiaslista); 
            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private static void createTable() {
        final String SQL = "CREATE TABLE IF NOT EXISTS datos (nombre TEXT,grupo TEXT, tutor INTEGER, materiaslista TEXT);";
        // This SQL Query is not "dynamic". Columns are static, so no need to use
        // PreparedStatement.
        try (Connection con = getConnection(); Statement statement = con.createStatement();) {
            statement.executeUpdate(SQL);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private static void createDb() {
        try (Connection conn = getConnection()) {
            if (conn != null) {
                conn.getMetaData();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL);
    }
}

Это мой интерфейс

public interface InterfazBD{

    public void introducir();

}

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Переопределяющий метод не может генерировать больше (или более широких) проверенных исключений, чем метод, который он переопределяет.Если ваш интерфейс объявляет, что он не выдает проверенные исключения, то любая реализация также не может объявить, что он выбрасывает какие-либо проверенные исключения.

Компилятор использует предложение throws метода, чтобы определить, необходимо ли это для вызова кодачтобы перехватить проверенное исключение или сделать так, чтобы сам вызывающий код объявил, что он выдает проверенное исключениеКомпилятор не позволит вам обойти это, не объявив его в интерфейсе и объявив его в реализующем методе.Даже если бы это было так, было бы весьма удивительно иметь переменную типа InterfazBD, которая объявляет, что она не выдает проверенных исключений, а затем во время выполнения выдает исключение, которое проверяется, только потому, что реализация решила объявить, чтоон выдал это исключение.

Вы можете либо объявить в интерфейсе, что метод вызывает то же проверенное исключение, что и реализация, или вы можете перехватить и обработать исключение в реализации, чтобы вам не нужно было объявлятьэто в предложении throws.

0 голосов
/ 20 февраля 2019

Ошибка не требует пояснений:

переопределенный метод не генерирует исключение

В вашем интерфейсе вы объявили метод, который не генерирует никаких исключений:

public void introducir();

При его реализации / переопределении вы добавили throws предложение:

public void introducir() throws Exception {

Обновление объявления метода интерфейса для выброса того же (или родительского) исключения исправит его.

Это ограничение существует, потому что вызывающие этого метода не будут знать, что он может вызвать исключение, потому что тип переменной будет интерфейсом, а не классом, как это:

MyInterface x = new MyClass(); //MyClass implements MyInterface
x.someMethod(); //guaranteed that its implementation in MyClass won't throw an exception if its declaration in MyInterface doesn't throw exception
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...