0

Client クラスからファイルを読み取り、それを Service コンストラクターに渡します。StringTockenizer を使用して、渡された 1 行の文字列を解析しています。有効な行には、正確に 5 つの項目が含まれている必要があります。行に含まれる項目が 5 つより多いか少ない場合は、無効と見なして無視する必要があります。

コンストラクターが例外をスローした場合は、後で Client クラスで処理する必要があります。私が抱えている問題は、ファイルを正しく読み取る方法がわからず、無効な行を無視して、ファイルの最後まで読み続けることです。誰かが私を正しい方向に向けることができますか?

 import java.util.StringTokenizer;   //allows use of StringTockenizer
 import java.util.ArrayList;   //allows use of ArrayList
 import java.io.Serializable;   //allows use of Serializable

 public class MailingLabel implements Serializable
 {   //start class
   public String name, address, city, state, zipCode;

  public MailingLabel(String input) throws IllegalMailingLabelException  
      //accepts String parameter from Client
  {   //start constructor
  int count = 0;
  String extra;   //used to hold extra tokens from invalid lines
  StringTokenizer token = new StringTokenizer(info, ",");

  name = token.nextToken();   //1st token in string
  count++;
  address = token.nextToken();   //2nd token in string
  count++;
  city = token.nextToken();   //3rd token in string
  count++;
  state = token.nextToken();   //4th token in string
  count++;
  zipCode = token.nextToken();   //5th token in string
  count++;   //count should equal 5
   extra = token.nextToken();   //holds extra tokens
   count++;

  if (count > 5)
     throw new IllegalMailingLabelException("Exactly 5 fields are required");

データの行に 6 つのトークンが含まれている場合、エラーは正常にスローされますが、有効な行に対してエラーがスローされます (行に 6 番目のトークンが含まれていないため)。そのための別の例外を書きたくありません。} //コンストラクタ終了

以下は私の構築された例外です

  public class IllegalMailingLabelException extends NoSuchFieldException 
 {   //start class
 public IllegalMailingLabelException(String message)
 {   //start constructor
  super( message );
  }   //end constructor
  }   //end class

//以下はクライアント

 import java.io.*;   //allows use of BufferedReader & ObjectOutputStream
 import java.util.*;   //allows use of ArrayList

 public class Client1
 {   //start class

public static void main(String[] args) throws IOException
{   //start main  
  String input;   //holds each line read from file

  try    
  {   //start try, opens and reads the file       
     BufferedReader bufIn = new BufferedReader(new FileReader(new File("testData.txt")));

testData.txt のデータ例: 1,2,3,4,5,6 //これは無効なデータである必要があります 1,2,3,4 //これも無効なデータである必要があります 1,2,3,4, 5 //これは有効なデータです

     System.out.println("Beginning to read file");

     while ( (info = bufIn.readLine()) != null)
     {   //start while
        try
        {   //start try to create new MailingLabel Object
           MailingLabel label = new MailingLabel(input);                  
        }  //end try
        catch(IllegalMailingLabelException e)
       {   //start catch, if object not created 
                    //(handles the exception thrown by service)
           System.out.println(e.getMessage());  
                        //prints error message from service constructor
        }   //end catch

     }   //end while
     System.out.println("Finshed reading file");
     bufIn.close();   //closes the file
  }   //end try

  catch (FileNotFoundException e)   //if file isn't found
  {   //start catch
     System.out.println("File not found");
  }   //end catch
 }   //end main
 }   //end class

どんな助けでも大歓迎です。

4

1 に答える 1

2

パーサー メソッドはtoken.hasMoreTokens()、次のトークンが存在するかどうかを実際に確認するために呼び出しません。5 番目のフィールドを読み取った後に実行することをお勧めします。

または、フィールドを配列として呼び出しinput.split(",")て取得するだけで、フィールドの数を検証するのは簡単です。

于 2013-11-02T13:17:50.937 に答える