Я не тестировал ваш код, так что это был бы совершенно другой случай, но все же я хотел бы поделиться своим опытом. (Также это должен быть слишком поздний ответ, хотя, я надеюсь, что этот ответ все же поможет кому-то в будущем)
Недавно я сталкивался с подобным опытом, как вы, например, иногда сеть недоступна, но иногда нет. Короче говоря, причина была слишком малая. Кажется, что Java выдает IOException с сообщением «Сеть недоступна», когда соединение не удается из-за этого. Это было настолько вводящим в заблуждение (я ожидал бы что-то вроде того, чтобы сказать "время ожидания"), и я потратил почти месяц, чтобы обнаружить это.
Здесь я нашел еще один пост о том, как установить время ожидания.
Альтернатива java.net.URL для настройки времени ожидания
Опять же, это может быть не тот случай, который вы получили, но кто-то на будущее.