В Java, как установить тип возврата, если возникает исключение - PullRequest
9 голосов
/ 31 мая 2010

Привет всем, я новичок в Java, и мне было интересно, если я определю метод для возврата объекта базы данных

как

import java.sql.*;

public class DbConn {

    public Connection getConn() {
        Connection conn;
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            if(System.getenv("MY_ENVIRONMENT") == "development") {
                String hostname = "localhost";
                String username = "root";
                String password = "root";
            }
            conn = DriverManager.getConnection("jdbc:mysql:///mydb", username, password);
            return conn;
        } catch(Exception e) {
            throw new Exception(e.getMessage());
        }

    }

}

если при попытке создать соединение не удается, что мне вернуть? Eclipse говорит мне, что я должен вернуть объект Connection, но если он не работает, я не уверен, что делать.

спасибо!

ОБНОВЛЕННЫЙ КОД ДЛЯ ПОЛУЧЕНИЯ ИСКЛЮЧИТЕЛЬНОГО ПУЗЫРЯ:

public class DbConn {

    public Connection getConn() throws SQLException {
        Connection conn;
        String hostname = "localhost";
        String username = "root";
        String password = "root";

        Class.forName("com.mysql.jdbc.Driver").newInstance();
        if(System.getenv("MY_ENVIRONMENT") != "development") {
            hostname = "localhost";
            username = "produser";
            password = "prodpass";
        }
        conn = DriverManager.getConnection("jdbc:mysql:///mydb", username, password);
        return conn;

    }

}

Ответы [ 6 ]

7 голосов
/ 31 мая 2010

Если выдается исключение, из метода не возвращается нормальное значение. Обычно компилятор может обнаружить это, поэтому он даже не приставает к вам с предупреждениями / ошибками в стиле «вернуть требуемый». Иногда, когда он не может этого сделать, вам нужно дать оператор возврата "alibi", который фактически никогда не будет выполнен.

Переопределение вашего метода следующим образом

public Connection getConn() {
    Connection conn = null;
    try {
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        if(System.getenv("MY_ENVIRONMENT") == "development") {
            String hostname = "localhost";
            String username = "root";
            String password = "root";
        }
        conn = DriverManager.getConnection("jdbc:mysql:///mydb", username, password);
    } catch(Exception e) {
        // handle the exception in a meaningful way - do not just rethrow it!
    }
    return conn;
}

удовлетворит Eclipse: -)

Обновление: Как уже отмечали другие, повторное создание исключения в блоке перехвата, как вы это сделали, не является хорошей идеей. Единственная ситуация, когда это достойное решение, - это если вам нужно конвертировать между разными типами исключений. Например. вызываемый метод выбрасывает тип исключения, который вы не можете или не хотите распространять вверх (например, потому что он принадлежит проприетарной библиотеке или фреймворку и вы хотите изолировать от него остальную часть вашего кода).

Даже тогда, правильный способ перебросить исключение - это передать исходное исключение в конструктор нового (стандартные исключения Java и большинство специфичных для фреймворка исключений позволяют это). Таким образом, трассировка стека и любая другая информация в исходном исключении сохраняется. Также хорошей идеей будет записать ошибку перед повторной обработкой. Э.Г.

public void doSomething() throws MyException {
    try {
        // code which may throw HibernateException
    } catch (HibernateException e) {
        logger.log("Caught HibernateException", e);
        throw new MyException("Caught HibernateException", e);
    }
}
5 голосов
/ 31 мая 2010

Вы должны просто удалить весь блок try/catch и разрешить распространение исключений с соответствующим объявлением исключения. Это устранит ошибку, о которой сообщает Eclipse, плюс сейчас ваш код делает что-то очень плохое: перехватывая и перебрасывая все исключения, вы уничтожаете исходную трассировку стека и скрываете другую информацию, содержащуюся в исходном объекте исключения.

Плюс, какова цель линии Class.forName("com.mysql.jdbc.Driver").newInstance();? Вы создаете новый объект mysql Driver с помощью отражения (почему?), Но вы ничего не делаете с ним (почему?).

2 голосов
/ 31 мая 2010

Никогда, никогда, никогда не используйте общее исключение, подобное этому. Если у вас нет готового исключения (в данном случае SQLException), создайте собственный тип исключения и выбросьте его. Каждый раз, когда я сталкиваюсь с чем-то, что объявляет, что оно «выдает исключение», и оказывается, что оно делает это, потому что что-то, что он вызывает, объявляет «выдает исключение», и так далее, я хочу задушить идиота, который начал эту цепочку деклараций.

1 голос
/ 01 июня 2010

Извините, но вы не должны писать такой код, даже если вы новичок в Java.

Если вы должны написать такую ​​вещь, я бы сделал это примерно так:

public class DatabaseUtils 
{

    public static Connection getConnection(String driver, String url, String username, String password) throws SQLException 
    {
        Class.forName(driver).newInstance();


        return DriverManager.getConnection(url, username, password);
    }
}

И вам также следует помнить, что пулы соединений - это верный путь для чего-либо, кроме простого однопоточного приложения.

1 голос
/ 31 мая 2010

Это как раз та ситуация, когда вы должны позволить исключению распространяться вверх по стеку вызовов (объявив метод как throws SQLException или поместив его в исключение для конкретного приложения), чтобы вы могли перехватить его и обработать на более высоком уровне.

В этом весь смысл исключений: вы можете выбрать, где их поймать.

0 голосов
/ 29 мая 2012

Попробуйте это

public ActionForward Login(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response) {
    MigForm migForm = (MigForm) form;// TODO Auto-generated method stub

    Connection con = null;
    Statement st = null;
    ResultSet rs = null;

    String uname=migForm.getUname();
    String pwd=migForm.getPwd();

    try{
        Class.forName("oracle.jdbc.driver.OracleDriver");
        con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","uname","pwd");
        if(con.isClosed())
        {
            return mapping.findForward("success");
        }

        //st=con.createStatement();

        }catch(Exception err){

        System.out.println(err.getMessage());
        }


            return mapping.findForward("failure");



}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...