6

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

4

6 回答 6

9

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

于 2012-04-12T14:43:20.080 回答
3

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

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

您必须:

  1. 在或return之后添加try-catch
  2. return在每个内部添加一个catch
  3. finally一个return
于 2012-04-12T14:44:44.767 回答
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);
    }
于 2012-04-12T14:44:53.350 回答
0

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

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

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

于 2012-04-12T14:46:54.857 回答
0

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

于 2012-04-12T14:47:40.623 回答
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。

于 2012-04-12T14:47:56.513 回答