2013-09-07 3 views
0

Я пытаюсь обработать, как использовать try-catch. Я понимаю, что он «попробует» основной код, и если он не работает, он поймает его и выполнит что-то другое. Я хочу также продолжать предлагать пользователю ввести правильное значение.Как правильно использовать try-catch?

Я продолжаю получать ошибку исключения inputmismatch, даже если я установил свой улов, чтобы иметь это в своем блоке.

Чтобы уточнить: Try-catch будет там, когда я попрошу пользователя узнать, как долго они планируют остаться, и на каком этаже они хотели бы быть включенными. Поэтому ошибки, которые я хотел бы обрабатывать, связаны с нецелыми и если они находятся за пределами «отеля».

Вот мой код:

public class Hotel{ 

    public static void main(String[] args) throws IOException { 
     int choice = 0; 
     String guestName = " "; 
     int stayTime = 0; 
     int floorPref = 0; 

     System.out.println("Welcome to the Hotel California."); 
     Scanner sc = new Scanner(System.in); 


     Room[][] hotel = new Room[8][20];   


     for(int i = 0; i< hotel.length; i++){ 
     for(int j = 0; j<hotel[i].length;j++){ 
      hotel[i][j] = new Room(0,false,"none",0.00,0); 

      int roomNum = ((i+1) * 100) + (j + 1); 
      hotel[i][j].setRoom(roomNum); 

      int roomCheck = hotel[i][j].getRoomNumber(); 

      if(roomCheck > 500){ 
       hotel[i][j].setPrice(350.00); 
      } 

      else if(roomCheck < 500){ 
       hotel[i][j].setPrice(200.00); 
      } 
     } 
     } 

     // Guest check-in interface. 

     do{ 

     System.out.println("What business have you today?"); 
     System.out.println("1. Guest Registration"); 
     System.out.println("2. Guest Checkout"); 
     System.out.println("3. Show me occupied rooms"); 
     System.out.println("4. Exit"); 

     choice = sc.nextInt(); 

     if(choice == 1){ 


      System.out.println("Tell us about yourself."); 

      System.out.println("Please input your name:"); 

      guestName = sc.next(); 

      System.out.print("How long are you planning to stay?"); 

      try{ 
       stayTime = sc.nextInt(); 
      } 
      catch(InputMismatchException e){ 
       System.out.println("Please input a valid integer."); 
       stayTime = sc.nextInt(); 
      } 

      System.out.println("Great. What floor would you like to be on? Enter a number 1-8, 0 for no preference."); 

      floorPref = sc.nextInt(); 

      System.out.println("The following rooms are available based on your floor preference (floors 1-8, 0 for no preference: "); 

     }  
     if(floorPref > 0){ 

      for(int i = 0; i < hotel[floorPref].length; i++){ 
       if(hotel[floorPref][(i)].getOccupation() == false){ 


        System.out.print("Rooms " + hotel[floorPref-1][i].getRoomNumber() + ", "); 


       } 
      } 

      System.out.println("Are available today."); 
     } 


     else if(floorPref == 0){ 
      for(int i = 0; i < hotel.length; i++){ 
       for(int j = 0; j < hotel[i].length; j++){ 
        System.out.print("Room " + hotel[i][j].getRoomNumber() + ", "); 

       } 
      } 

      System.out.println("Is available."); 

     } 


     }while(choice != 4); 


    } 
} 
+0

'public static void throws IOException main (String [] args)' check this sintaxis – nachokk

+0

Я ввел в часть бросков, думая, что это поможет. все еще разбился даже без него. – user2142543

+0

, где именно вы получаете эту ошибку? –

ответ

0

пытаются поставить это в верхней части вашего кода

import java.util.InputMismatchException; 
import java.util.Scanner; 
import java.io.IOException; 

и в вашем public static void throws IOException main удалить throws IOException поэтому остается только public static void main надеюсь, что это будет работает

+0

Ничего страшного в том, что вы выбрасываете исключения! Я бы предпочел иметь программу, чей метод 'main' выдает исключение, сбой и говорит мне, что пошло не так, чем тот, который пытается поймать и очистить все, не сказав мне. –

1

Блок try-catch, который у вас есть сейчас, является ошибочным, потому что как только вы попадете внутрь catch, все, что нужно сделать пользователю - это ввести то, что не является целым, чтобы сбой всей вашей программы.

Вместо того, чтобы получить stayTime и все остальные Интс вы тянете из Scanner, создать отдельную функцию, которая блокирует, пока пользователь не введет INT:

private static int parseIntFromScanner(Scanner sc) { 
    while(true) { 
     try { 
      int toReturn = sc.nextInt(); 
      return toReturn; 
     } catch(InputMismatchException ime) { 
      //Continue back to the top of the loop, ask again for the integer 
     } 
    } 
} 
0

следующий небольшой фрагмент кода, чтобы разделить. Если пользователь вводит ноль, то он перейдет в catch, и вы также можете ввести номер. Примечание код поймает только один раз. Я использовал разрозненные методы. Это просто пример в соответствии с вашим требованием.

import java.io.DataInputStream; 
import java.io.IOException; 


public class test1 { 
    public static void main(String args[]) throws NumberFormatException, IOException 
    { 
     DataInputStream d=new DataInputStream(System.in);int x; 
     try { 
      x=Integer.parseInt(d.readLine()); 
      int z=8; 
      System.out.println(z/x); 
     } catch (Exception e) 
     { 
      System.out.println("can not divide by zero"); 
      x=Integer.parseInt(d.readLine()); 
     } 
    } 

} 
0

Чтобы ответить на ваш вопрос, почему он до сих пор не имеют успеха все звонки в nextInt() может бросить InputMistmatchException, а не только один положить внутри Ьгу часть примерки улова блока. И вот что происходит сейчас.

Другая проблема заключается в вызове nextInt второй раз внутри блока catch. Исключения, выброшенные внутри блока catch, требуют их собственной обработки, отдельно от блока try-catch, к которому они принадлежат. Итак, если nextInt внутри блока catch выбрасывает InputMismatchException, он покинет блок try-catch и оттуда выйдет. В случае с размещенным кодом это означает, что main прекратит свое исключение.

Боковой пункт, как указал музыкальный_кодер, код должен быть закодирован с проверкой. В противном случае это закончилось бы без установки значений, если вторая попытка прочитать значение не удалась.

BTW, см. Это: Redoing a try after catch in Java, для подсказки по использованию сканера, что приведет к большему количеству головных болей. Фактически, это говорит о том, почему обработка с помощью try-catch, который у вас есть, всегда будет заканчиваться завершением программы. (это вопрос о том, как функционирует Scanner)

Смежные вопросы