2

请注意,我不是 Java 大师。我可能没有使用正确的术语,我在 RFT 中即时学习 java。下面描述的内容与所述完全一样。


在 ruby​​ 中,我们可以像这样编写代码

(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 的实例只会抛出一个错误,所以下一个 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)
4

5 回答 5

5

那个代码不漂亮。为什么不简单地抓住Exception? 这就是它们的用途。所以像:

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

如果任何 findANDclick 调用失败,则不会执行后续调用...

顺便说一句,continue是 Java 中的保留字,因此您不能将其用作变量名。

于 2011-07-01T07:09:37.653 回答
2

不,你不能这样做。

但是,如果方法抛出异常,那为什么还需要检查 continue 标志呢?findANDclick如果失败,它将停止。

于 2011-07-01T07:09:20.343 回答
1

拉德克!尝试执行以下示例,只是为了阐明 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中你无法避免它。是语言规则。

于 2011-07-01T07:34:42.093 回答
0

你不能使用if。您可以使用或多或少提供您正在寻找的语法的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)

顺便说一句,就像上面提到的人一样, continue 对于变量名来说是一个糟糕的选择。

于 2011-07-01T07:22:55.913 回答
0

我认为你应该试试这个:

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

    for (String[] param : params) {
        if ( findANDclick(param) ) break;
    }
于 2011-07-01T12:33:58.627 回答