Почтовый клиент Java

Рейтинг: 0Ответов: 1Опубликовано: 28.06.2011

Почему программа не завершает работу, а остаётся зависшей?

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.net.Socket;

public class NewMain {

    /**
     * @param args the command line arguments
     */
    public static String tmpStr;
    static StringBuffer tmpBuff = new StringBuffer();
    public static String string;
    public static void main(String[] args) throws Exception {
        // TODO code application logic here

        Socket s = new Socket("pop.yandex.ru", 110);
        s.getOutputStream().write("USER thisisforjava".getBytes("iso-8859-1"));
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream(), "iso-8859-1"));

        while (true) {
            String line = br.readLine();
            if (!line.startsWith("+OK")) break;
            System.out.println(line);
        }
        br.close();
        s.close();
    }
}

Ответы

▲ 2

У вас падает исключению, но его никто не ловит. Оно идет на уровень выше. Правильно было бы:

  1. Отлавливать исключения IOException
  2. Закрывать reader и socket в finally блоке.
  3. Изменить логику работы с reader.

Так, у объекта типа reader есть метод ready, сообщающий о готовности. Сразу после направления одного потока в другой reader будет пуст, ready = false. Мы должны сначала дождаться, когда наступит готовность, и только тогда приступать к чтению из буфера с помощью метода readLine. В противном случае будет брошено исключение, которое в вашем примере и происxодило.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class NewMain {

public static void main(String[] args) {
    Socket s = null;
    BufferedReader br = null;
    try {
        s = new Socket("pop.yandex.ru", 110);
        s.getOutputStream().write("USER thisisforjava".getBytes("iso-8859-1"));
        br = new BufferedReader(new InputStreamReader(s.getInputStream(), "iso-8859-1"));
        while (true) {
            if (!br.ready()) continue; 
            String line = br.readLine();
            if (line.startsWith("+OK")) {
                System.out.println(line);
                break;
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            br.close();
            s.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   }
}