Это возможно в Java? (код для выполнения) if (условие)

Обратите внимание, что я не гава-гава. Я не могу использовать правильную терминологию, я изучаю Java на RFT на лету. То, что описано ниже, работает точно так, как указано.


В рубине мы можем кодировать как

(code to execute) if (condition)

Я хочу сделать то же самое, чтобы мой код RFT (Rational Functional Tester) был легко читаемым. Я собираюсь вызывать свои пользовательские функции таким образом, чтобы

        findANDclick(new String[]{"id", "menuButton"});
        findANDclick(new String[]{"src", ".*homeicon_calendar.*"}); 
        findANDclick(new String[]{"src", ".*cycle_templates.*"});   

Но весь сценарий RFT должен завершиться и не выполнять никакого другого кода в случае сбоя любой из функций findANDclick. Функция ищет объект в html-странице и, если не находит его, throws new Exception с помощью

throw new Exception("findANDclick: the object was not found");

поэтому экземпляр findANDclick ONLY выдает ошибку, поэтому выполняется следующий findANDclick. Но не имеет смысла продолжать поиск следующего объекта, если предыдущий не был найден и не нажал.

Я думал, что я могу иметь переменную continue установите в true и в случае возникновения исключения findANDclick обновит его до false. Тогда я могу сделать что-то вроде

    if (continue) { findANDclick(new String[]{"id", "menuButton"});}
    if (continue) { findANDclick(new String[]{"src", ".*homeicon_calendar.*"}); }   
    if (continue) { findANDclick(new String[]{"src", ".*cycle_templates.*"});   }

было бы здорово, если бы я мог сделать что-то вроде

        { findANDclick(new String[]{"id", "menuButton"}); } if (continue)
        { findANDclick(new String[]{"src", ".*homeicon_calendar.*"}); } if (continue)
        { findANDclick(new String[]{"src", ".*cycle_templates.*"}); } if (continue)

5 ответов

Решение

Радек! Попробуйте выполнить следующий пример, просто чтобы уточнить, как работает обработка исключений Java.

public class ExceptionHandling {
    /*Method that throws exception*/
    static void methodOne() throws Exception {
        System.out.println("methodOne();");
        try {
            throw new Exception();
        } catch (Exception e) {
            System.out.println("Exception caught in methodOne(), worked up, and thrown again.");
            throw new Exception();
        }
    }

    static void methodTwo() {
        System.out.println("methodTwo();");
    }

    public static void main(String[] args) {
        try {
            methodOne();
            methodTwo();
        } catch (Exception ex) {
            System.out.println("Exception caught in main()!");
        }
    }
}

Вывод этого примера:

methodOne();
Exception caught in methodOne(), worked up, and thrown again.
Exception caught in main()!

Это показывает, что второй метод никогда не выполняется, если первый выдает исключение.

PS Это должен быть комментарий. Но понятнее в богатом форматировании.

Решение, предложенное Mathias Schwarz

try { 
   findANDclick(new String[]{"id", "menuButton"});
   findANDclick(new String[]{"src", ".*homeicon_calendar.*"});    
   findANDclick(new String[]{"src", ".*cycle_templates.*"});   
} catch (Exception e) {
   // Workup exception somehow.
}

имеет преимущества, к которым вы стремитесь (с точки зрения разработчика Java):

  1. Это коротко;
  2. Это понятно для разработчика Java.

Недостаток также очевиден: безобразная конструкция обработки исключений.

Но в Java вы не можете избежать этого. Это языковые правила.

Этот код не симпатичен. Почему бы просто не поймать Exception? Вот как они предназначены для использования. Так что-то вроде:

try { 
   findANDclick(new String[]{"id", "menuButton"});
   findANDclick(new String[]{"src", ".*homeicon_calendar.*"});    
   findANDclick(new String[]{"src", ".*cycle_templates.*"});   
}
catch (Exception e) {
}

Если какой-либо из вызовов findANDclick завершится неудачно, последующие вызовы не будут выполнены...

Btw, continue является зарезервированным словом в Java, поэтому вы не можете использовать его в качестве имени переменной.

Нет, ты не можешь сделать это.

Однако, если метод выдает исключение, зачем вам все-таки проверять флаг продолжения? Это остановится в любом случае, если findANDclick выходит из строя.

Вы не можете использовать, если. Вы можете использовать цикл do / while, который более или менее обеспечивает синтаксис, который вы ищете.

do { findANDclick(new String[]{"id", "menuButton"}); } while (continue)
do { findANDclick(new String[]{"src", ".*homeicon_calendar.*"}); } while (continue)
do { findANDclick(new String[]{"src", ".*cycle_templates.*"}); } while (continue)

Кстати, как кто-то упоминал выше, продолжить это плохой выбор для имени переменной.

Я думаю, вы должны попробовать это:

    String[][] params = {
        {"id", "menuButton"},
        {"src", ".*homeicon_calendar.*"},
        {"src", ".*cycle_templates.*"}
    };

    for (String[] param : params) {
        if ( findANDclick(param) ) break;
    }
Другие вопросы по тегам