2017-10-07 24 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