小编典典

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

java

我有以下代码使用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");
    }
}

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

public void closeSessionAndThrow(final Session session, final RemoteException remoteException)
    throws RemoteException
{
    this.closeSession(session);
    throw remoteException;
}

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

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

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


阅读 260

收藏
2020-11-26

共1个答案

小编典典

更改closeSessionAndThrow要返回的声明,RemoteException然后在客户端代码中“抛出”调用它的返回结果。

public RemoteException closeSessionAndThrow( ... )   // <-- add return type here
        throws RemoteException { ... }

public <T> T get( ... ) throws RemoteException
{
    try { ... }
    catch (final HibernateException e)
    {
        throw this.closeSessionAndThrow( ... );  // <-- add "throw" here
    }
}

这会诱使编译器认为它将始终抛出从返回的任何异常closeSessionAndThrow。由于helper方法本身会引发该异常,因此这一秒throw永远不会起作用。尽管您可以从帮助程序中返回异常,但是当有人忘记throw在调用之前添加时,这会引发错误。

2020-11-26