【问题标题】:Java return value (in try/catch clause)Java 返回值(在 try/catch 子句中)
【发布时间】:2012-04-24 22:31:47
【问题描述】:

每个人。我有一个关于java中返回值的菜鸟问题。这是我的代码。

@Override
public long addDrugTreatment(long id, String diagnosis, String drug,
        float dosage) throws PatientNotFoundExn {
    try {
        Patient patient = patientDAO.getPatientByDbId(id);
        long tid = patient.addDrugTreatment(diagnosis, drug, dosage);

        Connection treatmentConn = treatmentConnFactory.createConnection();
        Session session = treatmentConn.createSession(true, Session.AUTO_ACKNOWLEDGE);
        MessageProducer producer = session.createProducer(treatmentTopic);

        TreatmentDto treatment = null;
        ObjectMessage message = session.createObjectMessage();
        message.setObject(treatment);
        producer.send(message);

        return tid;
    } catch (PatientExn e) {
        throw new PatientNotFoundExn(e.toString());
    } catch (JMSException e) {
        logger.severe("JMS Error: " + e);
    }
}

Eclipse 报告“此方法必须返回 long 类型的结果”错误。然而,我确实在 try 块中返回了 tid; eclipse 建议在 try/catch 块之后添加一个返回值,这会破坏逻辑。你能告诉我这里有什么问题吗?谢谢。

【问题讨论】:

  • 无法保证您的代码会达到返回有效长值的程度。你需要有一个默认的返回值,以防发生异常
  • catch (JMSException e) { logger.severe("JMS 错误:" + e); } 这里你不保证返回值,只需添加一个 return 或 throw 就可以了

标签: java try-catch return


【解决方案1】:

JMSException 被抛出时,返回值是未定义的。当抛出异常时,控制立即传递给异常处理程序。在这种情况下,您记录错误。然后控制从该点继续进行,直到函数结束而不返回值。你要么需要返回一个值,要么抛出一个异常。

【讨论】:

  • 这是正确的,但更多解释可能会有所帮助。在捕获 PatientExn 的情况下,您将其抛出,因此不需要返回值。在 JMSException 的情况下,您记录一个错误,并从 try/catch 块的 END 继续执行方法。因此,将永远不会到达 return 语句。您需要在 JMSException catch 块中或在方法末尾使用另一个 return 语句。如果不想返回值,或者抛出 JMSException。
  • @aglassman:我在争论是否应该解释更多。我想我应该:)
  • 谢谢。我想我现在明白了。谢谢大家!
【解决方案2】:

在 Java(或任何其他类 C 语言)中,所有控制路径都必须返回一个值。

如果在 try 内引发异常,则 return 将不会被执行,因此您不会在所有可能的控制路径上返回值。

您必须:

  1. try-catch 之后添加return
  2. 在每个catch 内添加return
  3. 添加finallyreturn

【讨论】:

    【解决方案3】:
    catch (JMSException e) {
            logger.severe("JMS Error: " + e);
            //You need to throw exception here or return something
            //better would be throw new Exception("JMS Error: " + e);
        }
    

    【讨论】:

      【解决方案4】:

      您的代码中有一条路由,这意味着没有定义返回值,这是一个错误,因为您的方法说您将始终返回一个 long。

      如果代码抛出 JMSException,您是否期望返回一个值? 如果是这样,也许可以在 try 之外使用默认值声明 tld。

      否则你真的要重新抛出 JMSException 吗?

      【讨论】:

        【解决方案5】:

        这里的问题是,对于方法,无论代码采用哪条路径,如果方法的执行完成,它必须返回指定的类型。所以你在这段代码中的问题是第二个问题。第一个 catch 抛出一个错误,因此该方法没有完成执行,因此不需要 return 语句。但是,在您的第二次捕获中,您只需打印一个错误,因此该方法将执行到最后,因此必须返回一个 long。解决这个问题的方法是为您的代码在第二次捕获中返回适当的 long,或者抛出 JMSException 并在调用此方法的代码中处理它。请注意,如果您在 catch 中抛出,则必须将 throw 添加到您的方法声明中。

        【讨论】:

          【解决方案6】:

          假设抛出了一个 JMSException:

          @Override
          public long addDrugTreatment(long id, String diagnosis, String drug,
                  float dosage) throws PatientNotFoundExn {
              try {
                  Patient patient = patientDAO.getPatientByDbId(id);
                  long tid = patient.addDrugTreatment(diagnosis, drug, dosage);
          
                  Connection treatmentConn = treatmentConnFactory.createConnection();
                  //JMS thrown above. No code from here gets executed
              } catch (PatientExn e) {
                  throw new PatientNotFoundExn(e.toString());
              } catch (JMSException e) {
                  logger.severe("JMS Error: " + e);
              }
          }
          

          在上面,如果抛出 JMSException,则代码的任何部分都不会返回 long。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-08-25
            • 2013-11-22
            • 2012-02-10
            • 2018-10-14
            • 2016-05-08
            • 1970-01-01
            • 1970-01-01
            • 2014-03-10
            相关资源
            最近更新 更多