Java:切换默认覆盖 try-catch

标签 java switch-statement try-catch default

mylib:

类:

package mylib;

import java.util.*;

class Library {
public static void main(String[] args) {
    boolean isInfinite = true;
    int book_index;
    Scanner input = new Scanner(System.in);

    Book[] myBooks = new Book[3]; // Create an array of books

    // Initialize each element of the array
    myBooks[0] = new Book("The Lover's Dictionary", "Levithan, D.", 211);
    myBooks[1] = new Book("White Tiger", "Adiga, A.", 304);
    myBooks[2] = new Book("Thirteen R3asons Why", "Asher, J.", 336);

    do {
        // Print book listing
        System.out.println("\n***** BOOK LISTING *****");
            for(int i = 0; i < myBooks.length; i++) {
                Book book = myBooks[i];
                System.out.println("[" + (i + 1) + "] " + book.sTitle + "\nAuthor: " +
                    book.sAuthor + "\nPages: " + book.iPages + "\nStatus: " + book.sStatus);
                System.out.print("\r\n");
            }

        // Select library action
        System.out.println("***** SELECT ACTION *****");
        System.out.println("B - Borrow a book" + "\nR - Reserve a book" +
            "\nI - Return a book" + "\nX - Exit program");
        System.out.print("\nEnter command: ");
        String sAction = input.nextLine();

        try {
            switch(sAction.toUpperCase()) { // Converts input to uppercase
                // Borrow a book
                case "B":
                    System.out.println("\n***** BORROW A BOOK *****");

                    System.out.print("Enter book index: ");
                    book_index = input.nextInt();
                    input.nextLine();

                    myBooks[book_index-1].borrowBook(); // Call method from another class
                break;

                // Reserve a book
                case "R":
                    System.out.println("\n***** RESERVE A BOOK *****");

                    System.out.print("Enter book index: ");
                    book_index = input.nextInt();
                    input.nextLine();

                    myBooks[book_index-1].reserveBook(); // Call method from another class
                break;

                // Return a book
                case "I":
                    System.out.println("\n***** RETURN A BOOK *****");

                    System.out.print("Enter book index: ");
                    book_index = input.nextInt();
                    input.nextLine();

                    myBooks[book_index-1].returnBook(); // Call method from another class
                break;

                // Exit the program
                case "X":
                    System.out.println("\nTerminating program...");
                    System.exit(0);
                break;

                default:
                    System.out.println("\nINVALID LIBRARY ACTION!");
                break;
            }
        }
        catch(ArrayIndexOutOfBoundsException err) {
            System.out.println("\nINVALID BOOK INDEX!");
        }
        catch(InputMismatchException err) {
            System.out.println("\nINVALID INPUT!");
        }
    } while(isInfinite);
}
}

书籍 类(class):

package mylib;

class Book {
int iPages;
String sTitle, sAuthor, sStatus;

public static final String AVAILABLE = "AVAILABLE",
    BORROWED = "BORROWED", RESERVED = "RESERVED";

// Constructor
public Book(String sTitle, String sAuthor, int iPages) {
    this.sTitle = sTitle;
    this.sAuthor = sAuthor;
    this.iPages = iPages;
    this.sStatus = Book.AVAILABLE; // Initializes book status to AVAILABLE
}
// Constructor accepts no arguments
public Book() {
}

// Borrow book method
void borrowBook() {
    if(sStatus.equals(Book.AVAILABLE) || sStatus.equals(Book.RESERVED)) {
        sStatus = Book.BORROWED;

        System.out.println("\nBORROW SUCCESSFUL!");
    }
    else {
        System.out.println("\nBOOK IS UNAVAILABLE!");
    }
}

// Reserve book method
void reserveBook() {
    if(sStatus.equals(Book.AVAILABLE)) {
        sStatus = Book.RESERVED;

        System.out.println("\nRESERVE SUCCESSFUL!");
    }
    else {
        System.out.println("\nBOOK IS UNAVAILABLE!");
    }
}

// Return book method
void returnBook() {
    if(sStatus.equals(Book.AVAILABLE)) {
        System.out.println("\nBOOK IS ALREADY AVAILABLE!");
    }
    else if(sStatus.equals(Book.RESERVED)) {
        System.out.println("\nBOOK IS ALREADY RESERVED!");
    }
    else {
        sStatus = Book.AVAILABLE;
    }
}
}

当我输入无效的图书索引(例如 4)时,错误会被捕获并打印“无效的图书索引!”

但是,当我为图书索引输入字符或字符串时,它会打印“无效的图书馆操作!”当它应该打印“无效输入!”

默认子句似乎覆盖了 catch?

最佳答案

您的 sAction 变量始终是 String,因为 Scanner.nextLine() 返回 String

因此,您的 default 语句被触发,并且可以合理地假设 InputMismatchException catch 永远不会执行。

另请参阅其他Scanner如果您想微调输入接受度,请使用“next”方法。

示例:

while (true) { // your infinite loop - better use a while-do instead of a do-while here
  String sAction = input.nextLine(); // we assign sAction iteratively until user "quits"
  // No try-catch: ArrayIndexOutOfBoundsException is unchecked and you shouldn't catch it.
  // If it bugs, fix the code. 
  // No InputMismatchException either, as you don't need it if you use nextLine

  // your switch same as before 
}

关于Java:切换默认覆盖 try-catch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17898070/

相关文章:

java - 如何在 ImageView 中使用的图像中定义可点击区域

java - 从 XML 文件读取 Java 中的 RSAPublicKey

c# - 使用 goto 大小写(变量);在 C# 开关中

java - 查看一组对象

java - 我在 gradle 中遇到错误,我该怎么办?

c# - 处理枚举时没有默认的switch语句

c - PIC16f877a 开关读取不正确

node.js - 为什么在这种情况下使用try/catch一个坏主意?

php - 在 php 中使用自定义异常类有什么意义?

django - 检查模板是否存在于 Django 模板中