0

ホテル予約プログラムをコーディングし、GUI を使用してゲスト情報を TextFields に入力しています。これらの入力値が直接送られる配列があります(おそらくそれが私の問題ですが、修正方法はありません)。この後、作成したテキスト ファイルに配列の値を出力します。私のコードは次のとおりです。

Guests[] GArr = new Guests[1000];
   public static DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm");
   public int cnt = 1;
   int count = 0;
   String Firstname ;
   String Lastname;
   String Country ;
   String IDtype;
   String PassportNo ;
   String IDNo ;
   String Addr1;
   String Addr2 ;
   int AreaCode ;
   String TelNo ;
   String CellNo ;
   String Email ;

最初に、これらの変数をグローバルとして宣言しました (これらの変数は既にオブジェクト クラスにありますGuests) Home。その後、これらの変数に、TextFieldsテキスト入力が含まれる の値を取るようにしました。これは、フィールドが空白かどうかを確認するメソッド内にあります。

public Collection<String> getNonBlankFields()  {
    this.Firstname = NameF.getText();
    this.Lastname = NameL.getText();
    this.Country = Countr.getText();
   this.IDtype = IDTy.getText();
    this.PassportNo = PassNo.getText();
    this.IDNo = IDNumber.getText();
    this.Addr1 = Add1.getText();
    this.Addr2 = Add2.getText();
    int AreaCode = Integer.parseInt(Area.getText());
    this.TelNo = Tel.getText();
    this.CellNo = Cell.getText();
    this.Email = Em.getText();

    this.nonBlankFields = new ArrayList<String>();
    this.nonBlankFields.add(this.Firstname);
    this.nonBlankFields.add(this.Lastname);
    this.nonBlankFields.add(this.Country);
    this.nonBlankFields.add(this.IDtype);
    this.nonBlankFields.add(this.PassportNo);
    this.nonBlankFields.add(this.IDNo);
    this.nonBlankFields.add(this.Addr1);
    this.nonBlankFields.add(this.Addr2);
    this.nonBlankFields.add(this.TelNo);
    this.nonBlankFields.add(this.CellNo);
    this.nonBlankFields.add(this.Email);
    System.out.println(this.nonBlankFields);
    return this.nonBlankFields;
}

最後に、ファイルへの出力です (これが私の主な問題です) これを修正するために非常に多くのことを試みましたが、このコードを上回り、キャッチに直行します:

     File GFile = new File("C:\\Users\\Gordy\\Dropbox\\IT\\Hotel Reservation\\Hotel\\src\\Reservation\\Guests.txt");
try {
            if (!GFile.exists()) {
                GFile.createNewFile();
            } 
                String delim = "#";
               String Firstname = NameF.getText();
                    StringTokenizer stk = new StringTokenizer(delim);
                    Firstname += stk.nextToken();
                    System.out.print("FName = " + Firstname);
                    Lastname += stk.nextToken();
                    System.out.print("LastName= " + Lastname);
                    Country += stk.nextToken();
                    System.out.print("Country= " + Country);
                    IDtype += stk.nextToken();
                    IDNo += stk.nextToken();
                    Addr1 += stk.nextToken();
                    Addr2 += stk.nextToken();
                    AreaCode += Integer.parseInt(stk.nextToken());
                    TelNo += stk.nextToken();
                    CellNo += stk.nextToken();
                    Email += stk.nextToken();
                    GArr[count] = new Guests(Firstname, Lastname, Country, IDtype,  IDNo,Addr1,Addr2, AreaCode, TelNo, CellNo, Email);
                    PrintWriter pw=new PrintWriter(new FileWriter (GFile,true));
                    pw.println(GArr[count]);
                    count++;
                    pw.close();
                    CheckIn.hide();
                    Home.this.setVisible(true);
            }
         catch (Exception e) {
            System.out.print("This did not work heres the error: " + e);
        }

また、1行のデータの間 StringTokenizerに印刷する以外は何でも使用したいと思います。#

これはエラー全体です:

    java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(StringTokenizer.java:332)
at Reservation.Home.jButton8ActionPerformed(Home.java:1657)
at Reservation.Home.access$100(Home.java:29)
at Reservation.Home$2.actionPerformed(Home.java:269)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
4

3 に答える 3

0
// instantiate array after all vars in it have been instantiated
String[] guests = {Firstname, Lastname, Country, IDtype,  IDNo,Addr1,Addr2, AreaCode, TelNo, CellNo, Email};

int ct=0;
for(StringTokenizer stk; stk.hasMoreElements() ;){
guests[ct]+=stk.nextToken();
ct+=1;
}

Stringtokenizer は「列挙」オブジェクトであり、反復する必要があるため、「ブール値テスト」「hasMoreElements()」が必要です。

于 2013-07-23T19:31:57.637 に答える
0

StringTokenizer を間違った方法で使用しています。使用可能なトークンがなくなるため、おそらく例外がスローされます。

大きな配列の代わりにリストを使用できます。

Firstname#Lastname#Country#IDtype#IDNo#Addr1#Addr2#AreaCode#TelNo#CellNo#Email としてファイルに出力するリファクタリングされたコードの一部を次に示します。

コードの最初の部分:Guests[] GArr = new Guests[1000];

私は次のように変更しました: List<Guests> guestList = new ArrayList<>();

コードの 3 番目の部分:

File GFile = new File("C:\\Users\\Gordy\\Dropbox\\IT\\HotelReservation\\Hotel\\src\\Reservation\\Guests.txt");
try {
    if (!GFile.exists()) {
        GFile.createNewFile();
    } 
    StringBuilder sb = new StringBuilder;
    appendData(sb,Firstname);
    appendData(sb,Lastname); 
    appendData(sb,Country); 
    appendData(sb,IDtype); 
    appendData(sb,PassportNo); 
    appendData(sb,IDNo); 
    appendData(sb,Addr1); 
    appendData(sb,Addr2); 
    appendData(sb,AreaCode); 
    appendData(sb,TelNo); 
    appendData(sb,Email,false); 

    guestList.add(new Guests(Firstname, Lastname, Country, IDtype,  IDNo,Addr1,Addr2, AreaCode, TelNo, CellNo, Email));

    PrintWriter pw=new PrintWriter(new FileWriter (GFile,true));
    pw.println(sb.toString());

    pw.close();
    CheckIn.hide();
    Home.this.setVisible(true);
}catch (Exception e) {
    System.out.print("This did not work heres the error: " + e);
}

ここでappendData部分

private void appendData(StringBuilder sb,String data){
    appendData(sb,data,true);
 }

 private void appendData(StringBuilder sb,String data,boolean delim){
    sb.append(data);
    if(delim){
        sb.append(delim);
    }
 }
 private void appendDelim(StringBuilder sb){
    sb.append("#");
 }

テキストファイルに出力するだけで、ゲストのデータ構造を保持する理由がわかりません。

于 2013-07-23T19:46:35.630 に答える
0

複数回呼び出しstk.nextToken()ていますが、そのオブジェクトは単一の「#」しか保持していません。これは、一度しか呼び出すことができないことを意味しますnextToken()。またInteger.parseInt("#")、おそらく例外をスローします。私はこのようなことをすることをお勧めします:

「#」を何にも追加しないでください。代わりに、toString()メソッドの次のGuestsようにします

public String toString() {
    return Firstname + "#" + Lastname + "#" + ... + "#" + Email;
}
于 2013-07-23T19:28:14.467 に答える