обработка исключений Java - PullRequest
       8

обработка исключений Java

1 голос
/ 23 апреля 2010

Этот вопрос связан с исключениями Java, почему в некоторых случаях, когда выбрасывается исключение, программа завершает работу, даже если исключение было перехвачено и не было оператора exit ()? мой код выглядит примерно так

    void bindProxySocket(DefaultHttpClientConnection proxyConnection, String hostName, HttpParams params)
{
    if (!proxyConnection.isOpen()) 
    {

        Socket socket = null;
        try {
            socket = new Socket(hostName, 80);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try
        {
            proxyConnection.bind(socket, params);
        }
        catch(IOException e)
        {
            System.err.println ("couldn't bind socket");
            e.printStackTrace();
        }
    }
}

, а затем

Я называю этот метод так:

bindProxySocket(proxyConn, hostName, params1);

но программа закрывается, хотя я хочу обработать исключение, делая что-то еще, может ли это быть из-за того, что я не заключил вызов метода в предложение try catch? что произойдет, если я поймаю исключение снова, хотя оно уже есть в методе? и что мне делать, если я хочу очистить ресурсы в предложении finally, только если происходит исключение, и в противном случае я хочу продолжить работу с программой? Я предполагаю, что в этом случае мне нужно включить весь кусок кода, пока я не смогу очистить ресурсы в операторе try или я могу сделать это в операторе исключений дескриптора? некоторые из этих вопросов касаются этого конкретного случая, но я хотел бы получить подробный ответ на все мои вопросы для дальнейшего использования. спасибо

редактирование:

java.net.UnknownHostException: www.dsewew324f.com
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at homework3.Proxy.bindProxySocket(Proxy.java:666)
    at homework3.Proxy$3.handle(Proxy.java:220)
    at org.apache.http.protocol.HttpService.doService(HttpService.java:293)
    at org.apache.http.protocol.HttpService.handleRequest(HttpService.java:212)
    at homework3.Proxy.start(Proxy.java:472)
    at homework3.Proxy.main(Proxy.java:1282)
Exception in thread "main" java.lang.IllegalArgumentException: Socket may not be null
    at org.apache.http.impl.DefaultHttpClientConnection.bind(DefaultHttpClientConnection.java:80)
    at homework3.Proxy.bindProxySocket(Proxy.java:674)

Ответы [ 6 ]

4 голосов
/ 23 апреля 2010

Если

socket = new Socket(hostName, 80);

выдает исключение, тогда socket будет нулевым и

proxyConnection.bind(socket, params);

выбросит NullPointerException, который вы не поймаете.

2 голосов
/ 23 апреля 2010

Вы уверены, что исключение было поймано? Ваш блок catch ловит только определенные исключения. Возможно возникновение исключения Runtime, которое не будет перехвачено ..

0 голосов
/ 23 апреля 2010

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

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

    Socket socket = null;
    try {
        socket = new Socket(hostName, 80);
        try
        {
            proxyConnection.bind(socket, params);
        }
        catch(IOException e)
        {
            System.err.println ("couldn't bind socket");
            e.printStackTrace();
        }
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

Лучшая практика - просто оставить это исключение и объявить throws в вашем методе. Вы должны обрабатывать исключение только там, где имеет смысл обрабатывать его. Не подавляйте исключения, просто распечатав трассировку и продолжив выполнение программы.

0 голосов
/ 23 апреля 2010

Чтобы ответить на некоторые ваши вопросы: что произойдет, если я поймаю исключение снова, даже если оно уже используется в методе?

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

что мне делать, если я хочу очистить ресурсы, только если возникает исключение, и в противном случае я хочу продолжить работу с программой?

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

Я предполагаю, что в этом случае мне нужно включить весь фрагмент кода, пока я не смогу очистить ресурсы с помощью оператора try или я могу сделать это с помощью оператора исключения дескриптора?

Я уже ответил на этот вопрос приведенным выше: P

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

try{
bindProxySocket(proxyConn, hostName, params1);
}
catch(Exception e){
e.printStackTrace():
}
0 голосов
/ 23 апреля 2010

Может быть, proxyConn равно нулю, и поскольку

 if (!proxyConnection.isOpen())

не находится в блоке try / catch, это может привести к необработанному исключению, которое приведет к выходу вашей программы.

0 голосов
/ 23 апреля 2010

Может быть, ваша программа просто приходит к своему естественному завершению (выходит из основного метода)?

Если ваша программа завершает работу из-за исключения, вызванного из метода main, ее следует вывести на консоль. Можете ли вы предоставить эту трассировку стека?

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