2013-05-15 48 views
0

我有一個應該加載文本文件並顯示/排序數據的程序,但是根本沒有顯示數據。任何想法,我做錯了什麼?我只能堅持使用1.4.2 Java。從加載的文本文件輸出數據時出錯

下面是代碼:

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

class NewClass { 
    private static int quantity; 
    private static String[] name; 

    public static void main(String args[]) throws Exception { 
     InputStreamReader kb = new InputStreamReader(System.in); 
     BufferedReader in; 
     in = new BufferedReader(kb); 
     String buffer; 
     char choice; 
     boolean fileread=false; 

     int[]number=new int[quantity]; 
     String[]name=new String[quantity]; 

     String sorttype=""; 
     do 
     { //Setup Menu 
      choice=menu(in); 
      if(choice=='E') 
      { 
       if(fileread) 
        System.out.println("Data already has been entered"); 
       else 
       { 
        fileread=true; 
        getdata(number,name); 
       } 
      } 
      else if(choice=='D') 
      { 
       if(fileread) 
        display(number,name,in); 
       else 
        System.out.println("Must enter data before it is displayed"); 
      } 
      else if(choice=='S') 
      { 
       if(fileread) 
        sorttype=sort(number,name,in); 
       else 
        System.out.println("Must enter data before it is sorted"); 
      } 
     } while(choice!='X'); 
    } 

    //Sort Data 
    public static void sortint(int[] number, String[] name) 
    { 
     int i,j; 
     for(i=0;i<quantity-1;i++) 
      for(j=i+1;j<quantity;j++) 
       if(number[i]>number[j]) 
       { 
        swap(number,i,j); 
        swap(name,i,j); 
       } 
    } 

    public static void sortstring(String[] name, int[] number) 
    { 
     int i,j; 
     for(i=0;i<quantity-1;i++) 
      for(j=i+1;j<quantity;j++) 
       if(name[i].compareToIgnoreCase(name[j])>0) 
       { 
        swap(number,i,j); 
        swap(name,i,j); 
       } 
    } 

    public static void swap(int[] a,int i,int j) 
    { 
     int t; 
     t=a[i]; 
     a[i]=a[j]; 
     a[j]=t; 
    } 

    public static void swap(String[] a,int i,int j) 
    { 
     String t; 
     t=a[i]; 
     a[i]=a[j]; 
     a[j]=t; 
    } 

    public static String sort(int[] number, String[] name, BufferedReader kb)throws Exception 
    { 
     String buffer; 
     do 
     { 
      //Allow user to sort the phone book 
      System.out.println("What do you want to sort by?"); 
      System.out.println("Number"); 
      System.out.println("Name"); 
      System.out.print("Enter>>"); 
      buffer=kb.readLine(); 

      if(buffer.equalsIgnoreCase("number")) 
      { 
       sortint(number,name); 
       print(name, number,kb); 
       return buffer; 
      } 
      else if(buffer.equalsIgnoreCase("name")) 
      { 
       sortstring(name,number); 
       print(name,number,kb); 
       return buffer; 
      } 
      System.out.println("Invalid entry"); 
     } while(true); 
    } 

    public static void print(String[] name, int[] number, BufferedReader kb)throws Exception 
    { 
     System.out.println("Sorted data"); 
     System.out.println("Number\tName"); 
     for(int i=0;i<quantity;i++) 
      System.out.println(number[i]+"\t"+name[i]); 
    } 

    public static void display(int[] number, String[] name, BufferedReader kb)throws Exception 
    { 

     System.out.println("Number Name"); 
     for(int i=0;i<quantity;i++) 
      System.out.println(number[i]+" "+name[i]); 
    } 

    public static void getdata(int number[],String name[])throws Exception 
    { 
     FileReader file = new FileReader("phoneData.txt"); 
     try (BufferedReader input = new BufferedReader(file)) { 
      int i; 
      String buffer; 
      for(i=0;i<quantity;i++) 
      { 
       buffer=input.readLine(); 
       StringTokenizer st = new StringTokenizer(buffer, ","); 
       name[i]=st.nextToken(); 
       number[i]=Integer.parseInt((st.nextToken()).trim()); 
      } 
     } 
    } 

    public static char menu(BufferedReader kb)throws Exception 
    { 
     String buffer; 
     char input; 
     do 
     { 
      System.out.println("\nWhat would you like to do?"); 
      System.out.println("E-Enter phone book data"); 
      System.out.println("D-Display phone book data"); 
      System.out.println("X-Exit program"); 
      System.out.println("S-Sort list"); 
      System.out.print("Enter E, D, X, S>>"); 
      buffer=kb.readLine(); 
      input=(buffer.toUpperCase()).charAt(0); 
      if(input=='E'||input=='D'||input=='X'||input=='S') 
       return input; 
      System.out.println("Invalid entry"); 
     } while(true); 
    } 
} 

