Java в то время как цикл - PullRequest
       17

Java в то время как цикл

1 голос
/ 09 августа 2011

У меня проблемы с циклом while.Этот цикл while выполняется в потоке и является «основным циклом» потока, и у меня возникают проблемы с его продолжением, если один из операторов if, который он циклически повторяет, имеет значение false.Этот поток обрабатывает как отправку, так и получение Команд / Сообщений IRC для использования в клиенте Minecraft.

Код в его нынешнем виде:

do {
    System.out.println("IRC Thread Looped!");
    if(tosend != "") {
        writer.write("PRIVMSG " + channel + " :"+tosend+"\r\n");
        System.out.println(tosend);
        mc.thePlayer.addChatMessage("\247f[\247bIRC\247f] \2477"+nick+": \247f"+tosend);
        tosend = "";
        writer.flush();
    }

    if((line = reader.readLine()) != null) {
        if(line.startsWith("PING ")) {
            writer.write("PONG " + line.substring(5) + "\r\n");
            writer.flush( );
        }
        else {
            // we need to pretty this ugly sh*t up!
            try {
                String parsedline;
                String args[] = line.split("!");
                String args2[] = args[1].split(":");
                args[0] = args[0].substring(1, args[0].length());
                parsedline = "\2477"+ args[0] +": \247f"+ args2[1];
                mc.thePlayer.addChatMessage("\247f[\247bIRC\247f] "+parsedline);
            }
            catch(Exception e) {                          
                mc.thePlayer.addChatMessage("\247f[\247bIRC\247f]\247f "+line);
                continue;
            }
        }  
    }
    try {
        Thread.sleep(90L);}catch(Exception e) { };
    }
} while(true);

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Обратите внимание, что потоки Java любят есть исключения, которые выбрасываются из метода run ().

Поскольку у вас есть IO, например if((line = reader.readLine()) != null){, а не try / catch, вы можете вызвать исключение и выйти.

Что мне нравится делать с потоками, так это помещать код основного потока в runImpl(), чтобы run() выглядело так.

public void run()
{
    try
    {
        runImpl();
    }
    catch( Throwable t )
    {
        // log the throwable
    }
}

Тогда, как минимум, вы обнаружите, что ваш поток выдал что-то неожиданное.

0 голосов
/ 09 августа 2011

Если проблема вызвана поведением блокировки getLine (), вы, вероятно, можете исправить это следующим образом. Я не запускал этот код, поэтому я не гарантирую, что он будет работать. Также убедитесь, что читатель является BufferedReader.

    StringBuilder sb = new StringBuilder();
    String line = null;
    int n = 0;
    do {
        System.out.println("IRC Thread Looped!");
        if(tosend != ""){
            writer.write("PRIVMSG " + channel + " :"+tosend+"\r\n");
            System.out.println(tosend);
            mc.thePlayer.addChatMessage("\247f[\247bIRC\247f] \2477"+nick+": \247f"+tosend);
            tosend = "";
            writer.flush();
        }

        while (reader.ready()) {
            int c = reader.read();
            if (c == -1) {
                if (n > 0) {
                    line = sb.toString();
                    sb = new StringBuilder();
                }
                break;
            }
            if (c == '\n' || c == '\r') {
                line = sb.toString();
                sb = new StringBuilder();
                break;
            }
            sb.append((char)c);
            n++;
        }

        if(line != null){
            if (line.startsWith("PING ")) {
                writer.write("PONG " + line.substring(5) + "\r\n");
                writer.flush( );
            }
            else
            {
                //we need to pretty this ugly shit up!
                try{
                    String parsedline;
                    String args[] = line.split("!");
                    String args2[] = args[1].split(":");
                    args[0] = args[0].substring(1, args[0].length());
                    parsedline = "\2477"+args[0] +": \247f"+ args2[1];
                    mc.thePlayer.addChatMessage("\247f[\247bIRC\247f] "+parsedline);

                }catch(Exception e){
                    mc.thePlayer.addChatMessage("\247f[\247bIRC\247f]\247f "+line);
                    continue;
                }
            }
            line = null;
            n = 0;
        }

        try{Thread.sleep(90L);}catch(Exception e){};
    } while(true);
...