java - while(true) 循环不间断

标签 java android while-loop infinite-loop

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

代码 fragment 如下:

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} 会在没有任何 break< 的情况下实际退出,我将不胜感激/strong> 还是它曾经退出??


编辑

我的坏习惯是直接从 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语句。非常感谢您的回复,我会记住反编译的类不要依赖。

最佳答案

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

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

关于java - while(true) 循环不间断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38654962/

相关文章:

java - 检查列表是否已包含具有相似值的对象 - java

java - Continuum 作为 Jenkins 的替代品?

java - 将 mysql 查询转换为 JPQL 查询

Java:即使 module-info 打开必要的包, springrframework.beans 也无法访问

c - 按按钮暂停正在运行的功能

javascript - while 循环中的 IF 语句不起作用,我哪里出错了?

android - 如何将不同像素密度的相同图像添加到 drawable 目录(android studio)?

android - 广告不可见。不刷新添加。从现在开始安排广告刷新 60000 毫秒

android - "Unresolved reference: NativeSqliteDriver"for sqldelight 添加到 ios 源集

Python while 循环不断缩短我的列表!为什么?