而且這裏是它返回:

What would you like to do? 
E-Enter phone book data 
D-Display phone book data 
X-Exit program 
S-Sort list 
Enter E, D, X, S>>D 
Number Name 

What would you like to do? 
E-Enter phone book data 
D-Display phone book data 
X-Exit program 
S-Sort list 
Enter E, D, X, S>> 

任何幫助深表感謝。

+0

超載的方法呢? – Frisbee68

+0

@ user1965245'phoneData.txt'可能只是空的或不存在的(因爲swallow異常你不會知道它)...並且你沒有檢查input.readLine()的返回值,並且你從0讀取,到'quantitiy-1'。如果文件的數據量小於數量,那麼您將在'StringTokenizer'上得到一個NPE ...並且您似乎沒有任何用於輸入數據的菜單選項......並且您的'E'菜單選項具有誤導性,因爲它從文件中讀取數據... – A4L

+0

您想要做什麼? E-進入電話簿數據 d-顯示電話簿數據 X-退出程序 S-排序列表 輸入E,d,X,S >> d 編號名稱 數字數據應該是在數但它的空白和名稱相同 – Frisbee68

回答

0

您可能要初始化quantity

private static int quantity = 1; 

,而不是僅僅

private static int quantity; 

,以便循環

for(i=0;i<quantity;i++) 

內的代碼可以得到一個機會....

正如我的第一條評論所述,你應該添加一些異常處理和返回值檢查到你的代碼。

你也可能只是刪除這一行

private static String[] name; 

,因爲你已經在name聲明main本地。

編輯

public static void getdata(int number[],String name[])throws Exception 
{ 
    BufferedReader input = null; 
    try { 
     input = new BufferedReader(new FileReader("phoneData.txt")); 
     int i; 
     String buffer; 
     for(i=0;i<quantity;i++) 
     { 
      // readLinde returns null when EOF is reached 
      buffer=input.readLine(); 
      if(buffer != null) { 
       StringTokenizer st = new StringTokenizer(buffer, ","); 
       name[i]=st.nextToken(); 
       number[i]=Integer.parseInt((st.nextToken()).trim()); 
      } else { 
       break; // since nothing left to read 
       // remaining buckets in the arrays are left empty 
      } 
     } 
    } catch (Exception e) { 
     // catch exceptions to where know your program fails 
     System.out.println(e.toString()); 
    } finally { 
     if(input != null) { 
      // close the input stream when you are done 
      input.close(); 
     } 
    } 
} 

你也應該考慮使用的List代替arrays

public static void getdata(List number,List name) { 
    BufferedReader input = null; 
    try { 
     input = new BufferedReader(new FileReader("phoneData.txt")); 
     String buffer; 
     while(null != (buffer = input.readLine())) { 
      StringTokenizer st = new StringTokenizer(buffer, ","); 
      name.add(st.nextToken()); 
      number.add(Integer.valueOf(Integer.parseInt((st.nextToken()).trim()))); 

     } 
    } catch (Exception e) { 
     System.out.println(e.toString()); 
    } finally { 
     if(input != null) { 
      try { 
       input.close(); 
      } catch (IOException e) { 
       // ignore 
      } 
     } 
    } 
} 
+0

的數據,然後我得到 '您想要做什麼? E-進入電話簿數據 d-顯示電話簿數據 X-退出程序 S-排序列表 在線程輸入E,d,X,S >> E 異常 「主要」 java.util.NoSuchElementException 在java.lang.StringTokenizer.nextToken(StringTokenizer.java:349) at NewClass.getdata(NewClass.java:130) at NewClass.main(NewClass.java:27) ' – Frisbee68

+0

@ user1965245你讀過了嗎,我的第一個評論??我在其中提到了所有內容,請參閱[StringTokenizer]的javadoc(http://docs.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html#StringTokenizer(java.lang.String, %20java.lang.String))說,當傳遞的字符串爲空時,它會拋出一個'N'ull'P'Ointer'E' xception,並且當[readLine](http://docs.oracle.com)返回null /javase/6/docs/api/java/io/BufferedReader.html#readLine())已到達流的末尾...請參閱我的編輯以瞭解如何使代碼更健壯。 – A4L

+0

我不太瞭解tokenizer,我在線閱讀了如何在我的代碼中使用它。所以我不確定任何錯誤。這只是我的第一年編碼 – Frisbee68