Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 澄清声明_Java_Try Catch_Sqlexception_Throws - Fatal编程技术网

Java 澄清声明

Java 澄清声明,java,try-catch,sqlexception,throws,Java,Try Catch,Sqlexception,Throws,我有以下java中的SQL事务 public List<MyObj> find() { Session session = sessionFactory.openSession(); Transaction tx = null; List<MyObj> obj = null; try { tx = session.beginTransaction(); Stri

我有以下java中的SQL事务

public List<MyObj> find() {
        Session session = sessionFactory.openSession();
        Transaction tx = null;
        List<MyObj> obj = null;
        try {
            tx = session.beginTransaction();
            String sql = " some sql query";
            SQLQuery query = session.createSQLQuery(sql);
            query.addEntity(MyObj.class);
            objs = query.list();
            tx.commit();
        }
        catch(Exception e) {
            if (tx != null) tx.rollback();

        }
        finally {
            session.close();
        }
        return objs;

    }
公共列表查找(){
Session Session=sessionFactory.openSession();
事务tx=null;
列表obj=null;
试一试{
tx=session.beginTransaction();
String sql=“一些sql查询”;
SQLQuery=session.createSQLQuery(sql);
加法查询(MyObj.class);
objs=query.list();
tx.commit();
}
捕获(例外e){
如果(tx!=null)tx.rollback();
}
最后{
session.close();
}
返回对象;
}
我应该捕获SQLException而不是异常吗?当我将类更改为SQL Exception时,我得到一个错误,我应该添加一个throws子句,然后删除catch子句


我可以添加一个throws声明并仍然捕获和处理SQLException吗?在这种情况下,回滚?

Hibernate API不会抛出
SQLException
(这是一个选中的
异常
),因此您无法捕获它

好的做法是捕获
运行时异常
(处理由于空引用等代码问题或Hibernate API引发的异常而发生的异常)和回滚事务,您可以查看Hibernate文档以获取事务回滚的示例

try {
        tx = session.beginTransaction();
        String sql = " some sql query";
        SQLQuery query = session.createSQLQuery(sql);
        query.addEntity(MyObj.class);
        objs = query.list();
        tx.commit();
    }
    catch(RuntimeException e) {
        if (tx != null) tx.rollback();
         throw e;
    }
    finally {
        session.close();
    }

我认为错误的意思是我应该首先声明一个 子句,指示代码块将抛出SQLEXception 对吗

否,因为Hibernate已经将选中的
SQLException
包装到一个未选中的异常对象中(下面给出的列表),所以您不需要捕获该异常,也不需要在方法签名上抛出
子句

我强烈建议您阅读关于为什么Hibernate或Spring框架已从已检查异常中移出的链接(如
SQLException
,等等)

是否有文档表明SQLexception不是由 HibernateAPI


您可以查找Hibernate异常列表。

编译器的确切错误是什么?SQLException的不可访问捕获块。这个异常永远不会从try语句bodyHibernate中抛出,它将异常包装在HibernateException中,因此您可以捕获它。RuntimeException也可以工作,但是您捕获的不仅仅是HibernateeException。最好是具体的。
catch(Exception…
是一种反模式,就像
抛出异常一样。总是处理更具体的异常。我认为错误的意思是,我应该首先声明一个throws子句,指示代码块将抛出一个SQLEXception正确吗?有没有一个文档说SQLexception不是由HibernateAPI引发的?更新了答案,有一个look@user_mda“有没有一个文档说SQLexception不是由hibernate[sic]API引发的?”是的,hibernate Javadocs。你调查过了吗?