Java - Исключение должно быть выброшено, но как? - PullRequest
3 голосов
/ 24 марта 2009

Я получаю сообщение об ошибке в NetBeans, в котором говорится, что я должен выбросить SQLException в этом методе:

private void displayCustomerInfo(java.awt.event.ActionEvent evt)                                     
{                                         
    int custID = Integer.parseInt(customerID.getText());
    String info = getCustomerInfo(custID);
    results.setText(info);
}

Этот метод создан NetBeans, поэтому он не позволяет мне редактировать подпись и выдавать исключение. Вот почему я создал метод getCustomerInfo(). Этот метод вызывает исключение, потому что он использует метод для извлечения информации из базы данных о клиенте.

public String getCustomerInfo(int cid) throws SQLException
{
    Customer c = proc.getCustomer(cid);
    // get info
    return "info";
}

Метод getCustomer также генерирует исключение, и proc.java компилирует.

Точная ошибка

unreported exception java.sql.SQLException; must be caught or declared to be thrown

Ответы [ 6 ]

10 голосов
/ 24 марта 2009

Как правило, если вашему коду необходимо выдать исключение, которое не поддерживает подпись, и у вас нет контроля над интерфейсом, вы можете перехватывать и отбрасывать его как тип, поддерживаемый интерфейсом. Если ваш интерфейс не объявляет НИКАКИХ проверенных исключений, вы всегда можете выдать RuntimeException:

private void displayCustomerInfo(java.awt.event.ActionEven evt)                                     
{        
    try
    {                                 
        int custID = Integer.parseInt(customerID.getText());
        String info = getCustomerInfo(custID);
        results.setText(info);  
    }
    catch (SQLException ex)
    {
        throw new RuntimeException(ex);  // maybe create a new exception type?
    }
}

Вы почти наверняка захотите создать новый тип Exception, который расширяет RuntimeException, и ваш клиентский код перехватит это исключение. В противном случае вы рискуете перехватить ЛЮБОЕ RuntimeException, включая NullPointerException, ArrayIndexOutOfBoundsException и т. Д., Которое ваш клиентский код, вероятно, не может обработать.

8 голосов
/ 24 марта 2009

Прочитайте сообщение об ошибке еще раз, оно дает вам два варианта.

Вы должны либо объявить исключение как выброшенное (что вы не можете сделать), либо перехватить исключение. Попробуйте второй вариант.

3 голосов
/ 24 марта 2009

Вам нужно поставить блок try / catch вокруг вашего вызова на getCustomerInfo(), вот так:

private void displayCustomerInfo(java.awt.event.ActionEvent evt)                                     
{                                         
    int custID = Integer.parseInt(customerID.getText());
    try {
        String info = getCustomerInfo(custID);
    } catch (SQLException sqle) {
        // Do something with the exception
    }

    results.setText(info);
}

Может быть несколько хороших вариантов обработки исключения: регистрация исключения и сведений, использованных для его получения, или использование его в качестве сигнала для повторной попытки запроса соединения. В качестве альтернативы, как показывает Outlaw Programmer, вы можете перезапустить Exception как RuntimeException какого-либо рода, что устраняет необходимость проверки.

2 голосов
/ 24 марта 2009

Это не говорит, что вы должны бросить его. Это говорит, что вы можете поймать это. Так что используйте блок try / catch и обработайте его.

try {
    ...
}
catch (SQLException e) {
    System.out.println("Exception happened! Abort! Abort!");
    e.printMessage(); //Not sure if this is the correct method name
}
1 голос
/ 18 января 2013

Сгенерированные компоненты NetBeans содержат неизменяемый код, и я предполагаю, что он создается как часть GUI Builder. Я бы спросил, так ли это, но пока не могу комментировать. Если вы выберете сгенерированный объект в редакторе графического интерфейса, справа будет вкладка «Код», которую можно использовать для изменения серой области кода.

Здесь:
Code tab that is used to modify generated code.

0 голосов
/ 12 мая 2018

Я сталкивался с этой проблемой ... был озадачен в течение последних 2 дней ... затем я открываю исходный код (файл .java) с возвышенным, меняю код, сохраняю, и он творит чудеса ... Я ' я смеюсь, когда вижу, что это работает ... думаю, что нестандартное действительно работает ...

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