проблема с использованием разделителя в классе сканера

#java #file #java.util.scanner

#java #файл #java.util.scanner

Вопрос:

     try {
    Scanner in = new Scanner(new File("text.txt"));

    Formatter out = new Formatter("text1.txt");
    in.useDelimiter(",");
    int num = in.nextInt();//this line throws null exception
    for(int i = 0; i < num amp;amp; in.hasNext(); i  )
    {

        out.format("%s","#string n"   i );

        out.format("%s", in.next());


    }
    out.close();
    }
     catch (Exception e) {
         System.out.print(e.getMessage());
    }
  

входные данные:

     4
hello,my,name,is
  

4 — это количество слов.
вывод должен быть:

 hello my name is
  

но это приводит к null ошибке.
в чем проблема?

Комментарии:

1. Какая строка кода вызывает эту null ошибку?

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

Ответ №1:

Вы должны использовать правильное регулярное выражение в useDelimiter методе. Следующий код должен работать:

 try {
    Scanner in = new Scanner(new File("text.txt"));
    Formatter out = new Formatter("text1.txt");
    in.useDelimiter(",|n|rn|\s ");
    int num = in.nextInt();
    for(int i = 0; i < num amp;amp; in.hasNext(); i  )
        out.format("string # %d is: [%s]n", i, in.next() );
    out.close();
}
catch (Exception e) {
    System.err.print("Exception: "   e);
}
  

Вывод

Для данного ввода

 4
hello,my,name,is
  

он выводит:

 string # 0 is: [hello]
string # 1 is: [my]
string # 2 is: [name]
string # 3 is: [is]
  

Комментарии:

1. @mehdi: Я думаю, вы программист и можете модифицировать код таким образом, чтобы он принимал входные данные из файла.

2. Спасибо @Martijn Courteaux 🙂 @mehdi Я отредактировал код, чтобы использовать file вместо System.in и System.out. Но, как сказал Мартин, вы могли бы просто легко заменить его, целью моего кода было показать вам, как использовать правильное регулярное выражение в useDelimiter методе.

3. этот код выдает это исключение:** Исключение: java.util. Исключение InputMismatchException** в той же строке

4. Есть ли у вас пробелы перед 4 в в вашем text.txt ?

5. Посмотрите мою правку или попробуйте новое регулярное выражение: in.useDelimiter(",|n|rn|\s ");

Ответ №2:

Проблема в том, что, поскольку вы указываете, что разделителем является запятая, символ новой строки больше не является разделителем.

Измените ваш файл на 4, hello, my, name,is, и он должен работать.

Комментарии:

1. Я понял это, и я объяснял, что произошло, и ничего не упомянул о том, что не читал из файла. Если вы не можете изменить файлы, измените свои анализаторы, чтобы они соответствовали разделителям n и , чтобы они были разделителями.

2. этот код выдает это исключение:** Исключение: java.util. Исключение InputMismatchException** в той же строке

3. извините, моей целью было @anubhava