1

.txtファイルからMMORPGキャラクターに関するデータを読み取り、エクスペリエンス(最小エクスペリエンス)でフィルター処理したいと思います。しかし、私はこの例外を受け取ります。これは意味を知っていますが、私が間違っていることを本当に理解していません。

私はJavaが苦手で、実際は初心者です。誰かが私にこれを説明してもらえますか?おそらく私は非常に愚かなことをしているのでしょう。

これは私のコードです:

Karakter(キャラクター):

import java.util.Scanner;


public class Karakter {

 private String name;
 private int experience;
 private int maxHealthPoints;
 private int healthPoints;
 private int maxGreed;
 private int greed;

 public Karakter(String nm, int exp, int mHP, int hp, int mG, int g)
 {
  name = nm;
  experience = exp;
  maxHealthPoints = mHP;
  healthPoints = hp;
  maxGreed = mG;
  greed = g;
 }

 public String toString()
 {
  String s = "";
  s += getName(); 
  s += getExperience();
  s += getMaxHealthPoints();
  s += getHealthPoints();
  s += getMaxGreed(); 
  s += getGreed();
  return s;
 }

 public static Karakter read(Scanner sc)
 {
  String name = sc.next();
  int experience = sc.nextInt();
  int maxHealthPoints = sc.nextInt();
  int healthPoints = sc.nextInt();
  int maxGreed = sc.nextInt();
  int greed = sc.nextInt();
  return new Karakter(name, experience, maxHealthPoints, healthPoints, maxGreed, greed);
 }

 public boolean hasExperience(int min)
 {
  return experience >= min;
 }
 // returns true if Krakters have the same name
 public boolean equals(Object other)
 {
  if(!(other instanceof Karakter))
  {
   return false;
  }
  else
  {
   Karakter that = (Karakter) other;
   return that.name == this.name;
  }
 }

 public String getName()
 {
  return name;
 }

 public int getExperience()
 {
  return experience;
 }

 public int getMaxHealthPoints()
 {
  return maxHealthPoints;
 }

 public int getHealthPoints()
 {
  return healthPoints;
 }

 public int getMaxGreed()
 {
  return maxGreed;
 }

 public int getGreed()
 {
  return greed;
 }


}

Karakters(キャラクター):

import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

public class Karakters {



private ArrayList<Karakter> kars = new ArrayList<Karakter>();

 public void voegToe(Karakter kar)
 {
  if(!kars.contains(kar))
  {
   kars.add(kar);
  }
 }

 // returns an arraylist of characters with exp >= minexp

 public ArrayList<Karakter> karaktersVanaf(int minExperience)
 {
  Karakter kar = null;
  for(int i = 0; i < kars.size(); i++)
  {
   if(kar.hasExperience(minExperience))
    kars.add(kar);
  }
  return kars;
 }

 public static Karakters read(String infile)
 {
  Karakters k = new Karakters();
  try
  {
   FileReader fr = new FileReader(infile);
   Scanner sc = new Scanner(fr);
   int aantal = sc.nextInt();
   for(int i = 0; i < aantal ; i++)
   {
    Karakter kar = Karakter.read(sc);
    k.kars.add(kar);
   }
   fr.close();
  }
  catch(IOException iox)
  {
   System.out.println(iox);
   return null;
  }
  return k;
 }

}

KarakterZoeker(メインメソッド):

import java.util.ArrayList;
import java.util.Scanner;


public class KarakterZoeker {


 public static void main(String[] args)
 {


  Scanner sc = new Scanner(System.in);
  Karakters kars = Karakters.read("infile.txt");

  System.out.println("Welke experience wilt u minimaal?");
  int minExp = sc.nextInt();

  ArrayList<Karakter> s = kars.karaktersVanaf(minExp);

  System.out.println(s.toString());

 }

 }

そしてこれはエラーです:

 Exception in thread "main" java.util.InputMismatchException
 at java.util.Scanner.throwFor(Unknown Source)
 at java.util.Scanner.next(Unknown Source)
 at java.util.Scanner.nextInt(Unknown Source)
 at java.util.Scanner.nextInt(Unknown Source)
 at Karakter.read(Karakter.java:38)
 at Karakters.read(Karakters.java:41)
 at KarakterZoeker.main(KarakterZoeker.java:14)

これらの行:

Karakter kar = Karakter.read(sc);  (in Karakters)
int experience = sc.nextInt();   (in Karakter)
Karakters kars = Karakters.read("infile.txt");  (in KarakterZoeker)

これはtxtファイルです:

2
name = Dursley
experience = 15
maxHealthPoints = 20
healthPoints = 10
maxGreed = 3
greed = 1
name = Aragorn
experience = 45
maxHealthPoints = 40
healthPoints = 30
maxGreed = 20
greed = 10 
4

