【问题标题】:NullPointerException, can't find reason even after researchNullPointerException,即使经过研究也找不到原因
【发布时间】:2017-03-20 19:48:14
【问题描述】:

我在 Java 中创建典型的卡片/甲板类时遇到了困难。我已经阅读了一些类似的问题和答案,但要么它们不相关/没有帮助,要么我还不能简单地理解它。 这是代码

public class Cards {
    boolean isAvailable;
    int card_id;
    static final int AC = 32;
    public Cards [] deck = new Cards[AC];

    public void set () {
        int a = 0;
        for (int i = 0; i < AC; i++) {
            if(a == 4) a = 0;
            deck[i].isAvailable = true;     // <---------
            deck[i].card_id = i + (a * 101);    // <---------
            a++;
        }   
    }
    public void read () {
        for (int i = 0; i < AC; i++) 
        System.out.println(deck[i].isAvailable + "  " + deck[i].card_id);
    }
    public static void main (String[] args) {
        Cards c = new Cards();
        c.set();
        c.read();       
    }
}

线程“main”中的异常 java.lang.NullPointerException
在 Cards.set(Cards.java:13)
在 Cards.main(Cards.java:24)

1。 我读过类似的问题,发现问题可能出在数组的初始化中,我尝试对我的 prog 做同样的事情,但它还是坏了。

我标记了第 13 行和第 14 行,因为它们被指向(当我注释第 13 行只是为了检查时,指针设置到下一行)。

2。 我想从您那里获得的下一部分帮助是: 即使有 main (用于培训目的),我看到其他班级使用这个班级(它只是创建甲板)所以我想我不需要 main ......除了第一点的 probs 之外一切都设置好了吗?

【问题讨论】:

  • 在哪里您在数组初始化方面“尝试过做同样的事情”?我看不到您将 deck[i] 设置为值的任何地方...
  • 当您的代码中有错误时,我建议使用您的调试器。这就是它的用途。
  • 我建议您将Card 单独作为一张卡片,将Cards 作为卡片集合分开。目前每张卡片里面都有 52 张卡片的数组,这没有意义(尤其是因为每张卡片都有 52 张卡片等)

标签: java arrays class


【解决方案1】:

很简单:

public Cards [] deck = new Cards[AC];

创建一个 empty 数组,其中包含 Cards 对象的 AC 插槽数。

现在您必须在每个插槽中放置一个非空 Cards 对象!

但问题是:实际上你的抽象被破坏了。

您编写的代码似乎将 一张 卡片与 卡片组 相同 - 通过将卡片的 array 添加到您的卡类!这实际上很难修复您当前的代码。作为解决此问题的“正常”方法是添加一个构造函数,如

public Cards() {
  deck = new Cards[AC];
  for (int i=0; i<deck.length;i++) {
    deck[i] = new Cards();
}

如果你尝试这样做......你立即会遇到无休止的递归(创建 一个 新卡将导致创建 AC 新卡(以填充数组);很快就会导致堆栈溢出。

因此,真正的答案在以下几条线的某个地方:

public class Card {
  ... a class that represents a SINGLE card in your game

然后

public card GameOfCards {
  ... a class that (for example!) uses an array to hold n objects of class Card!

最后,正如彼得在他的评论中指出的那样:你应该学会使用调试手段自己解决这些问题。一种好方法:在使用任何数据结构之前,对其进行迭代并打印出其内容。或者更好的是,学习如何使用调试器,并逐步完成您的代码!您应该明白:这是非常基本的东西;你通常不应该在这里提出。

【讨论】:

  • 使用调试器会很快证明这一点+1
  • @PeterLawrey 我更专注于提高答案的“超越问题”质量;但当然,你对“他应该如何调试这个”是正确的;-)
  • 我同意卡片与一张卡片的分离。对不起,我不能投票两次。我不会称它为 Set,因为 Deck 通常是像 LinkedHashSet 那样的有序集合,但大多数 Set 不是。
  • @PeterLawrey 我也在为这个名字而苦苦挣扎。刚刚改了,希望你喜欢这个新名字 ;-) ...而且不需要道歉。你知道,可以投票两次的人......将是那些周围有一个upvoter-sockpuppet的人。我们都是通情达理的成年人。所以我们没有这些。但是,当然,如果你喜欢我的东西,我现在得到了 1185 个答案;而且我很确定该集合中的许多高质量答案尚未被您投票;-)
  • 当然可以。我只是希望你会不小心点赞我最近提出的一些问题,因为我认为我很难传达他们的质量的伟大......扼杀了我连续的积极回答得分...
猜你喜欢
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 2023-02-11
  • 1970-01-01
相关资源
最近更新 更多