Исключения ввода для целочисленного деления (Java)

Этот код должен перехватывать исключения при делении 24 на предоставленный знаменатель из входного потока. Он должен перехватывать исключения, например, при делении на 0, если пользователь вводит такое слово, как «привет», или что-то еще странное, что может ввести пользователь. Также при вводе десятичного числа возвращаемое значение должно быть целым числом. Если какое-либо исключение перехвачено, программа должна попросить пользователя ввести другое целое число до тех пор, пока не будет введено допустимое.

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

  public class Division {

  public int quotient(int numerator){
  boolean flag = false;
  Scanner s = new Scanner(System.in);
  int denom = 0;      
  while(flag==false){
      denom = Integer.parseInt(s.next());
      try{
          int q = numerator/denom;
      } catch(NumberFormatException nfe){
          System.out.print("Enter an integer:");
          continue;
      } catch(InputMismatchException ime){
          System.out.print("Enter an integer:");
          continue;
      } catch(ArithmeticException ae){
          System.out.print("Enter a non-zero integer:");
          continue;
      }
      flag=true;
  }
  return numerator/denom;
  }

  public static void main(String[] args) {
      System.out.print("Enter an integer (although you can make mistakes): ");
      System.out.println("The quotient is " + new Division().quotient(24));
      System.out.println("Done!");
  }

}

person user2821523    schedule 26.09.2013    source источник


Ответы (3)


Переместите это заявление

denom = Integer.parseInt(s.next());

в блок try/catch, чтобы он попал в блок NumberFormatException

i.e.

try {
    denom = Integer.parseInt(s.next());
    ...
} catch (NumberFormatException nfe) {
    System.out.print("Enter an integer:");
    continue;
} catch (...) {

Прочтите: блок try

person Reimeus    schedule 26.09.2013
comment
Большое спасибо! Кроме того, если я ввожу десятичное число, например 6,2, я хочу, чтобы оно возвращало 4 в качестве ответа. Но сейчас он думает, что это исключение. Как это исправить? - person user2821523; 27.09.2013
comment
Измените тип переменной на double. Будет хорошее упражнение :) - person Reimeus; 27.09.2013

Оператор catch будет захватывать только исключения, запущенные внутри своего блока try. Переместите оператор Integer.parseInt внутрь блока try.

person SJuan76    schedule 26.09.2013

Вам нужно, чтобы try{ произошло ДО denom = Integer.parseInt(s.next());, а не после, чтобы исключение действительно могло быть перехвачено.

person Dawood ibn Kareem    schedule 26.09.2013