2012-08-07 60 views
0

通过一些教程去约插座,我把未来整个代码那样:Java:阅读循环如何逃脱?

while(true){ 
    socket.receive(packet); 
    String message = new String(packet.getData(),0,packet.getLength(), TEXT_ENCODING); 
    System.out.println(message); 
    } 

的问题是:如何离开这个循环?只有通过catch,一旦receive()完成了?

更确切地说,这里是我做了什么:

while(true) { 
     try { 
      socket.receive(answer); 
      resultString = new String(answer.getData(), 0, answer.getLength(), "ASCII"); 

      if (isMyIdentifier(resultString)) { 
       gatewayIP = answer.getAddress().getHostAddress(); 
       return true; 
      } else { 
       return false; 
      } 
     } 
     catch (SocketTimeoutException e) { 
      throw new GatewayNotReachableException(); 
     } 
    } 

,但我一直想出一个TimeoutException,虽然读是正确的。所以我想知道,如果例外是'预期'的方式离开。尽管我认真地怀疑...和socket.receive(packet)是什么,抛出了异常。

+0

您可以使用'break'声明:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html – 2012-08-07 12:50:53

+0

没有'catch'在此代码。 – 2012-08-07 12:51:32

+0

@HunterMcMillen他不问他如何能完成工作,他问的是代码(取自教程)是如何工作的。 – 2012-08-07 12:51:39

回答

0

在下面的代码有一个连续while loop,这似乎是一个合适的实现,但有些服务器必须的趋势继续听,同时处理请求。

这个while循环永远不会退出!

while(true){ 
    socket.receive(packet); 
    String message = new String(packet.getData(),0,packet.getLength(), TEXT_ENCODING); 
    System.out.println(message); 
    } 
+0

之后的return语句那样,如果在这种情况下,我实际上只期望一个答案,receive()会等待第一个进来,然后继续?意思是,简单地删除循环应该做的伎俩... – 2012-08-07 13:03:09

+0

是的,如果你期望只有一个套接字进来,只是不要循环。 – 2012-08-07 13:40:20

4

相信与否,你不希望所有的循环终止。

一个经典的例子是一个简单的循环,监听请求,处理请求,然后再次等待 - “永远”。这基本上就是你的代码示例。

答案是“这个循环不剩”,这就是你想要的。

+0

+1,但是专门针对预先编辑的问题(即提供的第一个代码块) – 2012-08-07 13:01:14

0

循环从不离开,这是服务器熬夜的全部目的。

或者你想让服务器接收一个客户端调用然后关机?

0

循环不会被打破,除非内部发生错误。

0

这两个代码块意味着非常不同的功能意义。

第一个人似乎说:“我希望我的请求处理程序无限期运行,直到我自己手动退出程序!”这是合理的说法。

但第二块代码是完全不同的。你进入循环,但不会多次循环,因为isMyIdentifier(resultString)是真的,在这种情况下,你退出方法(和当然循环),或者它不是在这种情况下你仍然退出的方法。在这种情况下,循环根本没有做任何事情。

此外,异常处理为您的第二块代码退出循环提供了另一种方式。至于为什么它是抛出一个例外,这是另一个问题。

+0

因此,正如我想到的上面的一条评论,完全消除循环恰好是正确的!在此期间我已经完成了,这让我摆脱了这个例外。 – 2012-08-07 13:30:10

+0

我无法想象单独的循环会导致异常,因为在内部代码块中循环没有任何作用。返回语句退出整个方法,并且你的if的两个分支都有返回语句。它永远不会到达你的循环的关闭'}'来重复。我会删除它,只是因为它的代码什么都没做,就像在返回语句 – 2012-08-07 13:39:18