سؤال

أريد قراءة البيانات عن الميديا الأحرف من a .ملف txt ومن ثم تصفية على الخبرة (الحد الأدنى من الخبرة).ولكن أنا الحصول على هذا الاستثناء الذي أعرف معنى ولكن أنا حقا لا أفهم ما أفعله خطأ.

أنا لست جيدة في جافا, أنا مبتدئ في الواقع.هل يستطيع أحدكم أن يشرح لي ذلك ؟ ربما أنا أفعل شيئا غبيا جدا.

هذا هو قانون بلدي:

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

أنت تحاول قراءة "الباحث" ولكن ما ماسح ضوئي يقرأ هو سلسلة "experience"

من هذا الخط في .ملف txt:

experience = 15

لذا عليك أن تقرأ سلسلتين ( 1st هو "الخبرة" و 2nd هو "=" ) وبعد ذلك سوف تكون قادرة على قراءة 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 =" "تجربة =" فقط ضع بيانات فريدة من نوعها في كل سطر.

حتى الملف الخاص بك سوف تبدو مثل:

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

ك.خصائص

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