【问题标题】:Declaring a duplicate variable within a loop in Java在 Java 中的循环中声明重复变量
【发布时间】:2013-12-06 15:56:43
【问题描述】:

我希望能够在依赖于用户选择的循环中声明一个 selenium 驱动程序。我希望驱动程序被称为驱动程序,无论它是哪种类型,这样我就可以将它用于所有事情,而不是为 IE 和 Firefox 使用一组单独的代码。我希望这是有道理的,我对 Java 很陌生。

 switch (browserId){
    case 1: 
            FirefoxDriver driver = new FirefoxDriver();

    case 2:

        InternetExplorerDriver driver = new InternetExplorerDriver();

    default: 
            System.out.println("An error has occurred, the program will now close.");
        System.exit(0);
    }

这会产生一个编译错误,因为我有两个名为驱动程序的变量,但是我不应该让它们同时存在。有没有办法解决这个问题?

【问题讨论】:

  • switch 声明了范围,而不是 case.. 你的变量此时不是很有用。
  • 需要休息;每种情况下的声明。默认情况下不需要中断;
  • 您可以为每个案例添加一个范围case 1: { /* code */ break; },但这可能不是您想要的,因为driver 会超出范围。最后一种情况不需要中断 - 这不需要是默认情况。

标签: java eclipse variables selenium


【解决方案1】:

我希望驱动程序被称为驱动程序,无论它是哪种类型, 这样我就可以将它用于所有事情而不是拥有一个 IE 和 Firefox 的单独代码集。

如果这两个类都实现了Driver 接口(或者是WebDriver?),那么你可以简单地做

Driver driver = null;
switch (browserId){
case 1: 
    driver = new FirefoxDriver();
    break;
case 2:
    driver = new InternetExplorerDriver();
    break;
default: 
    System.out.println("An error has occurred, the program will now close.");
    System.exit(0);
}

现在您可以使用driver,但请检查null

您不能这样做的原因是 switch 块开始了一个范围。如果您声明一个名称为driver 的变量,则不能在同一范围内重新声明另一个具有相同名称的变量。

【讨论】:

  • 太快了。你打败了我。
【解决方案2】:

你可以这样做:

WebDriver driver;                     // <-- move outside the switch
switch (browserId){
    case 1:
        driver = new FirefoxDriver();
        break;                        // <-- add breaks
    case 2:
        driver = new InternetExplorerDriver();
        break;
    default:
        // exceptions are more welcome than System.exit();
        throw new IllegalArgumentException("wrong browserId: " + browserId);
}

【讨论】:

    【解决方案3】:

    如果它们都派生自一个通用类型,则在开关之外声明变量。

    Driver d = null;
    
    switch(browserId){
         case 1: 
             d = new FireFoxDriver();
             break; // don't forget!!
         case 2: 
             d = new InternetExplorerDriver();
             break;
         ... // omitting other cases and default
    
    }
    

    如果不是,那么您需要在每个 case 语句中使用不同的名称。

    【讨论】:

      猜你喜欢
      • 2015-08-31
      • 2021-08-29
      • 2011-05-28
      • 2015-04-12
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      相关资源
      最近更新 更多