当前位置: 首页 > 面试题库 >

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

阚元白
2023-03-14
问题内容

我有以下代码使用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;在捕获之后添加一条语句。为什么?


问题答案:

更改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在调用之前添加时,这会引发错误。



 类似资料:
  • 我在Java中所知的程度可以通过两种方式报告错误:返回值和异常。例如,下面的代码: 另一个观察结果是:如果取消对最后一条“return result”语句的注释,则会得到一条错误消息: 变量结果可能未初始化 ;如果对最后一条“return result”进行注释,则会得到一条错误消息: 缺少return语句 但是我已经在try子句中包含了return语句。

  • 问题内容: 在大学里有关Java的问题中,有以下代码片段: 我被要求提供其输出。我回答了,但是正确答案是。为什么会这样呢?我只是不明白MyExc2去哪了。 问题答案: 通过阅读你的答案并了解你可能的想法,我相信你认为“进行中的例外”具有“优先权”。记住: 当一个新的异常被抛出到一个catch块或将要传播到该块之外的finally块中时,当新的异常向外传播时,当前异常将被中止(并被遗忘)。与其他任何

  • 考虑来自Java文档的以下代码。 根据Java文档, 在示例readFirstLineFromFile中,如果从try块和try with resources语句抛出异常,则方法readFirstLineFromFile抛出从try块抛出的异常;禁止从try with resources块引发的异常。 另一方面,也提到了 由于BufferedReader实例是在try with resource语

  • 本文向大家介绍Java异常处理之try...catch...语句的使用进阶,包括了Java异常处理之try...catch...语句的使用进阶的使用技巧和注意事项,需要的朋友参考一下 try就像一个网,把try{}里面的代码所抛出的异常都网住,然后把异常交给catch{}里面的代码去处理。最后执行finally之中的代码。无论try中代码有没有异常,也无论catch是否将异常捕获到,finally

  • 问题内容: 我正在用Java开发与MySQL db通信的应用程序,而在测试它时,我注意到在表中插入新行的代码引发了MySQLSyntaxError异常,因此我尝试使用MySQL Workbench执行相同的INSERT,而且有效。有问题的代码是这样的: 编辑:对不起,堆栈跟踪是: 问题答案: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorExcep

  • 本文向大家介绍C#异常处理中try和catch语句及finally语句的用法示例,包括了C#异常处理中try和catch语句及finally语句的用法示例的使用技巧和注意事项,需要的朋友参考一下 使用 try/catch 处理异常 try-catch 块的用途是捕捉和处理工作代码所生成的异常。 有些异常可以在 catch 块中处理,解决问题后不会再次引发异常;但更多情况下,您唯一能做的是确保引发适