重写的方法不会引发异常(Java中的实现)

时间:2019-02-19 23:20:10

标签: java sqlite implements

我一直在练习Java中接口的使用,但是当我要启动我的一个类时,我遇到了一个小问题。这是错误:

SELECT s.SingerId, s.FirstName, s.LastName
FROM Singers@{FORCE_INDEX=SingersByFirstLastName} AS s
WHERE s.FirstName = ?

编译器显示给我的大多数错误都来自那里。我告诉你,我正在学习接口的使用,但我真的不知道如何正确使用它们。.所以我不知道如何解决此类错误。这是我的代码:

./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

和Jbdc文件

 (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 (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);
    }
}

2 个答案:

答案 0 :(得分:2)

错误是不言自明的:

  

覆盖的方法不会引发异常

在您的界面中,您声明了不会引发任何异常的方法:

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

答案 1 :(得分:0)

覆盖方法不能抛出比被覆盖方法更多(或更广泛)的检查异常。如果您的接口声明它不引发任何检查的异常,那么任何实现也都不能声明它引发任何检查的异常。

编译器使用方法的throws子句来确定调用代码是否有必要捕获已检查的异常,或者让调用代码本身声明它抛出已检查的异常。编译器不允许您通过不在接口中声明它而在实现方法中声明它来规避此问题。即使这样做,也很令人惊讶,类型为InterfazBD的变量,该变量声明它不抛出任何已检查的异常,然后在运行时,抛出一个被检查的异常,仅是因为实现决定声明引发了该异常。

您可以在接口中声明该方法引发与实现相同的已检查异常,也可以在实现中捕获并处理该异常,从而无需在throws中声明它。条款。