2014-04-28 146 views
0

我有三個小的java類,我試圖從文件中讀取一些數據並將其打印出來。這是我的代碼,它們很短。爲什麼我的學生字符串不打印出來?

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 

我期待看到這樣的: NAME0 22 1.2 名稱1 22 2.71 名2 19 3.51

而是我得到任何輸出。我不確定發生了什麼事。該文件沒有找到?我來自python,看起來像try: ... except: pass事情正在與throws IOException東西進行。

我使用Eclipse,我有Students.txt src文件夾,bin文件夾,並在工作區的頂部,因爲我不知道它在哪裏需要去。

編輯:

後改變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 

將始終評估爲falsex如何同時有IntDouble?考慮輸入文件的格式。也許你可以讓它製表符分隔(或任何其他分隔符),假設一行 - 一個學生?在這種情況下,它更容易使用的條件只有一個,以實現閱讀方法內if x.hasNextLine

+0

啊,您的速度更快... –

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

想想這個條件......

hasNextInt()hasNextDouble()是互斥的,所以它總是返回false。

概念,明白x.hasNexInt()並不意味着「x有另一個詮釋的地方」,這意味着在x下一個元素是一個int。

而且,不相關的,但是:一般情況下,當你發現自己有這樣的條件句(用一個以上的&&,作爲一個經驗法則),你應該問自己,如果你真的可以把它分成簡化條件多個報表。

編輯:(響應您的更新)嘗試沒有if("".equals(name))子句運行它。我不明白爲什麼它在預期之前被觸發,但是你的輸出表明它是這樣的,並且在任何情況下這個條款看起來都是多餘的:你的hasNextLine()條件在頂部已經提供了一個機制來退出循環數據集。有些情況下需要這樣的輔助檢查,但問問自己是否在一個。

+0

nextInt和nextFloat不消耗尾隨的換行符。在nextFloat之後調用nextLine給出空字符串。 – Broseph

相關問題