Frage

Ich will Daten über MMORPG Zeichen aus einer TXT-Datei lesen und dann filtern auf Erfahrung (mindestens Erfahrung). Aber ich diese Ausnahme bekommen, die ich kenne, die Bedeutung, aber ich verstehe wirklich nicht, was ich falsch mache.

ich bei Java nicht gut, ich bin ein Anfänger tatsächlich. Kann jemand bitte mir dies erklären? Wahrscheinlich etwas, was ich tue, sehr dumm.

Dies ist mein Code:

Karakter (Rolle):

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 (Zeichen):

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 (Main-Methode):

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());

 }

 }

Und das ist der Fehler:

 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)

diese Zeilen:

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

das ist die txt-Datei:

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 
War es hilfreich?

Lösung

Das Problem ist, dass in dieser Zeile:

int experience = sc.nextInt();

Sie versuchen, eine „int“ zu lesen, aber was der Scanner liest ist ein String "experience"

Aus dieser Zeile in der TXT-Datei:

experience = 15

So können Sie zwei Strings lesen (1 st ist "Erfahrung" und 2 nd ist "=") und dann werden Sie in der Lage sein, einen int zu lesen ( 15) und so weiter.

Die erste nicht gescheitert, weil name ein String zugewiesen wurde, aber wenn Sie sich, was Sie lesen, Sie haben: „name“ statt den wirklichen Namen.

Eine Alternative ist die ResourceBundle Klasse zu lassen, damit Sie die Lese tun. Oder auch die Properties Klasse.

Mit Resource würden Sie tun so etwas wie:

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

Und Sie müßten nennen, dass als: Karakters.properties

Bearbeiten

Ich habe eine Probe gegeben, wie ich dies mit ResouceBundle tun würde

Andere Tipps

InputMismatchException < em> von einem Scanner geworfen, um anzuzeigen, dass das Token für den erwarteten Typ des Musters nicht abgerufen übereinstimmen, oder dass das Token für den erwarteten Typ ist außerhalb des Bereichs .

Also, meine Vermutung ist, dass Sie nextInt fordern, wenn das nächste Token nicht eigentlich ein Integer ist.

Bearbeiten

Sie müssen vorsichtig sein, wenn diese Datei zu lesen, da Sie Etiketten, die als Token zählen. Zum Beispiel, wenn Sie haben:

maxHealthPoints = 20 ,

Sie haben drei Token: "maxHealthPoints", "=" und "20". Das Problem ist, dass Sie sowohl das Etikett ignorieren (vor „=“) und das Gleichheitszeichen. Mein Rat? Lesen Sie Ihre Datei Zeile für Zeile und verwenden Sie die Scanner jede Zeile zu analysieren. Alternativ entfernen Sie die Etiketten und das Gleichheitszeichen aus der Datei, so dass nur die Werte, die Sie extrahieren möchten.

Beim next() fixiert zweimal das Problem. Danach bekam ich einen NullPointerException in meinem karaktersVanaf(minExp) in karakters. Um dies zu beheben Ich habe diese Zeilen zu meinem Code:

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;
}

Aber jetzt die InputMissMatschException ich sehe wieder! Ich weiß nicht, was ich falsch mache! Ich kann etwas zu tun, völlig falsch, so bereit sein werden, um zu lachen.

Mit der th way, ich habe nicht 15 Erfahrungspunkte noch, deshalb habe ich nicht für dich gerade jetzt abstimmen. Ich werde das tun, sobald ich dies tun kann.

Jedes Mal, wenn Ihr Leser hat eine nextInt () oder nextString (), liest es nicht die nächste Zeile, liest sie die nächsten Zeichen durch Leerzeichen getrennt (Leerzeichen oder Newline). Der einfachste Weg, um Ihr Problem zu beheben wäre, die „name =“, „Erfahrung =“ zu entfernen, und setzt nur die einzigartigen Daten in jeder Zeile.

So Ihre Datei aussehen würde:

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

Und dann wird Ihr Code funktioniert wie es ist.

Ich habe eine Art und Weise codiert mit Resource zu lesen.

Ich lasse es hier, ich hoffe, Sie finden es nützlich:

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

Ausgabe:

java Ktr
[Dursley{maxHealthPoints=20, maxGreed=3}, Aragorn{maxHealthPoints=40, maxGreed=20}]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top