Member 13574399 Ответов: 1

Я не знаю, почему я получаю inputmismatchexception (java)


Я пытаюсь создать объект с извлечением переменных из текстового файла и сохранить все объекты в arraylist (arraylist для этих объектов находится в объекте Liman, поэтому я сначала создал liman). Текстовый файл выглядит следующим образом:
Цитата:
1574683 Абиссиния 105 60 25 21 11


Первое число-ИМО, исим-Абиссиния, остальные числа-целые числа, которые я хочу получить отдельно. Этот код выдает ошибку "InputMismatchException". Однако я не вижу, что я даю неправильно, типы, кажется, совпадают. Он идет как двойная строка int int int int int. Что я делаю не так?

java.util.InputMismatchException
	at java.util.Scanner.throwFor(Scanner.java:864)
	at java.util.Scanner.next(Scanner.java:1485)
	at java.util.Scanner.nextInt(Scanner.java:2117)
	at java.util.Scanner.nextInt(Scanner.java:2076)
	at program.main(program.java:28)

28 это линия:
int Patlayıcı_Taşıma_siniri = input.nextInt();


Что я уже пробовал:

try{ Scanner input = new Scanner(new File("C:\\Users\\Asus\\Documents\\NetBeansProjects\\NesneProjesi\\build\\classes\\1574683.txt"));
            //Scanner input = new Scanner(new File("test.txt"));
            //Scanner input = new Scanner(System.in);
            input.useDelimiter(" ");
            Liman liman = new Liman();
            while (input.hasNext()) {
                double IMO = input.nextDouble();

                String isim = input.next();
                int Max_Konteyner_sayisi = input.nextInt();
                int Buyuk_Konteyner_sayisi = input.nextInt();
                int Sogutuculu_Konteyner_sayisi = input.nextInt();
                int Toksik_Taşıma_siniri = input.nextInt();
                int Patlayıcı_Taşıma_siniri = input.nextInt();
                
                Gemi yeniGemi = new Gemi(IMO, isim, Max_Konteyner_sayisi, Buyuk_Konteyner_sayisi, Sogutuculu_Konteyner_sayisi,Toksik_Taşıma_siniri, Patlayıcı_Taşıma_siniri);
                liman.gemiEkle(yeniGemi); //gemiEkle adds ships into limans arraylist 'Gemiler'.
                System.out.println(liman.Gemiler.toString());
    }
       }catch(Exception e){
           e.printStackTrace();
       }finally{
            System.out.println("done");
            
       }

Richard MacCutchan

Во входном файле должно быть что-то еще. Вам нужно добавить некоторый отладочный код, чтобы перечислить каждый элемент по мере его сканирования.

1 Ответов

Рейтинг:
1

Richard MacCutchan

Проблема заключается в символе новой строки после последнего маркера в строке. Если вы добавите пробел после последнего маркера и удалите символ новой строки, сканер не выдаст несоответствия. Сканеры не являются "интеллектуальными", они работают на очень специфических совпадениях паттернов, поэтому ваши данные должны быть точно в пределах заданного вами паттерна. Таким образом, ваш текстовый файл должен содержать только строку

1574683 Abyssinia 105 60 25 21 11 

С пробелом в конце, но без символа новой строки. Если у вас есть несколько строк, то каждая строка должна иметь пробел в конце, а последняя строка не должна иметь новой строки после нее.