0

try-catchの使い方を処理しようとしています。メインコードを「試して」、うまくいかない場合はそれをキャッチして別のものを実行することを理解しています。また、ユーザーに適切な値を入力するよう促したいと考えています。

キャッチをブロックに含めるように設定しても、inputmismatch 例外エラーが発生し続けます。

明確にするために: try-catch は、ユーザーが滞在する予定の時間と、どのフロアに滞在したいかについての int をユーザーに尋ねるときに表示されます。したがって、私が処理したいエラーには、非整数が含まれており、それらが「ホテル」の範囲外にある場合です。

これが私のコードです:

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);


   }
}
4

4 に答える 4

1

ブロックの中に入ると、ユーザーがしなければならないことは整数ではない何かを入力するだけでプログラム全体がクラッシュするため、現在のtry-catchブロックには欠陥があります。catch

代わりに、 から取得stayTimeする他のすべての intを取得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
        }
    }
}
于 2013-09-07T07:11:22.553 に答える
0

なぜまだ失敗するのかという質問に答えるには、try-catch ブロックの try 部分に入れられたものだけでなく、nextInt()can throwのすべての呼び出し。InputMistmatchExceptionそして、それが今起こっていることです。

もう 1 つの問題は、ブロックnextInt内で 2 回目の呼び出しを行うことです。catchcatch ブロック内でスローされた例外には、それらが属する try-catch ブロックとは別に、独自の処理が必要です。そのためnextInt、catch ブロック内で がスローされるInputMismatchExceptionと、try-catch ブロックを離れ、そこから抜け出します。投稿されたコードの場合、それは main が例外で終了することを意味します。

music_coder が指摘したように、コードは検証でループする必要があります。そうしないと、値の読み取りの 2 回目の試行が失敗した場合に、値が設定されずに終了します。

ところで、これを参照してください: Redoing a try after catch in Java、より多くの頭痛につながるスキャナーの使用に関するヒントについて。実際、現在の try-catch で処理すると、常にプログラムが終了する理由がわかります。(スキャナーの機能の問題です)

于 2013-09-07T07:38:14.667 に答える
0

以下は、除算する小さなコードです。ユーザーがゼロを入力すると、キャッチに移動し、数値を入力することもできます。 コードは 1 回だけキャッチされることに注意 してください。廃止されたメソッドを使用しました。これは、要件に応じた単なる例です。

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());
        }
    }

}
于 2013-09-07T07:12:00.990 に答える