Java - 使用 catch 块内的方法返回语句并引发异常?

djm*_*jmj 2 java return exception

我有以下代码,使用 hibernate 在错误时引发自定义异常,并且我还想在这种情况下关闭会话,因为除非在客户端计算机上接收到,否则不会捕获异常。

public <T> T get(final Session session, final String queryName) throws RemoteException
{
    final Query query = // query using given session ...

    try
    {
        return (T) query.uniqueResult();
    }
    catch (final HibernateException e)
    {
        SessionManager.logger.log(Level.SEVERE, "Could not retrieve Data", e);
        this.closeSession(session);
        throw new RemoteException("Could not retrieve Data");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我有一个帮助器方法,可以关闭会话并引发给定的异常:

public void closeSessionAndThrow(final Session session, final RemoteException remoteException)
    throws RemoteException
{
    this.closeSession(session);
    throw remoteException;
}
Run Code Online (Sandbox Code Playgroud)

现在我想我可以使用以下方法简化上面的代码:

public <T> T get(final Session session, final String queryName) throws RemoteException
{
    final Query query = // query using given session ...

    try
    {
        return (T) query.uniqueResult();
    }
    catch (final HibernateException e)
    {
        SessionManager.logger.log(Level.SEVERE, "Could not retrieve Data", e);
        this.closeSessionAndThrow(session, new RemoteException("Could not retrieve Data"));
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我需要return null;在 catch 之后添加一条语句。为什么?

Ste*_*n C 5

这就是诸如 之类的方法的问题closeSessionAndThrow。JLS 规则不允许编译器推断,由于该方法无条件抛出异常,因此它永远无法正常返回。因此,调用代码必须编写得好像该方法可以返回一样......即使“我们知道”它不会发生。

你只需要随波逐流即可。这是一种“不寻常”的控制模式,Java 语言并不像您/我们希望的那样支持它。


(在某些情况下,可以证明该方法在某些假设下总是会抛出异常。但是,由于该方法位于public不同的类中,因此假设之一是定义和使用该方法的类不会被彼此独立地更改和编译。当然,这不是编译器可以做出的假设......并且它部分解释了为什么 JLS 规则不尝试涵盖这种模式。

如果他们要“修复”这个问题,则需要诸如注释之类的东西,或者更改为 java 语法来声明辅助方法无法返回。)