2013-05-15 94 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