Вопрос по java – Возвращаемое значение Java (в предложении try / catch)

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 сообщает о & quot; Этот метод должен возвращать результат типа long & quot; ошибка. Все же я возвратил прилив в блоке try; eclipse предлагает добавить возвращаемое значение после блока try / catch, что нарушит логику. Не могли бы вы сказать мне, что здесь не так? Благодарю.

catch (JMSException e) {logger.severe ("Ошибка JMS:" + e); } здесь вы не гарантируете возвращаемое значение, просто добавьте возврат или бросок и будете работать DGomez
нет никакой гарантии, что ваш код достигнет точки, в которой вы вернете действительное длинное значение. Вы должны иметь возвращаемое значение по умолчанию в случае возникновения исключения Dan

Ваш Ответ

6   ответов
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);
    }
9

JMSException Возвращаемое значение не определено. выдается исключение, управление немедленно передается обработчику исключения. В этом случае вы регистрируете ошибку. Затем управление продолжается с той точки, которая переходит в конец функции без возврата значения. Вам нужно либо вернуть значение, либо выдать исключение.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded magicbacon
0

Существует маршрут через ваш код, который означает, что не будет задано возвращаемое значение, что является ошибкой, поскольку ваш метод говорит, что вы всегда будете возвращать long.

Вы ожидаете, что значение будет возвращено, когда код выдает исключение JMSException? Если это так, возможно, объявите tld вне попытки со значением по умолчанию.

Иначе ты действительно хотел повторно выбросить JMSException?

3

возвращать значение.

Если исключение выбрасывается внутриtry тогдаreturn не будет выполнен, и поэтому вы не возвращаете значение на всех возможных путях управления.

Вы должны либо:

add a return after the try-catch or add a return inside each catch or add a finally with a return.
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.

0

Проблема здесь в том, что с методами независимо от того, какой маршрут использует код, он должен возвращать указанный тип, если выполнение метода завершается. Таким образом, ваша проблема в этом коде - второй улов. Первый улов выдает ошибку, и поэтому метод не завершает выполнение и, следовательно, не нуждается в операторе возврата. Однако во втором улове вы просто печатаете ошибку, чтобы метод выполнялся до конца, поэтому должен возвращать long. Чтобы решить эту проблему, нужно либо указать подходящую длинну для вашего кода, которая будет возвращена во втором улове, либо выбросить JMSException и обработать это в коде, который вызывает этот метод. Обратите внимание, что если вы добавите catch, вам нужно будет добавить throw к объявлению вашего метода.

Похожие вопросы