Почему код недоступен?

Следующее дает мне сообщение "Код недоступен" на out.close(); Я не могу найти проблему, так как она более или менее идентична другому коду, который я запустил, который работал!

import java.io.*;
import java.net.*;

public class MyClient {
    private static String SERVER = "127.0.0.1";
    private static Integer PORT = 8765;
    public static void main(String[] args) throws IOException {
        // Connect to the server and create the writer and reader
        Socket socket = new Socket(SERVER,PORT);
        PrintWriter out = new PrintWriter(socket.getOutputStream(),true);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        // Loop forever
        while(true) {

            out.println("Question:");
            String sum = System.console().readLine();
            out.println(sum);

            String line = in.readLine().trim();
            if(line==null || line.startsWith("Finished")) {
                socket.close();
                return;
            }
            else if (line.startsWith("My answer is: ")){
                System.out.println(line);
                String message = System.console().readLine();//correct or wrong!!
                out.println(message);
            }       
        }
        // Close the in and out and socket
        out.close();
        in.close();
        socket.close();
    }
}

5 ответов

Решение

Вот проблема

 // Loop forever
        while(true) {

Это будет цикл навсегда, вы никогда не остановите его, поэтому следующая строка после цикла никогда не будет выполнена. Вот и все:P

Вы делаете return изнутри while петля. Ты должен сделать break вместо.

Потому что код никогда не доходит до:

    // Close the in and out and socket
    out.close();
    in.close();
    socket.close();

+ Изменить return в break:

    if(line==null || line.startsWith("Finished")) {
        socket.close();
        break; //<------------------CHANGE
    }

Потому что у вас есть бесконечный цикл (while(true)) без перерыва или других средств выхода.

Это не хороший стиль, чтобы сделать return внутри цикла, но если вы хотите быть уверены, что освободите ресурсы, вы можете обернуть ваш цикл с помощью try ... finally:

try {
  while(true) {
    // ...
    if(condition) {
      return;
    }
    // ...
  }
} finally {
  out.close(); // this is called just before leaving the surrounding function
  // ...
}

Это работает, даже если в цикле есть исключение.

Другие вопросы по тегам