5 に答える 5

1

InputMismatchExceptionスキャナーによってスローされ、取得されたトークンが期待されるタイプのパターンと一致しないこと、またはトークンが期待されるタイプの範囲外であることを示します

nextIntしたがって、次のトークンが実際にはではないときに呼び出していると思いますInteger

編集

トークンとしてカウントされるラベルがあるため、そのファイルを読み取るときは注意が必要です。たとえば、次の場合:

maxHealthPoints = 20 ,

「maxHealthPoints」、「=」、「20」の3つのトークンがあります。問題は、ラベル(「=」の前)と等号の両方を無視していることです。私のアドバイス?ファイルを1行ずつ読み取り、を使用しScannerて各行を解析します。または、ファイルからラベルと等号を削除して、抽出する値だけを残します。

于 2009-10-30T22:49:12.880 に答える
1

2回呼び出すnext()と問題が解決しました。その後、Karaktersで を取得しNullPointerExceptionました。karaktersVanaf(minExp)これを修正するために、次の行をコードに追加しました。

public ArrayList<Karakter> karaktersVanaf(int minExperience) throws           FileNotFoundException
{
    Scanner sc = new Scanner(new FileReader("infile.txt")); // --------line 1
    Karakter kar = Karakter.read(sc); // ------------ line 2
    for(int i = 0; i < kars.size(); i++)
    {
        if(kar.hasExperience(minExperience))
            kars.add(kar);
    }
    return kars;
}

しかし今、私はInputMissMatschException再び見ています!何が間違っているのかわからない!私は何か完全に間違ったことをしているかもしれないので、笑う準備をしてください.

ちなみに私はまだ経験値が15ないので、今はあなたに投票できません。できる限り早くそうします。

于 2009-10-31T00:42:57.173 に答える
0

リーダーがnextInt()またはnextString()を実行するたびに、次の行は読み取られず、空白(スペースまたは改行)で区切られた次の文字が読み取られます。問題を解決する最も簡単な方法は、 "name ="、 "experience ="を削除し、各行に一意のデータを配置することです。

したがって、ファイルは次のようになります。

2
Dursley
15
20
10
3
1
Aragorn
45
40
30
20
10

そして、コードはそのまま機能します。

于 2009-10-30T23:01:08.107 に答える
0

問題は、次の行にあることです。

int experience = sc.nextInt();

「int」を読み取ろうとしていますが、スキャナーが読み取るのは文字列です"experience"

.txtファイルのこの行から:

experience = 15

したがって、2つの文字列(1つ は「experience」、2つは「=」)を読み取る必要があります。そうすると、int(15)などを読み取ることができます。

最初のものはname文字列が割り当てられていたため失敗しませんでしたが、読んだものをログに記録すると、本名の代わりに「名前」が表示されます。

別の方法は、ResourceBundleクラスに読み取りを行わせることです。またはPropertiesクラスですら。

ResourceBundleを使用すると、次のようなことができます。

ResourceBundle bundle = ResourceBundle.getBundle("Karakters");
String exp = bundle.getString("experience");
int experience = Integer.parseInt( exp );

そして、あなたはそれを次のように名付ける必要があります:Karakters.properties

編集

これを使用してこれを行う方法のサンプルを追加しましたResouceBundle

于 2009-10-30T23:26:22.367 に答える
0

ResourceBundle を使用して読み取る方法をコーディングしました。

ここに残しておきます。お役に立てば幸いです。

import java.util.*;

public class Ktr {
       public static void main( String [] args ) {

           ResourceBundle b = ResourceBundle.getBundle("k");
           String names = b.getString("names");

           List<K> l = new ArrayList<K>();
           for( String name : names.split(",")){
               l.add( K.read( name, b ));
           }

           System.out.println( l );
       }
}

class K {

    private String name;
    private int maxHealthPoints;
    private int maxGreed;
    // etc.. 

    public static K read( String name, ResourceBundle b ) {
        K k = new K();
        k.name              = name;
        k.maxHealthPoints   = 
            Integer.parseInt(b.getString( name + ".maxHealthPoints") );

        k.maxGreed          = 
            Integer.parseInt(b.getString( name + ".maxGreed") );
        // you get the idea 
        return k;
    }
    public String toString() {
        return String.format("%s{maxHealthPoints=%d, maxGreed=%d}", 
                                name, maxHealthPoints, maxGreed);
    }
}

k.プロパティ

names=Dursley,Aragorn
Dursley.maxHealthPoints=20
Dursley.maxGreed=3

Aragorn.maxHealthPoints=40
Aragorn.maxGreed=20

出力:

java Ktr
[Dursley{maxHealthPoints=20, maxGreed=3}, Aragorn{maxHealthPoints=40, maxGreed=20}]
于 2009-10-30T23:20:29.127 に答える