2016-11-14 7 views
4

私はポケモンのバトルシミュレーター(基本的にはpokemonshowdown gen1)に取り組んでおり、ポケモンの配列を自動化しようとしていますが、スキャナーの問題にぶつかっています。ファイルは次のようにフォーマットされます:Name.Type1.Type2.hp.attack.defense.special.speed.学習可能な移動のリスト。したがって: Aerodactyl.Flying.Rock.80.105.65.60.130.Agility、Bide、Bite、Double-Edge、ダブルチーム、ドラゴンレイジ、火の爆発、飛行、ハイビーム、ミミック、怒りの風邪、スカイアタック、代用、超音速、スウィフト、テイクダウン、毒性、ウィングアタック。ファイルから配列を取り込む

私はtypeArrayとmoveArrayの両方で動作するメソッドを取得しましたが、何らかの理由で基本的に同じループを使用してスキャナが空のトークンを返しています。

例外:

0 Exception in thread "main" java.lang.NumberFormatException: For input string: "" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
at java.lang.Integer.parseInt(Integer.java:592) 
at java.lang.Integer.parseInt(Integer.java:615) 
at Controller.initPokemonArray(Controller.java:169) 
at Controller.<init>(Controller.java:29) 
at Driver.main(Driver.java:15) 

ここでは、HP用のparseIntの呼び出しでエラーを投げ、全体の方法です。

private Pokemon[] initPokemonArray() { 
    Pokemon[] pokemonArray = new Pokemon[83]; 
    try { 
     Scanner inputScan = new Scanner(new File("src/pokemon")).useDelimiter("."); 
     String name = ""; 
     Type type1 = typeArray[0]; 
     String inputType1 = ""; 
     Type type2 = typeArray[0]; 
     String inputType2 = ""; 
     int hp = 0; 
     int atk = 0; 
     int def = 0; 
     int spc = 0; 
     int spe = 0; 
     String[] lm = {}; 
     Move[] learnableMoves; 
     int counter = 0; 
     while (counter < 83) { 
     System.out.print(counter); 
      if (inputScan.hasNextLine()) { 
       name = inputScan.next(); 
       System.out.println(name+" "); 
       //System.out.print("name"); 
       inputType1 = inputScan.next(); 
       for (int i = 0;i < 16;i++) 
        if (inputType1.equals(typeArray[i].toString())) 
         type1 = typeArray[i]; 
       System.out.println(type1.toString()+" "); 
       inputType2 = inputScan.next(); 
       for (int i = 0;i < 16;i++) 
        if (inputType2.equals(typeArray[i].toString())) 
         type2 = typeArray[i]; 
       System.out.println(type2.toString()+" "); 
       hp = Integer.parseInt(inputScan.next()); 
       System.out.println(hp+" "); 
       atk = Integer.parseInt(inputScan.next()); 
       System.out.println(atk+" "); 
       def = Integer.parseInt(inputScan.next()); 
       System.out.println(def+" "); 
       spc = Integer.parseInt(inputScan.next()); 
       System.out.println(spc+" "); 
       spe = Integer.parseInt(inputScan.next()); 
       System.out.println(spe+" "); 
       lm = inputScan.next().split(","); 
       System.out.println(); 
      } 
      //TODO move this to private helper method 
      learnableMoves = new Move[lm.length]; 
      for (int i = 0;i < 160;i++) { 
       for (int j = 0;j < lm.length;j++) { 
        if (lm[j] == moveArray[i].getName()) 
         learnableMoves[j] = moveArray[i]; 
       } 
      } 
      pokemonArray[counter] = new Pokemon(name,type1,type2,hp,atk,def,spc,spe,learnableMoves); 
      counter++; 
     } 
     inputScan.close(); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return pokemonArray; 
} 

免責事項:これは私のJava 2のコースのためのプロジェクトであり、また、ここでの私の最初の投稿は、私は、私がそのようにちょうどそれがここにダウンを知ることせんになってるかを正確に知りません。

+0

どのようなエラーが投げられますか? – DejaVuSansMono

+1

"hpのparseInt呼び出しでエラーが発生しました" - どのようなエラー?それはすべての行または特にいくつかの場合に起こりますか?問題の原因となる 'src/pokemon'の一部を含めると便利です。 – bradimus

+0

あなたが特定の質問をしているだけで、あなたのために書く人を探しているのではなく、あなたは大丈夫です。 inputScan.next()を文字列変数に保存してから印刷してみてください。スペースや何かを拾っているかもしれません。また、inputScan.nextInt()も参照してください。 – Joe

答えて

2

useDelimiter()メソッドは、渡されたStringを正規表現の値として受け取ります。 https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html#useDelimiter-java.lang.String-。ピリオドは正規表現で特定の意味を持ちます。特定の文字を取得するには "。"これを使って。

Scanner inputScan = new Scanner(new File("src/pokemon")).useDelimiter("\\."); 
+0

ありがとうございました!それは問題のようだった。正規表現とピリオドについては分かりませんでした。 – logan5234

関連する問題