while (true) цикл без перерыва


Я довольно новичок в программировании на Java. Сейчас я изучаю исходный код приложения для android под названием Evercam. Однако у меня есть проблема с пониманием части кода, которая включает цикл while(true).

Вот фрагмент кода:

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} на самом деле выходит без каких-либо перерывов или делает это когда-либо выйти??


EDIT

Моя ошибка в том, что я фактически извлек этот фрагмент из декомпиляции непосредственно из файлов проекта android. Я не знал, что все будет по-другому, и опять же, я знаю очень мало. Вот исходный код :

    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. Большое спасибо за ответ, я буду помнить, что от декомпилированных классов нельзя зависеть.

3 5

3 ответа:

Этовыглядит как бесконечная петля. Чтобы быть абсолютно уверенным, вы должны были бы статически прочитать каждый оператор и следовать вызываемым методам, чтобы увидеть, существуют ли какие-либо возможные вызовы, такие как Activity#finish() или Service#stopSelf(), которые завершили бы текущую работу, эффективно разрывая цикл.

Другая возможность заключается в том, что код предназначен для выполнения в бесконечном цикле в качестве фоновой службы потока, и какой-то другой компонент будет иметь возможность убить эту службу, когда она будет запущена. достигает определенного состояния. Например, он может быть частью класса Runnable и выполняться в пуле потоков,а при наличии тайм-аута пул завершается.

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

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

Вы создаете новый поток, выполняющий службу бесконечно благодаря while (true), и когда вы останавливаете приложение, вы просто убиваете процесс, соответствующий службе.