Pergunta

Eu quero ler dados sobre personagens de MMORPG de um arquivo .txt e, em seguida, filtro na experiência (experiência mínima). Mas eu estou recebendo essa exceção, que eu sei o significado, mas eu realmente não entendo o que estou fazendo de errado.

Eu não sou bom em java, eu sou um novato na verdade. Alguém pode explicar isso para mim? Provavelmente estou fazendo algo muito estúpido.

Este é meu código:

Karakter (Personagem):

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 (Principal método):

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

 }

 }

E este é o erro:

 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)

estas linhas:

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

este é o arquivo 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 
Foi útil?

Solução

O problema é que nesta linha:

int experience = sc.nextInt();

Você está tentando ler um "int", mas o que o scanner lê é um "experience" corda

A partir desta linha em seu arquivo .txt:

experience = 15

Então, você tem que ler duas cadeias (1 st é "experiência" e 2 nd é "=") e então você vai ser capaz de ler um int ( 15) e assim por diante.

O primeiro não falhou, porque name foi atribuído um String, mas se você fizer o que você lê, você tem: "nome" em vez do nome real.

Uma alternativa é deixar a classe ResourceBundle fazer a leitura para você. Ou mesmo a classe Properties.

Com ResourceBundle você faria algo como:

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

E você teria que citar que, como: Karakters.properties

Editar

Eu adicionei uma amostra de como eu iria fazer isso usando ResouceBundle

Outras dicas

InputMismatchException é < em> lançada por um Scanner para indicar que a recuperada token não corresponder ao padrão para o tipo esperado, ou que o token está fora do intervalo para o tipo esperado .

Então, meu palpite é que você está chamando nextInt quando o próximo token não é realmente um Integer.

Editar

Você precisa ter cuidado ao ler esse arquivo, porque você tem rótulos que contam como tokens. Por exemplo, quando você tem:

maxHealthPoints = 20 ,

Você tem três símbolos: "maxHealthPoints", "=", e "20". O problema é que você está ignorando tanto o rótulo (antes de "=") e o sinal de igual. Meu conselho? Ler o seu arquivo linha por linha e utilizar o Scanner para analisar cada linha. Como alternativa, remover os rótulos e o sinal de igual do arquivo, deixando apenas os valores que você deseja extrair.

Chamando next() duas vezes corrigiu o problema. Depois que eu tenho um NullPointerException na minha karaktersVanaf(minExp) em Karakters. Para corrigir isso eu adicionei estas linhas para o meu código:

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

Mas agora eu estou vendo a InputMissMatschException novamente! Eu não sei o que estou fazendo errado! I pode estar fazendo algo totalmente errado para estar pronto para rir.

Por th maneira, eu não tenho 15 pontos de experiência, no entanto, é por isso que eu não posso votar em você agora. Eu vou fazer isso assim que eu posso fazê-lo.

Cada vez que seu leitor faz um nextInt () ou nextString (), ele não lê a próxima linha, ele lê os próximos caracteres separados por espaços em branco (espaço ou nova linha). A maneira mais simples de resolver o problema seria para remover o "name =" "experiência =", e basta colocar os dados exclusivos em cada linha.

Então, o arquivo seria algo como:

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

E, em seguida, seu código irá funcionar como está.

Eu tenho codificado uma maneira de ler usando ResourceBundle.

Eu deixá-lo aqui, espero que seja útil:

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

Output:

java Ktr
[Dursley{maxHealthPoints=20, maxGreed=3}, Aragorn{maxHealthPoints=40, maxGreed=20}]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top