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



everyone.我有一个关于 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 类型的结果"错误。然而,我确实在尝试块中返回了花絮;Eclipse 建议在 try/catch 块之后添加一个返回值,这会破坏逻辑。你能告诉我这里有什么问题吗?谢谢。

抛出JMSException时,返回值是未定义的。 引发异常时,控制权会立即传递给异常处理程序。 在这种情况下,您将记录错误。 然后控制从该点继续,直到函数的末尾而不返回值。 要么需要返回值,要么需要引发异常。

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

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

您必须:

  1. try-catchreturn
  2. 在每个catch内添加一个return
  3. 添加带有returnfinally
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);
    }
有一个

通过代码的路由,这意味着不会定义返回值,这是一个错误,因为你的方法说你总是会返回一个长整型。

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

否则你真的想重新扔掉JMSException吗?

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

让我们想象一个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。

最新更新