Проверка вводимых данных BufferedReader

217
05 апреля 2022, 10:40

Начал изучать джаву. Добрался до ввода с консоли. Есть два способа, ну или я нашёл только два: сканер и буферридер. Со сканером вроде разобрался, там можно проверить вводимые данные с помощью методов hasNext...() Например, что введен инт можно так вот проверить:

Scanner sc = new Scanner(System.in);
       if (sc.hasNextInt()) 
           int number = sc.nextInt();
       else 
           System.out.println("Не число.");

Только там вместо sout надо "бросать исключения", но в этом я ещё не разобрался пока.

А что делать с буферридером? Как его проверять? Читал что-то про "обрабатывать исключения" не совсем понял, как уже писал выше Может кто-то может на примере написать правильный код, например, для ввода интового значения. Я так понимаю, что проверить нужно на не пустоту и тип инт?

Answer 1

Если числа пишутся каждое в своей строке то можно использовать такой способ

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int i;
try
{
  i = Integer.parseInt(br.readLine());
}
catch(NumberFormatException e)
{
  System.out.println("NumberFormatException");
}

метод readLine возвращает строку введенную в консоли, а метод parseInt возвратит число, если строка которую передают как параметр соответствует формату числа. Иначе он вызовет исключение NumberFormatException. Но этот метод довольно капризный, даже пробел в начале строки помешает получить число.

Answer 2

В Java есть 3 способа чтения входных данных из консоли:

  • использование Bufferedreader класса;
  • использование Scanner класса;
  • использование Console класса.

Разницу можно почитать здесь и здесь.

Код с примерами использования всех способов:

import java.io.BufferedReader;
import java.io.Console;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class ConsoleInputExamples
{
   public static void main(String[] args)
   {
      usingConsoleReader();
      usingBufferedReader();
      usingScanner();
   }
   private static void usingConsoleReader()
   {
      Console console = null;
      String inputString = null;
      try
      {
         // cоздать объект console
         console = System.console();
         // если console не равен null
         if (console != null)
         {
            // прочитать строку из пользовательского ввода
            inputString = console.readLine("Name: ");
            // вывод строки
            System.out.println("Name entered : " + inputString);
         }
      } catch (Exception ex)
      {
         ex.printStackTrace();
      }
   }
   private static void usingBufferedReader()
   {
      System.out.println("Name: ");
      try{
         BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));
         String inputString = bufferRead.readLine();
         System.out.println("Name entered : " + inputString);
     }
     catch(IOException ex)
     {
        ex.printStackTrace();
     }
   }
   private static void usingScanner()
   {
      System.out.println("Name: ");
      Scanner scanIn = new Scanner(System.in);
      String inputString = scanIn.nextLine();
      scanIn.close();            
      System.out.println("Name entered : " + inputString);
   }   
}

Одно из основных отличий между BufferedReader и классом Scanner заключается в том, что первый класс предназначен только для чтения строковых или текстовых данных, тогда как класс Scanner предназначен как для чтения, так и для анализа текстовых данных в примитивных типах Java, таких как int, short, float, double и long.

BufferedReader может только String читать, а Scanner может читать как String, так и другие типы данных, такие как int, float, long, double, float и т.д.

Таким образом, BufferedReader не предоставляет напрямую методов для чтения integer введённого пользователем. Можно использовать метод readLine(), однако изначально придется считывать integer в формате String.

В случае с методом parseInt(), он принимает String значение, парсит его как десятичный integer и возвращает.

READ ALSO
Get() и Set() методы [дубликат]

Get() и Set() методы [дубликат]

Зачем делать private переменные и при этом создавать для них гэттеры и сеттеры?

176
Запуск метода в новом потоке Java

Запуск метода в новом потоке Java

столкнулся с такой проблемой, у меня есть контейнер (ListView) и я читаю в него файл, ну соответственно, когда файл большой программа виснетЧто...

79
Как заблокировать любые нажатия на экран и при этом оставлять телефон включенным?

Как заблокировать любые нажатия на экран и при этом оставлять телефон включенным?

Как сделать так чтобы при нажатие на кнопку android приложения, выйти из приложения и поверх всех окон блокировать тач скрин, нажатие на экранА...

144