Java返回值(在try / catch子句中)

时间:2012-04-12 14:42:25

标签: java try-catch return

大家。我有一个关于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块之后添加一个返回值,这会破坏逻辑。你能告诉我这里有什么问题吗?感谢。

6 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:3)

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

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

您必须:

  1. return
  2. 之后添加try-catch
  3. 在每个return
  4. 中添加catch
  5. 使用finally添加return

答案 2 :(得分:0)

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

答案 3 :(得分:0)

你的代码中有一条路径,这意味着没有定义返回值,这是一个错误,因为你的方法说你总是返回一个长的。

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

其他你真的想重新抛出JMSException吗?

答案 4 :(得分:0)

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

答案 5 :(得分:0)

让我们假设抛出了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。