java 如何验证用户输入是否等效于二维数组中的元素

egdjgwm8  于 2022-11-27  发布在  Java
关注(0)|答案(1)|浏览(115)

我是一个初学者,我正在我的程序中尝试错误处理。我的程序的目的是“预订”一场音乐会,我创建了一个预订座位的方法。然而,有几种方法可以让用户输入错误的数字,所以我尝试创建我自己的异常,并在用户输入的行数或列数不在座位安排中时抛出它。
我发现的问题是,我必须使用if语句来检查用户输入的数字(即二维数组的索引号)是否确实在数组元素中,而我为这段代码编写的内容并不适用。
我想抛出一个错误,告诉用户输入了不正确的行和列,然后继续执行代码的其余部分。
这是我创建的异常的代码。

public class ArrayInputMismatchException extends Exception {
  public ArrayInputMismatchException() {} 

  public ArrayInputMismatchException(String message) {
    super(message); 
  }
  
}

这是我的错误处理和用户输入验证代码。

int rowSeat = 0; 
    int colmnSeat = 0; 
    
    try {  
      System.out.println("What is the row number that your seat is in?");  
      rowSeat = userNum.nextInt(); 
      System.out.println("\nWhat is the column number that your seat is in?"); 
      colmnSeat = userNum.nextInt(); 
      arr1[rowSeat - 1][colmnSeat - 1] = 1; //this is to change the element in the array that symbolizes a seat to '1' to show its now booked, before it was 0 to show its available and since they chose this seat, it's now 1... 

      if ((rowSeat || colmnSeat) != arr1[rowSeat][colmnSeat]) { //I put my conditional like this for now, but I'm not sure what else to replace it with to check the user input is equilvalent to the array index
        ArrayInputMismatchException e = new ArrayInputMismatchException("Something went wrong: You cannot enter a number that is not a valid row or column."); 
        throw e;
      } //this is my error message that I want to happen, for example if the seating arrangment in up to a 4x3 and the user inputs row 13, then the error should appear, same with if they enter column 10 then an error message should appear  
      
    } 

    catch (InputMismatchException e) {
      System.out.println("\nAn error occured: You cannot enter any character or symbol other than a valid number for the row and column of the chosen seat for booking. " + e); 
    } //this is an exception that appears when they input a string instead of a number, like 'k' or '?' instead of a valid number present in the rows and columns, it already works so i'm not that worried about it

`
提前感谢大家的帮助!

mitkmikd

mitkmikd1#

你写的if语句不能编译。你在那里做的组合在java中是不可能的。你可以有这样的东西

if (rowSeat != arr1[rowSeat][colmnSeat]
    || colmnSeat != arr1[rowSeat][colmnSeat]) {
  ...
}

但这对您没有帮助。该语句将检查数组中的值是否不等于用户选择的行或列。

    • 解决方案:**

您有两个选项:
1.执行手动索引检查或
1.让handle java执行索引检查。

    • 1.手动索引检查:**

首先,在为arr1赋值**之前,**需要检查用户输入,因此if语句需要在colmnSeat = userNum.nextInt();之后立即执行。
您需要执行以下操作:

if (rowSeat < 0 || rowSeat >= arr1.length
    || colmnSeat < 0 || colmnSeat >= arr1[0].length) {
    throw new ArrayInputMismatchException("Something ....");
}
    • 进一步说明**

首先,数组从0开始。因此,给定一个4的数组,第一个元素的索引为0,最后一个元素的索引为3(而不是4!)。如果你试图访问arr [4],你会得到一个错误(ArrayIndexOutOfBoundsException),你的程序会停止。
这就是为什么我们需要检查负输入,其次我们需要检查,值是否大于或等于数组的大小。
首先它检查值是否为负,然后检查值是否超出界限。二维数组实际上是一个由以下结构的数组组成的数组:

arr1 = [[row1-col1, row1-col2]]
       [[row2-col1, row2-col2]]
       [[row3-col1, row3-col2]]

其中row1-col1是arr1[0,0]的值。在此结构中,外部数组保存具有值的数组。因此,当仅调用外部数组时,您将获得一行的数组:

arr1[0] == [row1-col1, row1-col2]

这些价值观就是这样产生的:

arr1.length    == 3
arr1[0].length == 2
    • 2.让java处理检查:**

每当你试图从一个数组中访问一个值,而这个数组的索引并不存在(要么太大要么太小),java就会抛出ArrayIndexOutOfBoundsException。我们可以利用这个事实在第二个catch块中捕捉这个错误,它可以通过以下方式附加到你的代码中:

...
} 
catch (InputMismatchException e) {
  System.out.println("\nAn error occured: You cannot enter any character or symbol other than a valid number for the row and column of the chosen seat for booking. " + e); 
} //...
catch (ArrayIndexOutOfBoundsException e) {
  System.out.println("your other error message");
  // or....
  throw new ArrayInputMismatchException("your message");
}
...

相关问题