java - NullPointerException,使用数组预订座位

标签 java arrays exception multidimensional-array

有人可以看看这段代码吗?我收到此错误

Exception in thread "main" java.lang.NullPointerException
at project.Project.IsOccupied(Project.java:80)
at project.Project.ReserveSeat(Project.java:51)
at project.Project.main(Project.java:142) 

我不知道我做错了什么。我一直在使用数组来预订座位。我正在尝试预订座位,并检查输入的座位号是否已被占用,或者是否所有座位都已被占用。

package project;

import java.util.*;
import java.io.*;

public class Project {

    static String MSR[][] = new String [10][3], Name, SeatNo, Reserved;
    static Scanner user = new Scanner(System.in);

    static boolean IsEmpty(){
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 3; j++) {
                if (MSR[i][1] != null) {
                    return false;
                }
            }
        }
       return true;
    }

    static boolean IsFull(){
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 3; j++) {
                if ((MSR[i][2]) == null) {
                    return  false;
                }
            }
        }
        return true;
    }

    static void ReserveSeat()throws IOException{
        PrintWriter save = new PrintWriter("MovieSeats.txt");
        if(IsFull()){
            System.out.println("All seats are occupied");
        }
        else {
            System.out.print("Enter seat number to reserved: ");
            SeatNo = user.next();
            if (IsOccupied(SeatNo)) {
                int RSeatNo = Integer.parseInt(SeatNo);
                MSR[RSeatNo][1]=SeatNo;
                save.print(SeatNo);

                System.out.print("Enter name: ");
                Name=user.next();
                MSR[RSeatNo][0]=Name;
                save.print(Name);

                Reserved="X";
                MSR[RSeatNo][2]=Reserved;
                save.print(Reserved);
            }
            else {
                System.out.println("Seat is occupied");
            }
        }
    }

    static boolean IsOccupied(String Seat) {
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 3; j++) {
                if (MSR[i][1].equals(Seat)) {
                    MSR[i][2]="X";
                    return true;
                }
            }
        }
        return false;
    }

    static void displayList(){
        String line = null;
    try
    {
        /* FileReader reads text files in the default encoding */
        FileReader fileReader = new FileReader("MovieSeats.txt");

        /* always wrap the FileReader in BufferedReader */
        BufferedReader bufferedReader = new BufferedReader(fileReader);

        while((line = bufferedReader.readLine()) != null)
        {
            System.out.println(line);
        }

        /* always close the file after use */
        bufferedReader.close();
    }
    catch(IOException e)
    {
        System.out.println("Error reading file name");
    }
    }

    public static void main (String[]args) throws IOException {
        String yn;

       do{
           System.out.println("\t\tMOVIE SEAT RESERVATION");
           System.out.println("===========================================================");
           System.out.println("\t\tA. Reserve Seat");
           System.out.println("\t\tB. Cancel Reserve Seat");
           System.out.println("\t\tD. Display List of Reserved Seat ");
           System.out.println("\t\tE. Clear Seats");
           System.out.println("\t\tF. Quit");
           System.out.println("===========================================================");

           System.out.println();//SPACE

           System.out.print("Enter a valid input: ");
           String choice = user.next();

           switch(choice.toUpperCase()){
               case "A":
                   ReserveSeat();
               break;
               case "B":
               break;
               case "C":
               break;
               case "D":
                   displayList();
               break;
               case "E":

               break;
               case "F":
                   System.exit(0);
               break;
               default:
                   System.err.println("Invalid Input, Please try again.");
               break;
           }

           System.out.print("Do you want to try again? ");
           yn= user.next();
       }
       while(yn.equalsIgnoreCase("Y"));
    }
}

最佳答案

IsOcupied 方法中的以下代码行 if (MSR[i][1].equals(Seat)) 会引发 NullPointerException。您正在调用 MSR[i][1] 上的 .equals 方法,其中包含 null

在调用 .equals 之前,您必须为该元素分配一个值。您可以检查该元素是否为null,如果是,则返回false(=座位尚未被占用)。

static boolean IsOccupied(String Seat) {
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 3; j++) {
                if (MSR[i][1] != null && MSR[i][1].equals(Seat)) {
                    MSR[i][2]="X";
                    return true;
                }
            }
        }
        return false;
    }

将首先评估 null 检查,因此如果 MSR[i][1] != null 返回 false,则 AND (&& ) 运算符不会被评估。这意味着您将不再检查 .equals 是否为 null。

关于java - NullPointerException,使用数组预订座位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59115390/

相关文章:

java - 更新我的表时出错

java - java中的离散余弦变换(DCT)

exception - 代号一中的布局和运行时错误

c# - 在哪里存储 Web 服务异常?

python - 了解 Python 中引发异常时的范围

java - 知道找到了正则表达式的哪个关键字

java - 立即获取日期和时间

java - Cipher 对象是否可重用?

java - Java 中复制/合并数组的性能

javascript - 创建 JSON 格式