【问题标题】:while(true) loop without breakwhile(true) 循环不中断
【发布时间】:2016-12-03 22:38:34
【问题描述】:

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

这里是sn-p的代码:

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项目文件中直接从反编译中提取这个sn-p是我的坏事。我不知道它会有所不同,而且我知道的很少。这里是原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 语句。非常感谢您的回复,我会记住不应该依赖反编译的类。

【问题讨论】:

  • 你执行了代码并尝试了吗?
  • 基本上有 5 件事会停止循环执行:break、异常、returnSystem.exit 和循环条件。
  • 我想知道这里是否缺少一些上下文:可能有一个周围的 try/catch,这是预期循环中断的机制。
  • 其中一种方法可能存在异常。但否则循环不会退出。
  • @ParkerHalo 和 continue 到外部范围。

标签: java android while-loop infinite-loop


【解决方案1】:

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

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

【讨论】:

  • 我同意,并且通过适当的上下文,例如调用此代码的位置,我们可以确定。
  • 谢谢!您实际上帮助我更多地了解 Runnable 类的超时行为并列出了许多可能性。
  • @daisura99 Runnable 是一个接口,而不是一个类,因此它没有特定的行为。
  • @daisura99 事实上,正如 m0skit0 所说,Runnable 没有超时行为,因为它只定义了一个由线程中运行的类实现的接口。见docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html。超时等是应用程序中更高级别的详细信息。
  • 感谢您的纠正和容忍我的肤浅。我真的很感激。
【解决方案2】:

退出 while 循环的唯一可能方法是,如果在循环中调用的方法之一抛出异常。检查这些方法的代码是否有异常或在这里分享

【讨论】:

    【解决方案3】:

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

    您创建了一个新线程来无限地执行服务,这要归功于一段时间(true),当您停止应用程序时,您只需终止与服务对应的进程。

    【讨论】:

      猜你喜欢
      • 2012-03-26
      • 2012-07-13
      • 1970-01-01
      • 2021-01-30
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      相关资源
      最近更新 更多