質問

.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(Characters):

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 
役に立ちましたか?

解決

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

int experience = sc.nextInt();

&quot; int&quot;を読み取ろうとしていますただし、スキャナーが読み取るのは文字列&quot; experience&quot;

です。

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

experience = 15

したがって、2つの文字列を読み取る必要があります(1 st は&quot; experience&quot;、2 nd は&quot; =&quot;)。 int(15)など。

name には文字列が割り当てられているため、最初のものは失敗しませんでしたが、読んだものをログに記録すると、次のようになります:&quot; name&quot;本名の代わりに。

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

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

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

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

編集

ResouceBundle

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

他のヒント

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

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

編集

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

maxHealthPoints = 20 ,

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

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

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の経験値を持っていません。だから私は今あなたに投票できません。できるだけ早くそれを行います。

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

つまり、ファイルは次のようになります。

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

そして、あなたのコードはそのまま動作します。

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.properties

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}]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top