【问题标题】:is that possible in java? (code to execute) if (condition)这在java中可能吗? (要执行的代码) if (条件)
【发布时间】:2011-09-26 13:06:13
【问题描述】:

请注意,我不是 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 via

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)

【问题讨论】:

    标签: java if-statement rft


    【解决方案1】:

    我认为你应该试试这个:

        String[][] params = {
            {"id", "menuButton"},
            {"src", ".*homeicon_calendar.*"},
            {"src", ".*cycle_templates.*"}
        };
    
        for (String[] param : params) {
            if ( findANDclick(param) ) break;
        }
    

    【讨论】:

      【解决方案2】:

      拉德克!尝试执行以下示例,只是为了阐明 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()!
      

      这表明如果第一个方法抛出异常,则永远不会执行第二个方法

      附:这应该是一个评论。但在丰富的格式中更清晰。

      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 中你无法避免它。这是语言规则。

      【讨论】:

      • 但我从try construction调用findANDclick
      • 我有 `catch (Exception ex) { logStoreException(ex);`
      • @Radek 为了让我们的帮助更有成效,请将SSCCE 代码添加到您的问题中。
      • @etienne 对!谢谢。我会解决的。
      • 你的空 catch 块不是一个好主意。至少,抛出并捕获一个特定的 Exception 子类,这样就不会意外捕获 NullPointerException 之类的编程错误。
      【解决方案3】:

      你不能使用如果。您可以使用 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 是变量名的错误选择。

      【讨论】:

      • 这行不通。我需要在代码之前执行条件。在您的代码中,所有 findANDclik 都将被执行。
      • 更糟糕的是,只要continuetrue,它就会继续执行相同的findANDclick
      • 哎呀。发帖前应该多考虑一下。
      • 我也在考虑这个问题。我可以在findANDclick 中更新continue,这样就可以了,不要再找了。
      【解决方案4】:

      那个代码不漂亮。为什么不简单地抓住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 中的保留字,所以不能用作变量名。

      【讨论】:

      • 我更新了我的问题,以更清楚地说明异常是在 findANDclick 中处理和抛出的。所以它永远不会以错误结束。
      • @Radek 在 Java 中,当方法 throws 出现异常时,下一个方法无法执行。因此,Mathias 的回答值得您关注,尽管它看起来不像您预期​​的那样。
      • @MockerTim:也许我描述的剧本不够好。 findANDclick 在try 内引发异常。然后它完成并执行下一个 findANDclick。我的问题是如何以nicely readable 的方式确保调用 findANDclick 的“父”脚本完成
      • 空捕获块??您真的是要忽略 NullPointerException、IllegalArgumentException 等,而不向开发人员提供任何反馈?
      • 代码完全符合发帖人的要求。他要求一种特定的方式来重写他已经(几乎)拥有的代码控制流,就是这样。
      【解决方案5】:

      不,你不能这样做。

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

      【讨论】:

      • 不,它不会停止。 throw Exception 向日志发送错误消息。 findANDclick 的实例完成,但我希望调用 findANDclick 的“父级”也完成。是不是更清楚了?
      • 那么异常已经在findANDclick 方法内部处理了吗?
      • @wjans 不! findANDclick() throws Exception。它不能在里面处理它。
      • @MockerTim 据我从问题和 cmets 中了解到,在他的场景中没有抛出异常,但是在 findANDclick? 的某处处理了异常?
      • 将其添加到您的方法声明中,如下所示:private void findANDclick(String [] args) throws Exception {
      猜你喜欢
      • 2021-05-16
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      相关资源
      最近更新 更多