1

我想从 .txt 文件中读取有关 MMORPG 字符的数据,然后根据经验(最低经验)进行过滤。但是我遇到了这个异常,我知道它的含义,但我真的不明白我做错了什么。

我不擅长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;
 }


}

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

InputMismatchExceptionScanner 抛出以指示检索到的令牌与预期类型的​​模式不匹配,或者令牌超出预期类型的​​范围

所以,我的猜测是,nextInt当下一个令牌实际上不是Integer.

编辑

读取该文件时需要小心,因为您的标签算作标记。例如,当您有:

maxHealthPoints = 20 ,

您有三个标记:“maxHealthPoints”、“=”和“20”。问题是您忽略了标签(在“=”之前)和等号。我的建议?逐行读取文件并使用Scanner解析每一行。或者,从文件中删除标签和等号,只留下您要提取的值。

于 2009-10-30T22:49:12.880 回答
1

调用next()两次解决了问题。在那之后,NullPointerExceptionkaraktersVanaf(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

我编写了一种使用 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 回答
0

问题是在这条线上:

int experience = sc.nextInt();

您正在尝试读取“int”,但扫描仪读取的是字符串"experience"

从 .txt 文件中的这一行:

experience = 15

所以你必须读取两个字符串( 一个是“经验”,第二个是“=”),然后你就可以读取一个 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 回答