Почему я нуждаюсь в том, чтобы бросить RunTimeException?

У меня есть следующий код:

Connection conn = null;
Statement stmt = null;
PreparedStatement pstmt = null;
ResultSet rs = null;


public ArrayList<Coffee> getAllCoffees()
{
    try
    {
        conn = ConnectionPool.getPool().getConnection();
        String sql = "SELECT * FROM coffees";
        stmt = conn.createStatement();
        rs = stmt.executeQuery(sql);
        ArrayList<Coffee> coffeeList = new ArrayList<Coffee>();
        Coffee coffee = null;
        while(rs.next())
        {
            coffee = new Coffee();
            coffee.setCof_name(rs.getString("cof_name"));
            coffee.setSup_id(rs.getInt("sup_id"));
            coffee.setPrice(rs.getDouble("price"));
            coffee.setSales(rs.getDouble("sales"));
            coffee.setTotal(rs.getDouble("total"));
            coffeeList.add(coffee);
        }
        return coffeeList;
    }
    catch(Exception ex)
    {
        ex.printStackTrace();
        throw new RuntimeException();
    }
    finally
    {
        try
        {
            if(rs != null)
            {
                rs.close();
            }
            if(stmt != null)
            {
                stmt.close();
            }
            if(conn != null)
            {
                ConnectionPool.getPool().releaseConnection(conn);
            }
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
    }
}

Когда я забираю линию throw new RuntimeException(ex) он говорит мне: метод должен возвращать результат типа ArrayList<Coffee>. Хотя объект coffeeList он типа ArrayList. Но когда я включаю линию throw new RuntimeException(ex) сообщение ошибки уходит. Кто-то может объяснять мне, каков разум RuntimeException?

1
задан 17.01.2017, 02:55
1 ответ

Хороший, хотя трэд немного старый, лучшая opciГіn для меня несомненно состоит в том, чтобы возвращать один ArrayList vacГ - или но не делая один new ArrayList<>(), а используя класс Collections.

'подпись' или signature в inglГ©s mГ©todo, что estГЎs используя вынуждает тебя возвращать объект типа Arraylist<Coffe> а следовательно, если ты это не делаешь, тебя помечает ошибка, так как mГ©todo он не выполняет подпись.

Другой способ выполнять этот 'контракт' состоит в том, чтобы бросать одну excepciГіn, что в этом случае, отнесясь друг к другу одной excepciГіn RuntimeException, не нуждается в том, чтобы быть определенным в подписи.

С другой стороны оставил aquГ - одна pequeГ±a refactorizaciГіn cГіdigo

Connection conn = null;
Statement stmt = null;
PreparedStatement pstmt = null;
ResultSet rs = null;

/**
 * Mejor devolver list que ArrayList
 * List es una interfaz y de esta forma podrías devolver
 * por ejemplo una LinkedList
*/
public List<Coffee> getAllCoffees(){
    try{
        conn = ConnectionPool.getPool().getConnection();
        String sql = "SELECT * FROM coffees";
        stmt = conn.createStatement();
        rs = stmt.executeQuery(sql);
        List<Coffee> coffeeList = new ArrayList<Coffee>();
        Coffee coffee = null;
        while(rs.next()) {
            coffee = new Coffee();
            coffee.setCof_name(rs.getString("cof_name"));
            coffee.setSup_id(rs.getInt("sup_id"));
            coffee.setPrice(rs.getDouble("price"));
            coffee.setSales(rs.getDouble("sales"));
            coffee.setTotal(rs.getDouble("total"));
            coffeeList.add(coffee);
        }
        return coffeeList;
    }
    catch(Exception ex){
        ex.printStackTrace();
        return Collections.emptyList();
    }finally{
       close(rs, stmt, conn);
    }
}

private void close(Autocloseable... autocloseable){
    if (autocloseable != null){
        for (final Autocloseable clos : autocloseable){
            if (clos != null){
                try{
                    clos.close();
                catch(Exception e){
                    e.printStackTrace();
                }
            }
        }
    }
}

, Хотя не, что классы estГЎs используя это mГЎs страховка состоит в том, чтобы они осуществили интерфейс Autocloseable, а следовательно имеет смысл создавать mГ©todo close и, таким образом, он остается cГіdigo mГЎs читабельно каждый раз, когда conn.close () он был аналогичным в ConnectionPool.getPool().releaseConnection(conn);, который должен бы быть asГ - хотя это Гєltimo - sГіlo спекуляции.

С другой стороны следует сказать, что serГ, - чтобы лучше иметь Logger и не использовать e.printStackTrace();

1
ответ дан 24.11.2019, 11:35

Проблема состоит в том, что ты вынуждаешь заканчивать твой метод public ArrayList<Coffee> getAllCoffees() посредством throw new RuntimeException(ex);, для того, чтобы работал правильно метод, этот дебет возвращать тип ArrayList<Coffee>.

Как решение возвращает один ArrayList он опустошил разыскиваемого типа, вместо того, чтобы звонить throw :

  catch(Exception ex)
    {
        ex.printStackTrace();
        //throw new RuntimeException();

        return new ArrayList<Coffee>() ;

    }

Я считаю этим лучшую практику вместо того, чтобы только возвращать стоимость null, return null так как, назвав метод, надеются, что один получает ArrayList объектов Coffee.

3
ответ дан 03.12.2019, 17:39

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

Код функционирует правильно, не бросая исключений и возвращает объект типа ArrayList как объявленного в методе, или программа заканчивает в одном из блоков catch с RuntimeException.

Не бросая исключения в эту часть существовала возможность, которую программа продолжает скроллировать, но не возвращая результата.

Как альтернатива в RuntimeException, ты мог бы добавлять

return null:

в конце конечного блока.

1
ответ дан 03.12.2019, 17:39
  • 1
    Или лучше aú n: иметь có я говорю má s я отлаживаю недействительных и объявлять список, который нужно возвращать в начало и инициализировать ее как new ArrayList<>(), наполнять Ваши элементы внутри чтения ResultSet и после блока finally возвращать - готово. –  17.01.2017, 02:57
  • 2
    Возвращать null или результат vací или в фоне это decisió n архитектуры, видят в обеих формах. Зависит немного вкуса, который один предпочитает, возвращать null рискует NullPointerException в другой части có я говорю, но предотврати ослепи ошибки, которые следуют в возвращении результатов vací вы. –  17.01.2017, 03:02
  • 3
    Недействительный указатель: Ошибка миллиардов dó очаг . Ах, конечно, в programació n функциональный (она " nueva" тенденция), лучше иметь и манипулировать объектами vací вы прежде чем null. И никогда он не известен, когда система не está сделанный доказательству NPEs (пальто в завещаемых системах). Вкратце, лучше предотвращать недействительные. Я предпочитаю функциональность, которая не показывает данные, в которых он бросает NPE где не debí в. –  17.01.2017, 03:03
  • 4
    С желаниями я podrí чтобы терять в дискуссии по поводу этого :D но я считаю коротко, думаю, что он высоко зависимый от контекста системы, если это предпочтительно имения данных erró neos или видимый недостаток из-за excepció n. :) –  17.01.2017, 03:12
  • 5
    Я вооружен для дискуссии. Ты можешь создавать зал чата, когда ты понравишься :) –  17.01.2017, 03:12