0

簡単に言ってください、私は独学で、これらすべてにかなり慣れていません。それで、アドレス帳を書こうとしていました。すべてが正常に機能し、エラーも例外もありませんでした。プロジェクトを保存し、ラップトップを切り替えて、昼食に行きました。戻ってきて、コードを実行しようとしましたが、エラーが発生しました。

例外に基づいて、それが私のスキャナーと関係があることを知っています。ハイライトされた例外

int phone = inFile.nextInt()  

問題として。しかし、私はそれの何が悪いのか理解できません。

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 test.AddressBook.main(AddressBook.java:255)

コード

public class AddressBook 
{
static Scanner inFile;
static FileWriter outFile;
static ArrayList<extPerson> person;
static extPerson record;
static File fileName = new File("AddressBook.txt");
private boolean b;

メインのコードは次のとおりです。

public static void main(String[]args) throws IOException
{   
    int option = 0;
    int n = 0;
    AddressBook ab = new AddressBook();


    inFile = new Scanner(new FileReader(fileName)).useDelimiter("[|\\n]");
    //System.out.println(inFile.delimiter());
    //int count = 0;
    while(inFile.hasNext())
    {

        String fName = inFile.next();
        //System.out.print(fName);

        String mName = inFile.next();
        //System.out.print(mName);

        String lName = inFile.next();
        //System.out.print(lName);

        int phone = inFile.nextInt();
        //System.out.println(phone);

        String relationship = inFile.next();
        //System.out.print(relationship);

        int day = inFile.nextInt();
        //System.out.print(day);

        int month  = inFile.nextInt();
        //System.out.print(month);

        int year  = inFile.nextInt();
        //System.out.print(year);

        String street = inFile.next();
        //System.out.print(street);

        String city = inFile.next();
        //System.out.print(city);

        String state = inFile.next();
        //System.out.print(state);

        String zipCode = inFile.next();
        //System.out.println(zipCode);

        record = new extPerson(fName, mName, lName, phone, relationship, 
                day, month, year, street, city, state, zipCode);
        person.add(record);

    }


    while (true)
    {
        String input = JOptionPane.showInputDialog(
                            "Please Enter a number indicating your choice of action:"
                            + "\nEnter 1 To Add Record"
                            + "\nEnter 2 To Search Record By Last Name"
                            + "\nEnter 3 To Delete Record"
                            + "\nEnter 4 To Modify Record"
                            + "\nEnter 5 To Display All Records"
                            + "\nEnter 6 To Exit");

        if((input != null)&&(input.isEmpty() != true))
        {
            option = Integer.parseInt(input);

             if((option > 0 ) && (option < 7))
            {
                switch (option) {

                case 1:
                   ab.addRecord();
                   break;

                case 2:
                   ab.searchRecord();
                   break;

                case 3:
                   ab.deleteRecord();
                   break;

                case 4:

                    ab.modifyRecord();
                    break;

                case 5:

                    ab.allRecord();
                    break;

                case 6:
                    System.exit(0);
                }
            }
            else if(option == JOptionPane.CLOSED_OPTION)
            {
                n = JOptionPane.showConfirmDialog(null, "Are you sure you want to close?");
                if(n == JOptionPane.YES_OPTION)
                    System.exit(0);

            }

        }

        else if (input == null)
        {

            n = JOptionPane.showConfirmDialog(null, "Are you sure you want to close?",
                    "Confirm",
                    JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);
            if(n == JOptionPane.YES_OPTION)
                System.exit(0);

        }
        else 
        {
            System.out.println("Invalid option. Please try again.");
        }


    }
}

正しい方向に向けて、おそらくこの例外の原因を説明してくれる人が必要です。どんな助けでも大歓迎です。問題を分析するためにさらにコードが必要な場合は、お知らせください。投稿します。再度、感謝します。

EDIT サンプルデータ

Jeremy|Ronald|Wright|4331732|Family Member|06|04|2013|Eastlawn|Orange Cove|Texas|06666-9139
Heather|Paula|Perkins|7285248|Friends|04|06|2013|Bashford|Yuba City|New Mexico|99585-6820
Edward|Stephen|Allen|7186971|Family Member|25|06|2013|Reinke|Downey|Arizona|15915-9508
Dorothy|Philip|Robinson|8932173|Business Associate|15|07|2013|Harper|La Verne|Montana|37275-3957
Joan|Harry|Wilson|3859088|Business Associate|01|02|2014|Eastlawn|Antioch|Maryland|85923
4

2 に答える 2

1

行ごとの分割と解析は、この種の問題を回避するのに役立ちます。

    while (inFile.hasNext()) {
        String line = inFile.nextLine();
        String[] tokens = line.split("\\|");
        String fName = tokens[0];
        String mName = tokens[1];
        String lName = tokens[2];
        int phone = Integer.parseInt(tokens[3]);
        String relationship = tokens[4];
        int day = Integer.parseInt(tokens[5]);
        int month = Integer.parseInt(tokens[6]);
        int year = Integer.parseInt(tokens[7]);
        String street = tokens[8];
        String city = tokens[9];
        String state = tokens[10];
        String zipCode = tokens[11];
    }

テキストファイルのスニペットでこれを行うと、私にとってはうまくいきます。

于 2014-04-09T12:24:45.923 に答える
0

Java では、一部の区切りスプリッターで null/空のトークンを使用するものと使用しないものがあります。||orが実行さ|notInt|れていて、それscanner.nextInt()が実行されている場合は、ImputMissmatchExceptionが発生します。

Scanner i =
        new Scanner("Jeremy|Ronald|Wright|43|||Family Member|06|04|2013|06666-9139\n").useDelimiter("[|\\n]");
    while (i.hasNext()) {
        for (int j = 0; j < 3; j++) {
            System.out.println(i.next());
        }
        for (int j = 3; j < 6; j++) {
            int loc = i.nextInt();   // here i get same exception  
                                     // when reading next int after 43
            System.out.println(loc);
        }
    }

区切り文字と文字列スプリッターを備えたスキャナーは空のトークンを処理しますが、StringTokenizer は処理しません。以下のコードを実行します。

    System.out.println("------Scanner Delimiter------------------------------");
    Scanner i =
        new Scanner("Jeremy|Ronald|433|||06|04|2013|06666-9139").useDelimiter("[|]");
    while (i.hasNext()) {           
            System.out.println("\""+i.next()+"\"");         
    }
    System.out.println("---------------String split---------------------");

     String[] result = "Jeremy|Ronald|433|||06|04|2013|06666-9139".split("[|]");
     for(String s: result)
         System.out.println("\""+s+"\"");

    System.out.println("-------------String Tokenizer-----------------------");

     StringTokenizer st = new StringTokenizer("Jeremy|Ronald|433|||06|04|2013|06666-9139", "|");
     while (st.hasMoreTokens()) {
         System.out.println("\""+st.nextToken()+"\"");
     }

出力します:

------Scanner Delimiter------------------------------ "Jeremy" "Ronald" "433" "" "" "06" "04" "2013" "06666-9139" ---------------String split--------------------- "Jeremy" "Ronald" "433" "" "" "06" "04" "2013" "06666-9139" -------------String Tokenizer----------------------- "Jeremy" "Ronald" "433" "06" "04" "2013" "06666-9139"

于 2014-04-09T11:55:53.283 に答える