while(true)loop without break

while(true)loop without break

问题描述:

我对Java编程颇为陌生。现在我正在研究名为Evercam的Android应用程序的源代码。但是,我在理解涉及while(true)循环的代码的一部分时遇到问题。while(true)loop without break

下面是代码的片段:

while (true) 
{ 
    while (true) 
    { 
     byte[] responseMessageByteArray = new byte[4000]; 
     DatagramPacket datagramPacketRecieve = new DatagramPacket(responseMessageByteArray, responseMessageByteArray.length); 
     datagramSocket.receive(datagramPacketRecieve); 
     String responseMessage = new String(datagramPacketRecieve.getData()); 
     EvercamDiscover.printLogMessage("\nResponse Message:\n" + responseMessage); 
     StringReader stringReader = new StringReader(responseMessage); 
     InputNode localInputNode = NodeBuilder.read(stringReader); 
     EnvelopeProbeMatches localEnvelopeProbeMatches = (EnvelopeProbeMatches)(new Persister()).read(EnvelopeProbeMatches.class, localInputNode); 
     if (localEnvelopeProbeMatches.BodyProbeMatches.ProbeMatches.listProbeMatches.size() > 0) 
     { 
      ProbeMatch localProbeMatch = (ProbeMatch) localEnvelopeProbeMatches.BodyProbeMatches.ProbeMatches.listProbeMatches.get(0); 
      if (uuidArrayList.contains(localProbeMatch.EndpointReference.Address)) 
      { 
       EvercamDiscover.printLogMessage("ONVIFDiscovery: Address " + localProbeMatch.EndpointReference.Address + " already added"); 
      } 
      else 
      { 
       uuidArrayList.add(localProbeMatch.EndpointReference.Address); 
       DiscoveredCamera discoveredCamera = getCameraFromProbeMatch(localProbeMatch); 
       if (discoveredCamera.hasValidIpv4Address()) 
       { 
        this.onActiveOnvifDevice(discoveredCamera); 
        cameraList.add(discoveredCamera); 
       } 
      } 
     } 
    } 
} 

这难道不是创建一个无限循环?我在Java的基础知识不强,所以我会很感激,如果有人可以告诉在什么情况下while(true){//codes}实际上没有任何中断有没有退出?


编辑

我不好其实从反编译从Android项目文件中提取这个片段直接。我不知道它会有所不同,然后再次,我知道的很少。这里是原始的code

public ArrayList<DiscoveredCamera> probe() { 
ArrayList<DiscoveredCamera> cameraList = new ArrayList<DiscoveredCamera>(); 

try { 
    DatagramSocket datagramSocket = new DatagramSocket(); 
    datagramSocket.setSoTimeout(SOCKET_TIMEOUT); 
    InetAddress multicastAddress = InetAddress.getByName(PROBE_IP); 

    if (multicastAddress == null) { 
    // System.out.println("InetAddress.getByName() for multicast returns null"); 
    return cameraList; 
    } 

    // Send the UDP probe message 
    String soapMessage = getProbeSoapMessage(); 
    // System.out.println(soapMessage); 
    byte[] soapMessageByteArray = soapMessage.getBytes(); 
    DatagramPacket datagramPacketSend = new DatagramPacket(
     soapMessageByteArray, soapMessageByteArray.length, 
     multicastAddress, PROBE_PORT); 
    datagramSocket.send(datagramPacketSend); 

    ArrayList<String> uuidArrayList = new ArrayList<String>(); 
    while (true) { 
    // System.out.println("Receiving..."); 
    byte[] responseMessageByteArray = new byte[4000]; 
    DatagramPacket datagramPacketRecieve = new DatagramPacket(
     responseMessageByteArray, 
     responseMessageByteArray.length); 
    datagramSocket.receive(datagramPacketRecieve); 

    String responseMessage = new String(
     datagramPacketRecieve.getData()); 

    EvercamDiscover.printLogMessage("\nResponse Message:\n" 
     + responseMessage); 

    StringReader stringReader = new StringReader(responseMessage); 
    InputNode localInputNode = NodeBuilder.read(stringReader); 
    EnvelopeProbeMatches localEnvelopeProbeMatches = new Persister() 
     .read(EnvelopeProbeMatches.class, localInputNode); 
    if (localEnvelopeProbeMatches.BodyProbeMatches.ProbeMatches.listProbeMatches 
     .size() <= 0) { 
     continue; 
    } 

    ProbeMatch localProbeMatch = localEnvelopeProbeMatches.BodyProbeMatches.ProbeMatches.listProbeMatches 
     .get(0); 
    // EvercamDiscover.printLogMessage("Probe matches with UUID:\n" 
    // + 
    // localProbeMatch.EndpointReference.Address + " URL: " + 
    // localProbeMatch.XAddrs); 
    if (uuidArrayList 
     .contains(localProbeMatch.EndpointReference.Address)) { 
     EvercamDiscover.printLogMessage("ONVIFDiscovery: Address " 
      + localProbeMatch.EndpointReference.Address 
      + " already added"); 
     continue; 
    } 
    uuidArrayList.add(localProbeMatch.EndpointReference.Address); 
    DiscoveredCamera discoveredCamera = getCameraFromProbeMatch(localProbeMatch); 

    if (discoveredCamera.hasValidIpv4Address()) { 
     onActiveOnvifDevice(discoveredCamera); 
     cameraList.add(discoveredCamera); 
    } 
    } 
} catch (Exception e) { 
    // ONVIF timeout. Don't print anything. 
} 

原来在实际的代码中有continue语句。非常感谢你的回复,我会记住,不应该依赖于已编译的类。

+0

你是否执行了代码并试用? – sidgate

+0

双重嵌套'while(true)'循环看起来多余 - 只有一个会做。 –

+0

这确实看起来有点阴凉。 – Shaishav

看起来像一个无限循环。要绝对确定,您必须静态读取每条语句并按照调用的方法来查看是否存在可能的调用,例如Activity#finish()Service#stopSelf(),这些调用将完成当前正在运行的活动,从而有效地打破循环。

另一种可能性是,该代码旨在作为后台线程服务在无限循环中运行,而其他某个组件在达到特定条件时可以选择终止该服务。例如,它可能是Runnable类的一部分,并在线程池中执行,并且当超时存在时,该池将关闭。

+1

我同意,并有适当的上下文,就像调用这段代码的地方一样,我们可以肯定地知道。 – Vucko

+0

谢谢!您实际上帮助我更多地了解了其超时行为的Runnable类,并列出了许多可能性。 – daisura99

+2

@ daisura99'Runnable'是一个接口,而不是一个类,因此它没有特定的行为。 – m0skit0

从while循环中退出的唯一可能的方法是如果在循环中调用的某个方法抛出异常。检查这些方法的代码是否有异常或在此共享

没有任何中断的无限循环可能对服务在后台运行有用。

您创建了一个新的线程,无限感谢一段时间(true),当您停止应用程序时,您只需要终止与服务相对应的进程。