我正在尝试处理如何使用try-catch。我理解它会'尝试'主要代码,如果它不起作用,它会抓住它并执行不同的东西。我还想继续提示用户输入正确的值。
我一直得到inputmismatch异常错误,即使我将我的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 :(得分:1)
你现在拥有的try-catch
块是有缺陷的,因为一旦你进入catch
块,所有用户必须输入的东西不是整数来破坏整个程序。< / p>
相反,要从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
}
}
}
答案 1 :(得分: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
希望它能起作用
答案 2 :(得分:0)
以下是要分割的一小段代码。如果用户输入零,那么它将进入捕获状态,您也可以输入数字。 注意强> 代码将只捕获一次。我使用了depracated方法。这只是一个例子,根据您的要求。
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());
}
}
}
答案 3 :(得分:0)
回答你的问题,为什么它仍然失败:对nextInt()
的所有调用都可以抛出InputMistmatchException
,而不仅仅是放在try-catch块的try部分中的那个。{1}}。这就是现在正在发生的事情。
另一个问题是在nextInt
区块内第二次调用catch
。在catch块中抛出的异常需要它们自己的处理,与它们所属的try-catch块分开。因此,如果catch块中的nextInt
抛出InputMismatchException
,它将离开try-catch块并从那里开始工作。对于发布的代码,这意味着main将终止于异常。
一个侧面点,正如musical_coder指出的那样,代码需要循环验证。否则,如果第二次尝试读取值失败,它将最终没有设置值。
BTW,请参阅:Redoing a try after catch in Java,有关扫描仪使用的提示会导致更多令人头疼的问题。实际上,它告诉我为什么现在使用try-catch的处理总是会终止程序。 (这是扫描仪如何运作的问题)