Java NullPointerException,使用数组预订座位

Java NullPointerException,使用数组预订座位,java,arrays,exception,multidimensional-array,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) 我不知道我做错了什么。我一直在用数组预订座位。我想预订一个座位

有人能查一下这个代码吗?我一直收到这个错误

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"));
    }
}
成套工程;
导入java.util.*;
导入java.io.*;
公共类项目{
静态字符串MSR[][]=新字符串[10][3],名称,座位号,保留;
静态扫描仪用户=新扫描仪(System.in);
静态布尔IsEmpty(){
对于(int i=0;i<10;i++){
对于(int j=0;j<3;j++){
如果(MSR[i][1]!=null){
返回false;
}
}
}
返回true;
}
静态布尔值IsFull(){
对于(int i=0;i<10;i++){
对于(int j=0;j<3;j++){
if((MSR[i][2])==null){
返回false;
}
}
}
返回true;
}
静态void ReserveSeat()引发IOException{
PrintWriter保存=新的PrintWriter(“MovieSeats.txt”);
如果(IsFull()){
System.out.println(“所有座位都被占用”);
}
否则{
系统输出打印(“将座位号输入预留:”);
SeatNo=user.next();
if(等容量(SeatNo)){
int RSeatNo=Integer.parseInt(SeatNo);
MSR[RSeatNo][1]=SeatNo;
保存。打印(SeatNo);
系统输出打印(“输入名称:”);
Name=user.next();
MSR[RSeatNo][0]=名称;
保存。打印(名称);
保留=“X”;
MSR[RSeatNo][2]=保留;
保存。打印(保留);
}
否则{
系统输出打印项次(“座位已被占用”);
}
}
}
静态布尔等容座(弦座){
对于(int i=0;i<10;i++){
对于(int j=0;j<3;j++){
如果(MSR[i][1]。等于(席位)){
MSR[i][2]=“X”;
返回true;
}
}
}
返回false;
}
静态void displayList(){
字符串行=null;
尝试
{
/*FileReader以默认编码读取文本文件*/
FileReader FileReader=newfilereader(“MovieSeats.txt”);
/*始终将文件读取器包装在BufferedReader中*/
BufferedReader BufferedReader=新的BufferedReader(文件阅读器);
而((line=bufferedReader.readLine())!=null)
{
系统输出打印项次(行);
}
/*使用后始终关闭文件*/
bufferedReader.close();
}
捕获(IOE异常)
{
System.out.println(“读取文件名时出错”);
}
}
公共静态void main(字符串[]args)引发IOException{
字符串yn;
做{
System.out.println(“\t\t移动座位预订”);
System.out.println(“===========================================================================================”);
System.out.println(“\t\tA.Reserve Seat”);
System.out.println(“\t\tB.取消预订座位”);
System.out.println(“\t\tD.预留座位显示列表”);
System.out.println(“\t\tE.Clear Seats”);
System.out.println(“\t\tF.Quit”);
System.out.println(“===========================================================================================”);
System.out.println();//空格
System.out.print(“输入有效输入:”);
字符串选择=user.next();
开关(choice.toUpperCase()){
案例“A”:
预留座位();
打破
案例“B”:
打破
案例“C”:
打破
案例“D”:
显示列表();
打破
案例“E”:
打破
案例“F”:
系统出口(0);
打破
违约:
System.err.println(“输入无效,请重试”);
打破
}
System.out.print(“您想再试一次吗?”);
yn=user.next();
}
而(Y);;
}
}

isocupied
方法的if块中,使用
Seat.equals(MSR[i][1])
而不是使用
MSR[i][1]。equals(Seat)
。数组元素最初为null,当尝试执行
equals
方法时,这会在此行生成NullPointerException。

下面的代码行
if(MSR[i][1].equals(Seat))
方法中的
IsOcupied
抛出
NullPointerException
。您正在
MSR[i][1]
上调用
.equals
方法,该方法包含
null

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

static boolean isocupied(字符串座){
对于(int i=0;i<10;i++){
对于(int j=0;j<3;j++){
如果(MSR[i][1]!=null&&MSR[i][1]。等于(座位)){
MSR[i][2]=“X”;
返回true;
}
}
}
返回false;
}
将首先计算
null
检查,因此如果
MSR[i][1]!=null
返回false,则不会计算AND(&&)运算符的右侧操作数。这意味着您将不再在null上检查
.equals

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