문제

.txt 파일에서 mmorpg 문자에 대한 데이터를 읽은 다음 경험에 대한 필터 (최소 경험)를 읽고 싶습니다. 그러나 나는이 예외를 얻고 있습니다. 나는 의미를 알고 있지만 내가 무엇을 잘못하고 있는지 이해하지 못합니다.

나는 Java를 잘하지 못하고 실제로 초보자입니다. 누군가 나에게 이것을 설명해 주시겠습니까? 아마도 나는 아주 바보 같은 일을하고 있습니다.

이것은 내 코드입니다.

Karakter (캐릭터) :

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 
도움이 되었습니까?

해결책

문제는이 라인에서 다음과 같습니다.

int experience = sc.nextInt();

"int"를 읽으려고하지만 스캐너가 읽는 내용은 문자열입니다. "experience"

.txt 파일 의이 줄에서 :

experience = 15

따라서 두 줄을 읽어야합니다 (1 "경험"이고 2입니다nd "=")와 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() 두 번 문제를 해결했습니다. 그 후 나는 A를 얻었다 NullPointerExceptionkaraktersVanaf(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 () 또는 NexString ()을 수행 할 때마다 다음 줄을 읽지 않으며 공백 (공간 또는 신성)으로 분리 된 다음 문자를 읽습니다. 문제를 해결하는 가장 간단한 방법은 "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. 단점

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