2014-11-29 3 views
0

Я врывался в сетевую библиотеку Netty, пытаясь научиться писать некоторый базовый сетевой код NIO, когда я столкнулся с чем-то, что не выглядело мне прямо, для цикла без чего-либо внутри, вот код :Java for (;;) loop?

for (;;) { 
    SocketChannel acceptedSocket = channel.socket.accept(); 
    if (acceptedSocket == null) { 
     break; 
    } 
    registerAcceptedChannel(channel, acceptedSocket, thread); 
} 

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

комментирование прямо над этим кодом говорится следующее:

// accept connections in a for loop until no new connection is ready 

Но это не объясняет мне, как это работает, и почему, он просто говорит, что он делает.

Если вам нужен весь метод, здесь:

@Override 
protected void process(Selector selector) { 
    Set<SelectionKey> selectedKeys = selector.selectedKeys(); 
    if (selectedKeys.isEmpty()) { 
     return; 
    } 
    for (Iterator<SelectionKey> i = selectedKeys.iterator(); i.hasNext();) { 
     SelectionKey k = i.next(); 
     i.remove(); 
     NioServerSocketChannel channel = (NioServerSocketChannel) k.attachment(); 

     try { 
      // accept connections in a for loop until no new connection is ready 
      for (;;) { 
       SocketChannel acceptedSocket = channel.socket.accept(); 
       if (acceptedSocket == null) { 
        break; 
       } 
       registerAcceptedChannel(channel, acceptedSocket, thread); 
      } 
     } catch (CancelledKeyException e) { 
      // Raised by accept() when the server socket was closed. 
      k.cancel(); 
      channel.close(); 
     } catch (SocketTimeoutException e) { 
      // Thrown every second to get ClosedChannelException 
      // raised. 
     } catch (ClosedChannelException e) { 
      // Closed as requested. 
     } catch (Throwable t) { 
      if (logger.isWarnEnabled()) { 
       logger.warn(
         "Failed to accept a connection.", t); 
      } 

      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e1) { 
       // Ignore 
      } 
     } 
    } 
} 
+0

Это бесконечный цикл. – squiguy

+0

Каждая часть цикла 'for' является необязательной. Это можно рассматривать как цикл for-ever, так как нет никаких условий для проверки и нет шага приращения для запуска. – Makoto

+0

..., который будет завершен с 'break;' only –

ответ

6

for (;;) бесконечный цикл, что эквивалентно while (true). Поскольку for-loop не имеет оператора терминации, он никогда не завершится.

Все три компонента в течение петли не являются обязательными: for (initialization; termination; increment)

+0

Ах! Это имеет смысл! Я понятия не имел, что вы могли изгнать такие утверждения, так что в основном 'for (int i = 0;; i ++)' увеличивал бы i навсегда, правильно? – Hobbyist

+0

@ Christian.tucker Точно. – August

+0

Очень удобно, я буду отмечать это как правильное, когда истечет таймер. – Hobbyist