代码之家  ›  专栏  ›  技术社区  ›  Loolooii

InputMissMatchException

  •  1
  • Loolooii  · 技术社区  · 16 年前

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

    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 
    
    5 回复  |  直到 8 年前
        1
  •  0
  •   OscarRyz    16 年前

    InputMismatchException 由扫描程序抛出,表示检索到的令牌与预期类型的模式不匹配,或者令牌超出预期类型的范围 .

    所以,我猜你在打电话 nextInt 当下一个令牌实际上不是 Integer .

    maxHealthPoints = 20 ,
    

    Scanner 解析每一行。或者,从文件中删除标签和等号,只留下要提取的值。

        2
  •  1
  •   João Silva    16 年前

    next() NullPointerException karaktersVanaf(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个经验点,这就是为什么我现在不能投票给你。我会尽快这样做。

        3
  •  1
  •   MattAllegro    8 年前

    问题在于,在这条线上:

    int experience = sc.nextInt();
    

    "experience"

    从.txt文件中的这一行:

    experience = 15
    

    所以你必须读两个字符串(1 是“经验”和2 nd

    第一个没有失败,因为 name

    另一种选择是让 ResourceBundle 全班为你读课文。甚至 Properties

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

    你必须将其命名为: Karakters.properties

    我添加了一个示例,说明如何使用 ResouceBundle

        4
  •  0
  •   Kaleb Brasee    16 年前

    每次你的阅读器执行nextInt()或nextString()时,它都不会读取下一行,而是读取由空格(空格或换行符)分隔的下一个字符。解决问题的最简单方法是删除“name=”、“experience=”,只需在每一行上添加唯一的数据。

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

        5
  •  0
  •   OscarRyz    16 年前

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

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