2014-04-28 9 views
0

세 개의 작은 자바 클래스가 있는데 파일에서 일부 데이터를 읽고 인쇄하려고합니다. 여기에 제 코드가 있으며 꽤 짧습니다.왜 내 학생 문자열이 인쇄되지 않습니까?

Student.java

package students; 

import java.text.*; 

public class Student{ 
    private String name; 
    private int age; 
    private double gpa; 

    public Student(String name, int age, double gpa){ 
     this.name = name; 
     this.age = age; 
     this.gpa = gpa; 
    } 

    public String toString(){ 
     String gpa_string = new DecimalFormat("#.##").format(gpa); 
     return name + " " + Integer.toString(age) + " " + gpa_string + "\n"; 
    } 
} 

Students.java

package students; 

import java.util.*; 
import java.io.*; 

public class Students { 
    public static final int MAX = 100; 
    private Student students[]; 
    private int count; 

    public void readFile(String path) throws IOException{ 
     students = new Student[MAX]; 
     Scanner x = new Scanner(new File(path)); 
     count = 0; 
     while (x.hasNextLine() && count < MAX){ 
      String name = x.nextLine(); 
      if("".equals(name)){ 
       System.out.println("Breaking out of loop"); 
       break; 
      } 
      System.out.println(name); 
      int age = x.nextInt(); 
      System.out.println(age); 
      double gpa = x.nextDouble(); 
      System.out.println(gpa); 
      students[count] = new Student(name, age, gpa); 
      count += 1; 
      System.out.println(count) 
     } 
     x.close(); 
    } 

    public String toString(){ 
     String result = ""; 
     for(int i = 0; i < count; ++i) 
      result += students[i].toString(); 
     return result; 
    } 

Driver.java

package students; 

import java.io.*; 

public class Driver { 
    public static void main(String[] args) throws IOException{ 
     Students students = new Students(); 
     students.readFile("Students.txt"); 
     System.out.print(students.toString()); 
    } 
} 

이것은 Students.txt의 모습입니다 :

Name0 
22 
1.2 
Name1 
22 
2.71 
Name2 
19 
3.51 
,363,210

나는이보고 기대 해요 : NAME0 22 1.2 이름 1 22 2.71 NAME2 19 3.51

을하지만 그 대신 나는 전혀 출력을 얻을 수 없습니다. 무슨 일이 일어나고 있는지 잘 모르겠습니다. 파일을 찾을 수 없습니까? 나는 파이썬에서 왔고, throws IOException 물건으로 try: ... except: pass 일종의 거래가 진행되고있는 것처럼 보입니다.

Eclipse를 사용하고 있으며 src 폴더, bin 폴더 및 작업 영역 상단에 Students.txt가 있어야합니다. 왜냐하면 어디로 갈 필요가 있는지 알 수 없기 때문입니다.

편집 :

while 루프의 조건을 변경하고 인쇄 문의 무리를 추가, 나는 단일 학생을 읽어 출력 지금 그것을 얻었다 후 :. NAME0 1.2 루프가 끊어졌습니다. Name0 22 1.20

왜 1 루프 이후에 멈추는 지 이해할 수 없습니다.

+2

코드를 디버깅 했습니까? 내 말은, 파일을 읽는 것에 관한 데이터를 출력하려고 했니? 모든 루프처럼 '루프'메시지 나 다른 것을 인쇄하십시오. –

+0

@newboyhun 좋은 아이디어! : 3 내 질문을 업데이트 할 것입니다 – Broseph

+0

@Broseph : 업데이트, 내 업데이트 된 답변보기 – drewmoore

답변

4

다음 조건 :

x.hasNextLine() &&x.hasNextInt() && x.hasNextDouble() && count < MAX 

항상 false로 평가됩니다. x은 어떻게 IntDouble을 동시에 가질 수 있습니까? 입력 파일의 형식에 대해 생각해보십시오. 어쩌면 당신은 그것을 탭 구분 (또는 다른 구분 기호), 가정 한 줄로 만들 수 있습니다 - 하나의 학생? 이러한 경우는

hasNextInt()hasNextDouble()는 상호 배타적입니다 ...이 조건에 대해 생각 if x.hasNextLine

+0

Ahh, 당신은 빠르다 ... –

2
while (x.hasNextLine() &&x.hasNextInt() && x.hasNextDouble() && count < MAX) 

내에서 하나의 조건으로 읽는 방법을 구현하기 위해 훨씬 쉽게, 그래서 항상 false를 반환합니다.

개념적으로 x.hasNexInt()는 "x 다른 어딘가에 int 형이"의미하지 않는다는 것을 이해하고, 그것을 x에서 다음 요소가 INT 것을 의미한다.또한

, 무관하지만 : 일반적으로, 당신은 (엄지 손가락의 규칙으로 하나 이상의 &&와)과 같은 조건문 당신이 정말로으로 그것을 파괴함으로써 그 조건을 단순화 할 수 있다면, 당신은 스스로에게 물어해야 자신을 발견 할 때 여러 문장.

편집 : (당신의 갱신에 응답)에 if("".equals(name)) 절없이 그것을 실행 해보십시오. 그것은 그것이 예상되기 전에 트리거되는 이유를 즉시 알 수는 없지만 출력 결과는 그 것이고 어떤 경우에는이 절이 중복되는 것처럼 보입니다. 상단의 조건부는 이미 루프가 끝날 때 루프를 종료하는 메커니즘을 제공합니다. 데이터 세트. 이와 같은 2 차 수표가 필요한 상황이 있지만 자신이 있는지 확인하십시오.

+0

nextInt와 nextFloat는 후행 개행 문자를 사용하지 않습니다. nextFloat가 빈 문자열을 준 후 nextLine을 호출합니다. – Broseph

관련 문제