2017-10-07 4 views
0

안녕하세요 스캐너 방법 hasNextDouble()에 문제가 있습니다. 내 코드가 파일에서 읽고 배열에 추가 할 Vehicle 개체를 만듭니다. 차량 클래스에는 OversizedVehicle이라는 하위 클래스가 있으며 그 높이를 나타내는 double 필드가 추가로 있습니다. 그래서 if (hasNextDouble())을 사용하고 있는데 스캐너가 double을 읽으면 Vehicle 대신 OversizedVehicle 개체가 생성됩니다. 여기에 내 코드입니다 :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++; 
    } 

것은 내가 이클립스 IDE를 사용하고 내가 디버그 모드에서이 작업을 실행할 때 if 문은 항상 잘못 height 변수로 입력의 다음 regNo을 가하고, true로 평가합니다. 입력에서이 값은 double이 아니지만 int입니다. 나는 무엇이 잘못되었는지 잘 모릅니다. 그것은 당신의 입력 매개 변수들의 수는 다른 차량대형 차량의 매개 변수가 들어 날 것으로 보인다

+2

입력 파일은 어떻게 생겼습니까? – unjankify

+1

대문자와 문장 부호를 붙이고,이 이해할 수없는 혼란을 단락 짓고, 다음의 double을 읽지 않는 'hasNextDouble()'을 정의하십시오. ' 대신 무엇이 발생합니까? – EJP

답변

0

:

1 Toyota 2015 sedan 2 Toyota 2016 truck 2.1 3 Toyota 2015 mini ... 
: 차량이 4 개 매개 변수가을, 대형 차량은 5 이런 일이

등등. 나는 당신이 s1.hasNextDouble()이 항상 참이라고 말하는 것 같아서 이고, 은 "변수 regNo가 이중으로 초기화됩니다"라고 말하기 때문에 이것을 추측합니다.. 스캐너가 위의 예에서 "세단"을 읽을 때이 예를 들어 일어날 수 는 다음 토큰은 "2"이며 "2"이후 유효한 double, s1.hasNextDouble() true를 반환 할 수 있습니다. 즉, s1.hasNextDouble()은 다음 토큰이 double 또는 정수일 때 true가됩니다. 그는 int에 대한 doubletrue에 대한 false를 반환하기 때문에

당신은 s1.hasNextInt(), 를 확인하여 이러한 경우를 구별 할 수있다.

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

관련 문제