0

ダンジョンズアンドドラゴンズのアイテムをユーザーにとってより簡単にするのに役立つアプリケーションを作ろうとしています!

さまざまな武器のリストが3つあり、統計などが異なります。リストのうち2つはプログラムに問題なく追加されますが、そのうちの1つはNoSuchElementExceptionをスローします。私が持っている他のリストと比較して、そのリストとはリモートで異なるものを見つけることができないので、私は本当に理由を理解していません。

リストの行は次のようになります。

 Light Melee Weapon,1d4,1d6,x2,10 ft.,Slashing,Axe (Throwing),8 gp, 2lb.

http://pastebin.com/Fb2db0f1リスト全体へのリンクは、見たい場合に問題を引き起こします。

http://pastebin.com/9Hg0Rw2aも、問題なく機能するリストにリンクしています。

この方法は、あなたが目を通すのに長すぎないことを願っています。私はこれを修正するために考えられるすべてのことを本当にしました。そして、それが問題を引き起こしているリストであると私は確信しています。なぜなら、それが読み取られる宛先からそれを削除するとすぐに、プログラムは問題なく実行されるからです!

動作するリストではforループを正常に実行しますが、最初のリストは動作しません。

Exception in thread "main" java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(StringTokenizer.java:349)
at MainGUI.init(MainGUI.java:60)
at MainGUI.main(MainGUI.java:32)

public HashMap<String,Weapon> init() {
    String path = "base";
    File folder = new File(path);
    File[] listOfFiles = folder.listFiles();
    if(listOfFiles.length == 0) {
        JOptionPane.showMessageDialog(MainGUI.this, "The folder \"base\" was empty"+
                " so no weapons or armor was attempted loaded.", "Warning",
                JOptionPane.WARNING_MESSAGE);
        return new HashMap<>();
    }
    HashMap<String, Weapon> weapons = new HashMap<>();
    BufferedReader r = null;
    for(File f : listOfFiles) {
        if(f.getName().endsWith(".txt")) {
            String line;
            try {
                r = new BufferedReader(new FileReader(f));
                while((line = r.readLine()) != null) {
                    Weapon w;
                    StringTokenizer st = new StringTokenizer(line,",");
                    while(st.hasMoreTokens()) {

                        w = new Weapon(WeaponCategory.fromString(st.nextToken()),
                                st.nextToken(),st.nextToken(),st.nextToken(),
                                st.nextToken(),st.nextToken(),st.nextToken(),
                                st.nextToken(),st.nextToken());
                        weapons.put(w.getName(), w);
                    }
                }
            } catch(FileNotFoundException fnfe) {
                JOptionPane.showMessageDialog(MainGUI.this, "The File "+
                    f.getName() + " was not found.", "Error",
                    JOptionPane.ERROR_MESSAGE);
            } catch(IOException ioe) {
                JOptionPane.showMessageDialog(MainGUI.this, "There was a problem reading "+
                        f.getName() + ".", "Error",
                        JOptionPane.ERROR_MESSAGE);
            }
        }
    }
    try {
        r.close();
    } catch (IOException ex) {
        JOptionPane.showMessageDialog(MainGUI.this, "An error occured while"
                + "closing the File Reader Stream:\n"+ex.getMessage(),
                "Error", JOptionPane.ERROR_MESSAGE);
    }
    return weapons;
}
4

4 に答える 4

0

NoSuchElementExceptionは、入力が使い果たされた場合に発生しました。これは、標準の入力では発生しない可能性があります(代わりにブロックされます)。値が正しくないと、InputMismatchExceptionが発生します。

データ型チェックがない場合は、心配する必要はありません。ただし、異なるデータ型が必要な場合は、Beanオブジェクトに追加する前に確認する必要があります。

于 2012-06-21T16:41:48.600 に答える
0

このようなコード

                while(st.hasMoreTokens()) {

                    w = new Weapon(WeaponCategory.fromString(st.nextToken()),
                            st.nextToken(),st.nextToken(),st.nextToken(),
                            st.nextToken(),st.nextToken(),st.nextToken(),
                            st.nextToken(),st.nextToken());
                    weapons.put(w.getName(), w);
                }

各入力行に9つの項目があると想定しているため、安全ではありません。アイテムの数を確認し、無効な行を適切に処理する必要があります(たとえば、問題を特定しやすくするために行の内容を書き出すことによって)。

これを実現する簡単な方法の1つは、を使用String.split()して回線をトークン化することです。を返し、String[]要素にアクセスする前にサイズを簡単に確認できます。

于 2012-06-21T16:29:30.223 に答える
0

Stringtokenizerは最近少し古い学校です。

スキャナーを使用するか、コンマを含むエントリがないことが確実な場合は、コンマで分割することができます。

分割を使用した場合は、パーツのエントリ数に適切な数の要素が含まれているかどうかを確認できます。

 String[] parts = line.split(",")
 if (parts.length != 9){
   throw new RuntimeException("Bad line : " + line);
 }
 ...
 //continue processing 

また、各行でインクリメントされるカウンターを作成して、どの行が例外の原因であるかを表示することもできます。

于 2012-06-21T16:31:33.143 に答える
0

簡単に試してください...

    String splitString = "Hi! Amazing! wonderful!"
    for (String token : splitString.split("!")) {
        System.out.println(token.toString());
    }
  • 結果:

       Hi!
       Amazing!
       wonderful!
    
于 2014-02-06T13:05:43.763 に答える