gpt4 book ai didi

Java - 使用 catch block 内的方法返回语句和抛出的异常?

转载 作者:行者123 更新时间:2023-11-30 05:52:48 24 4
gpt4 key购买 nike

我有以下代码使用 hibernate 在错误时抛出自定义异常,在这种情况下我也想关闭 session ,因为除非在客户端机器上接收到异常,否则不会被捕获。

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

现在我有一个辅助方法可以关闭 session 并抛出给定的异常:

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; 语句。为什么?

最佳答案

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

你只需要顺其自然。这是一种“不寻常”的控制模式,Java 语言并不像您/我们希望的那样支持它。


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

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

关于Java - 使用 catch block 内的方法返回语句和抛出的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11199183/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com