【问题标题】:Java null pointer Exception Error in Objects对象中的Java空指针异常错误
【发布时间】:2015-04-07 18:12:46
【问题描述】:

我用对象编写了一个程序,当我尝试运行它时出现 NullPointerException 错误,但我无法发现我的代码的确切问题。这是(粗线是日食指向错误的位置):

public class Cinema {
    private String cinemaName;
    private String Address;
    private Room Rooms[];
    private Movie Movies[];
    private final int MAX_NUM_MOVIES = 20;
    private final int MAX_NUM_ROOMS = 5;
    private int movieCounter;
    private int roomCounter;

    public Cinema(String cinemaName, String Address) {
        this.cinemaName = cinemaName;
        this.Address = Address;
        Room Rooms[] = new Room[MAX_NUM_ROOMS];
        @SuppressWarnings("unused")
        Movie Movies[] = new Movie[MAX_NUM_MOVIES];
        movieCounter = 0;
        roomCounter = 0;
    }

    public boolean addMovieToCinema (Movie theMovie) {
        if (theMovie == null) {
            return false;
        }
        if (movieCounter < MAX_NUM_MOVIES) {
            Movies[movieCounter] = new Movie(theMovie);
            movieCounter++;
            return true;
        } else
            return false;
    }
}

有什么想法吗?

【问题讨论】:

  • 您不必用代码“找出确切的问题”。您可以查看堆栈跟踪,它会告诉您问题发生的确切位置。
  • Eclipse 告诉您您正在使用未初始化的Movies 变量。从那里开始,您的实际问题应该是为什么我的变量没有初始化?,并且已经得到解答。
  • 你知道你为什么放@SuppressWarnings("unused")吗?如果您不知道警告在告诉您什么,为什么不尝试理解而不是告诉它闭嘴呢? :D 这实际上是你的问题的原因。
  • 在 NPE 上发布堆栈跟踪。

标签: java object methods error-handling nullpointerexception


【解决方案1】:

一种选择是在声明数组时分配内存:

private Room[] Rooms = new Room[MAX_NUM_ROOMS];

或者,如果你想在你的构造函数中分配内存,你需要:

Rooms = new Room[MAX_NUM_ROOMS];

【讨论】:

    【解决方案2】:

    我认为错误出现在您的 Cinema 类的构造函数中。 它应该是这样的:

       public Cinema(String cinemaName, String Address) {
        this.cinemaName = cinemaName;
        this.Address = Address;
    // Remove type before variable to initialize class attribute instead of declaring a new varialble
        Rooms = new Room[MAX_NUM_ROOMS];
        @SuppressWarnings("unused")
    // Remove type before variable to initialize class attribute instead of declaring a new varialble
        Movies = new Movie[MAX_NUM_MOVIES];
        movieCounter = 0;
        roomCounter = 0;
    }
    

    类属性将被初始化,NullpointerException 应该消失。

    干杯, 塞巴斯蒂安。

    【讨论】:

      【解决方案3】:

      而不是定义这个:

      private Room Rooms[];
      private Movie Movies[];
      

      为什么你只定义一个集合!?喜欢:

      private Collection<Room> rooms;
      private Collection<Movie> movies;
      

      然后,在您的构造函数中,您必须初始化您的集合:

      this.rooms = new ArrayList<>();
      this.movies = new ArrayList<>();
      

      我会说这是 Java 方式。还要记住,属性名称应该是小写的。

      【讨论】:

      • 这并不是对问题的真正回答,而是附注。你应该把它放在评论中。不过,我同意你的看法。
      • 如果 OP 用你的代码替换了他的代码,他将不得不替换更多的代码才能编译。但事实上,我没有看到你处理过初始化问题。
      • 是的。这只是一个提示。
      • 没错,但鉴于 OP 对 Java 的了解,也许您应该提供更多信息 ;-) 无论如何,请支持我。
      【解决方案4】:

      问题是你的构造函数隐藏了你的类成员。

      如果你声明private Movie Movies[];,那么在你的构造函数中你应该写:Movies = new Movie[MAX_NUM_MOVIES];

      当你写:Movie Movies[] = new Movie[MAX_NUM_MOVIES]; 时,你实际上声明了一个新变量,它是构造函数的本地变量,这就是类成员 Movies 为 null 的原因,因为初始化的不是它。

      【讨论】:

        【解决方案5】:

        这两个数组应该是类字段

        private int movieCounter;
        private int roomCounter;
        private Room[] Rooms = new Room[MAX_NUM_ROOMS];
        private Movie[] Movies = new Movie[MAX_NUM_MOVIES];
        
        public Cinema(String cinemaName, String Address) {
          this.cinemaName = cinemaName;
          this.Address = Address;
          movieCounter = 0;
          roomCounter = 0;
        }
        

        为什么不使用列表来存储电影(和房间)?您不必提供硬编码限制。

        List<Movie> movies = new ArrayList<>();
        
        public boolean addMovieToCinema(Movie theMovie) {
            if (theMovie == null) {
                return false;
            }
            movies.add( theMovie );
            return true;
        }
        

        一切都变得简单了。

        【讨论】:

          【解决方案6】:

          而不是分配给这两个成员变量:

          private Room Rooms[];
          private Movie Movies[];
          

          你用这两行声明新的局部变量:

          Room Rooms[] = new Room[MAX_NUM_ROOMS];
          Movie Movies[] = new Movie[MAX_NUM_MOVIES];
          

          修复它们以初始化您的 RoomsMovies 类成员:

          Rooms = new Room[MAX_NUM_ROOMS];
          Movies = new Movie[MAX_NUM_MOVIES];
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-03-06
            • 2011-08-07
            • 2021-04-22
            • 1970-01-01
            • 2021-11-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多