3

readLine()クラスのメソッドを使用してテキスト ファイルから long 型を読み込もうとしています。BufferedReader次に、最初のトークン (long 型番号) を使用して解析しますが、次StringTokenizerの例外エラーに直面しています。java.lang.NumberFormatException

これは私のテキスト ファイルの例です。

2764841629  Quaroten Ilen
1398844030  Orden Nenama
1185252727  Inja Nenaptin
2370429126  Quaren Inaja
1502141743  Otin Una
1993687334  Quarwennaja Nenoten
1015934104  Polen Meritna
2363674760  Otja Ie
1904629749  Neninin Ordja
3047965620  Algnaja Nenja

これは、テキストファイルから読み取り、長い値を長い変数に代入するコードです

private void registerData() throws FileNotFoundException{
    try {

        String regPatName;
        String regPatSurname;
        long regPatID;


        FileInputStream fis = new FileInputStream("src\\assignment_3\\injuredPersonList.txt");
        BufferedReader reader = new BufferedReader(new InputStreamReader(fis));

        String line;

        while( ( line = reader.readLine() ) != null) {

            StringTokenizer st = new StringTokenizer(line, " ");

            while(st.hasMoreTokens()){

                regPatID = Long.parseLong(st.nextToken());
                regPatName = st.nextToken();
                regPatSurname = st.nextToken();

                Patient regPatient = new Patient(regPatName, regPatSurname, regPatID);
                hashMethod(regPatient);
            }

        }
    } catch (IOException ex) {
        Logger.getLogger(personTest.class.getName()).log(Level.SEVERE, null, ex);
    }


}

private void hashMethod(Patient regPatient){

    Long idPat = new Long(regPatient.getPatientID());
    int keyID;

    keyID = (int) Math.sqrt(Integer.parseInt(idPat.toString().substring(0, 5) + idPat.toString().substring(5, 10))) % (50000);

    System.out.println(keyID);

}

最後に、これは私が直面しているエラーです。

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "2481765933   Otna"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    at java.lang.Long.parseLong(Long.java:419)
    at java.lang.Long.parseLong(Long.java:468)
    at assignment_3.personTest.registerData(personTest.java:58)
    at assignment_3.personTest.<init>(personTest.java:33)
    at assignment_3.personTest$1.run(personTest.java:161)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
    at java.awt.EventQueue.access$000(EventQueue.java:84)
    at java.awt.EventQueue$1.run(EventQueue.java:602)
    at java.awt.EventQueue$1.run(EventQueue.java:600)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
    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

4

明らかに、数値以外の文字列を解析しようとしています。スタック トレースはそれを示しています: 2481765933 Otna. 次のように、入力を分割して数値部分を解析する必要があります。

String[] data = line.split("\\s+");
regPatID = Long.parseLong(data[0]);
regPatName = data[1];
regPatSurname = data.length == 3 ? data[2] : "";

上記は、 を使用するよりもはるかに簡単ですStringTokenizer。実際、 の使用StringTokenizer推奨されておらず、実質的に推奨されていません。現在、文字列を解析するための推奨されるsplit()方法は、単純なケースのメソッドまたはScanner複雑なケースのクラスのいずれかを使用することです。

于 2012-03-10T16:04:58.573 に答える
4

フィールドを区切るために、スペースの代わりにタブ文字を使用している可能性があります。区切り文字のセットにタブを追加します ( " \t")。

また、ストリームとリーダーは必ず finally ブロックで閉じてください (最も外側のものだけを閉じる必要があります。BufferedReader を閉じると、InputStreamReader が閉じられ、FileInputStream が閉じられます)。

于 2012-03-10T16:05:39.430 に答える
3

" "テキスト ファイルのトークン間に複数のスペース文字が含まれている可能性があるため、間違った区切り文字 ( ) を使用しています。StringTokenizerはレガシー クラスです。正当な理由がない限り使用しないでください。String.split()で十分です。

String[] result = line.split("\\s+");
regPatID = Long.parseLong(result[0]);
regPatName = result[1];
regPatSurname = result[2];

しかし、私はScannerがあなたの問題に最適だと思います:

// Java 7 try-with-resources synthax.
// If you are using Java <=6, declare a finally block after the catch 
// to close resources.
try (InputStream myFile = ClassLoader.getSystemResourceAsStream("MyTextFile.txt");
        Scanner sc = new Scanner(myFile)) {

    while (sc.hasNext()) {
        regPatID = sc.nextLong();
        regPatName = sc.next();
        regPatSurname = sc.next();

        System.out.printf("%d - %s %s\n", regPatID, regPatName, regPatSurname);
    }

} catch (Exception e) {
    // Do something about exceptions
}

どちらのバージョンも、入力例を正しく解析します。

これは、完全に機能する 3 番目の Java 6 バージョンです。

于 2012-03-10T16:05:20.463 に答える