Читаю условия задачи: 1. Выводить сообщение, что установлено новое соединение с удаленным адресом, который можно получить с помощью метода getRemoteSocketAddress(). 2. Создавать Connection, используя поле socket. Вроде бы ничего сложного, только вот есть над чем подумать. В каком-то из прошлых заданий одним из условий было создание метода SocketAddress getRemoteSocketAddress() в классе Connection, такой же метод есть и в самом классе Socket, собственно одноименный метод из класса Connection только и делает, что вызывает этот же метод над переданным сокетом. По сути одно и тоже. Ход моих мыслей: Нужно вывести сообщение, что удаленный хост подключился. Но! Он сначала должен подключиться, а в нашем случае это явное создание экземпляра Connection, которое может кинуть исключение, а значит, в теории, если оповещение поставить выше создания экземпляра Connection, то мы можем оповестить о подключении, а само подключение крашнется. Значит, логически правильнее будет сначала создать connection, а потом уже рассказывать, что кто-то подключился. Да и логично, если "адрес" удаленного хоста мы получим уже из самого connection, не зря же мы все таки писали этот метод. По этому получается вот такой код:
Connection connection = new Connection(socket);
SocketAddress socketAddress = connection.getRemoteSocketAddress():
if (socketAddress != null) {
    ConsoleHelper.writeMessage(String.format("The remote address [%1$s] has been connected!", socketAddress) );
}
Отправляем, получаем ошибку валидации по первому пункту: "Вам нужно вывести сообщение используя метод getRemoteSocketAddress()" Сидел думал, что не так, пробовал вызывать метод у сокета напрямую, вот так:
SocketAddress socketAddress = socket.getRemoteSocketAddress();
Connection connection = new Connection(socket);
if (socketAddress != null) {
    ConsoleHelper.writeMessage(String.format("The remote address [%1$s] has been connected!", socketAddress) );
}
Опять не проходит, та же ошибка. Потому думаю: "Ну ладно, все таки 37 уровней прошел, чего только не насмотрелся уже тут, попробую сделать как по условию, пусть будет не логично, за то по условию:
SocketAddress socketAddress = socket.getRemoteSocketAddress();
if (socketAddress != null) {
    ConsoleHelper.writeMessage(String.format("The remote address [%1$s] has been connected!", socketAddress) );
}
Connection connection = new Connection(socket);
И бац! Задача принята... Я, видимо, не той логикой размышляю. Где ошибка в ходе моих мыслей? Почему сначала выводится сообщение, а потом создается подключение? И зачем путать людей одноименными методами в условии задачи? в чем сложность конкретизировать, что и зачем делается именно в таком порядке, в котором делается? Не понимаю...