2017-10-07 25 views
0

嗨我遇到了扫描仪方法hasNextDouble()的问题。 我的代码从文件中读取并创建一个要添加到数组中的对象Vehicle。车辆类别具有名为OversizedVehicle的子类别,并具有附加的double字段以指示其高度。这就是为什么我使用if (hasNextDouble()),所以如果扫描器读取double它将创建OversizedVehicle对象而不是Vehicle。这里是我的代码:hasnextdouble不读我的下一个双文件

while(s1.hasNext()) 
    { 
      regNo = s1.next(); 
      make = s1.next(); 
      year = Integer.parseInt(s1.next()); 
      description = s1.next(); 
      if(s1.hasNextDouble() == true) { 
      height = s1.nextDouble(); 
      vehicle = new OversizedVehicle(regNo,make,year,description,height); 
      } 
      else { 
      vehicle = new Vehicle(regNo, make, year, description); 
      } 
      System.out.println("New vehicles from file added to array in position " + count); 
      vehicles[count] = vehicle; 
      count++; 
    } 

我使用的Eclipse IDE中,当我在调试模式下运行这个if语句总是评估为true,错误地把下一个regNo输入到height变量。即使在输入中,该值不是double,而是int。我不确定发生了什么问题。

+2

你的输入文件是什么样的? – unjankify

+1

请大写并加上段落这个无法理解的混乱,并定义'hasNextDouble()'不读取我的下一个double。'会发生什么呢? – EJP

回答

0

在我看来,你的输入包含车辆超限车辆,他们的参数的数量是不同的参数:车辆有4个参数,超限车辆有5个,这样的事情:

1 Toyota 2015 sedan 2 Toyota 2016 truck 2.1 3 Toyota 2015 mini ... 

依此类推。我猜这是因为你似乎认为s1.hasNextDouble()总是为真, 并且它导致“变量regNo被初始化为双”。 当扫描仪在上面的例子中已经改为“轿车”这可能发生在例如, 的下一个标记是“2”, ,自“2”可以是一个有效的doubles1.hasNextDouble()返回true。 换句话说,当下一个标记是双精度或整数时,s1.hasNextDouble()将为真。

你可以通过检查s1.hasNextInt(), 区别这些情况,因为这将返回falsedoubletrueint

while (scanner.hasNext()) { 
    String regNo = scanner.next(); 
    String make = scanner.next(); 
    int year = scanner.nextInt(); 
    String description = scanner.next(); 

    if (scanner.hasNext() && !scanner.hasNextInt()) { 
    double height = scanner.nextDouble(); 
    vehicle = new OversizedVehicle(regNo, make, year, description, height); 
    } else { 
    vehicle = new Vehicle(regNo, make, year, description); 
    } 

    // ... 
} 

这应该适用于上述示例。 但是,如果你的数据是逐行的,那么我建议依靠行分隔符来区分记录,这将使实现更简单和更清晰。

while (scanner.hasNext()) { 
    String line = scanner.nextLine(); 
    String[] parts = line.split(" "); 
    String regNo = parts[0]; 
    String make = parts[1]; 
    int year = Integer.parseInt(parts[2]); 
    String description = parts[3]; 

    if (parts.length == 5) { 
    double height = scanner.nextDouble(); 
    vehicle = new OversizedVehicle(regNo, make, year, description, height); 
    } else { 
    vehicle = new Vehicle(regNo, make, year, description); 
    } 

    // ... 
} 
+0

非常感谢!没有想到这一点。 :) :) – alexW