Как я могу создать непрерывный цикл For в программе Java, пока не будет выполнено условие? - PullRequest
0 голосов
/ 23 января 2019

Я хочу создать непрерывный цикл Enhanced For в программе Java для вывода сообщения из автоматического пинга в текстовую область, а затем для остановки при выполнении условия (IP-адрес отключен).У меня есть IP-адреса в массиве строк под названием «IP».Прекрасно работает без цикла, но требует непрерывных итераций, пока ответ не будет обнаружен.

Пробовал с использованием логического цикла, который я включил в код - однако не добавляет текст в TextArea и попадает в непрерывный цикл.

        for (String ip : listOfhosts) {

        boolean repeatLoop = true;


        try {
            InetAddress i = InetAddress.getByName(ip);
            textArea.append("Sending Ping Request to " + ip + "\n");

            //boolean run = true;
            //while (run){

            if (i.isReachable(100)) { // 1 second limit
                textArea.append("Host is online \n");
            } else {
                textArea.append("\nHOST IS OFFLINE\n");
                //System.exit(0); //If something is offline, system will close. For now.   


                try {

                    Message message = new MimeMessage(session);
                    message.setFrom(new InternetAddress("email@gmail.com"));
                    message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("email@hotmail.com"));
                    message.setSubject("Test Mail");
                    message.setText("Test Mail," + "\n Sent From sendMail.java application\n");
                    //textArea.append("OK - Online \n");

                    Transport.send(message);

                    textArea.append("Mail Sent to email@email.com \n host " + ip + " is offline \n");

                    return;

                } catch (MessagingException e) {
                    throw new RuntimeException(e);
                }
            }        
        } catch (Exception e) {
            textArea.append("Unknown HOST\n");
            e.printStackTrace();

        }while(repeatLoop);

Попадание в непрерывный цикл - сбой программы.Любая помощь будет отличной!

Ответы [ 3 ]

0 голосов
/ 23 января 2019
// suppose listOfhosts is a String Array
List<String> srcHostList = new ArrayList<String>();
srcHostList.addAll(Arrays.asList(listOfhosts));

List<String> offlineList = new ArrayList<String>();

while( srcHostList.size() > 0) {
    offlineList.clear(); 
    for(String ip: srcHostList) {
       boolean isOnline = true;
       try{
         // TODO check online
       }catch(Exception ex){
         // TODO handle exception
         isOnline = false;
       }
       if(!isOnline) offlineList.add(ip);
    }
    srcHostList.removeAll(offlineList);
}
0 голосов
/ 23 января 2019

Существует два простых способа выйти из расширенного цикла for в Java.Один из них - выбросить исключение, хотя для нормального управления потоком это считается исключительно плохим использованием исключений.

Другой - использовать break;, который вырвет вас из самого непосредственного цикла for.Людям не всегда нравится return mid-function или break mid-for loop (или continue в этом отношении), поскольку они могут немного походить на операторы goto / jump и снижают ясность вашего кода.С другой стороны, это именно то, для чего предназначен break, поэтому нет никаких аргументов о неправильном использовании инструкции.

Альтернативный подход - использовать обычный цикл while и отказаться от расширенного цикла for для нормального цикла.итератор.В этом случае listOfHosts.iterator() позволит вам вычислить комбинацию .hasNext() и isReachable(...), чтобы решить, продолжать ли цикл.

0 голосов
/ 23 января 2019

Этот код заблокирует ваш пользовательский интерфейс.Вы должны запустить его в отдельном потоке, а также добавить некоторую задержку между проверками.Более простым решением было бы также использовать таймер

Например, для проверки каждую секунду:

Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        // your code
    }
}, 1000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...