Вопрос

Я хочу прочитать данные о персонажах MMORPG из файла .txt, а затем отфильтровать их по опыту (минимальный опыт).Но я получаю это исключение, значение которого я знаю, но я действительно не понимаю, что делаю неправильно.

Я не силен в Java, на самом деле я новичок.Может кто-нибудь объяснить мне это?Наверное, я делаю что-то очень глупое.

Это мой код:

Карактер (Персонаж):

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


}

Карактерс (Персонажи):

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

}

КарактерЗокер (Основной метод):

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)

это текстовый файл:

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

Вы пытаетесь прочитать «int», но сканер читает строку. "experience"

Из этой строки в вашем .txt-файле:

experience = 15

Итак, вам нужно прочитать две строки ( 1ул. это "опыт" и 2nd is "=" ), и тогда вы сможете прочитать int ( 15 ) и так далее.

Первый не провалился, потому что name была назначена строка, но если вы запишете то, что читаете, вы получите:«имя» вместо настоящего имени.

Альтернативой является предоставление возможности ResourceBundle класс, прочитай за тебя.Или даже Properties сорт.

С ResourceBundle вы должны сделать что-то вроде:

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

И вам придется назвать это как: Karakters.properties

РЕДАКТИРОВАТЬ

Я добавил образец того, как я это сделаю, используя ResouceBundle

Другие советы

InputMismatchException является выдается сканером, чтобы указать, что полученный токен не соответствует шаблону ожидаемого типа или что токен находится вне диапазона ожидаемого типа..

Итак, я предполагаю, что вы звоните nextInt когда следующий токен на самом деле не является Integer.

РЕДАКТИРОВАТЬ

Вам нужно быть осторожным при чтении этого файла, потому что у вас есть метки, которые считаются токенами.Например, когда у вас есть:

maxHealthPoints = 20 ,

У вас есть три жетона:«maxHealthPoints», «=" и «20».Проблема в том, что вы игнорируете как метку (перед «="), так и знак равенства.Мой совет?Прочтите файл построчно и используйте команду Scanner для анализа каждой строки.Либо удалите из файла метки и знак равенства, оставив только те значения, которые вы хотите извлечь.

Вызов next () дважды решил проблему. После этого я получил NullPointerException в моем karaktersVanaf (minExp) в Karakters. Чтобы это исправить, я добавил следующие строки в свой код:

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 (), он не читает следующую строку, он читает следующие символы, разделенные пробелом (пробел или символ новой строки). Простейшим способом решения вашей проблемы было бы удалить " name = " ;, " experience = " и просто поместить уникальные данные в каждую строку.

Итак, ваш файл будет выглядеть так:

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