Java 在存储到数组中时跳过一个值

Java 在存储到数组中时跳过一个值,java,arrays,class,Java,Arrays,Class,有人能帮我查一下吗 错误: java.lang.NullPointerException 如何删除此错误 我的主要班级: public class deck { public static void main(String[] args) { Deck app = new Deck(); app.Deck(); } } 我的甲板班: public class Deck { public int TOTALCARDS;

有人能帮我查一下吗

错误

java.lang.NullPointerException
如何删除此错误

我的主要班级:

public class deck {

    public static void main(String[] args) {
        Deck app = new Deck();
        app.Deck();
    }

}
我的甲板班:

    public class Deck {
    public int TOTALCARDS;
    Card[] d;
    public int nH;


    public void createDeck() {
            String[] suitsArray = new String[4];

            for(int i=0; i<numArray.length; i++) {
                numArray[i] = i+1;
            }

            for (int i=0; i<13; i++) { 
                if (i!=11){
                deck[i+25] = new Card(suitsArray[2], i+1);
                }
                else if(i > 10){
                    deck[i+25] = new Card(suitsArray[2], i+1);
                }
                }
    for (int i=0; i<13; i++) {
        deck[i+25].display();
    }
}
公共类甲板{
公共信用卡;
卡片[]d;
新罕布什尔州公共交通局;
公共void createDeck(){
字符串[]suitsArray=新字符串[4];

对于(inti=0;iEDIT):您的卡大小是51…应该是52

if (i!=11){
    deck[i+25] = new Card(suitsArray[2], i+1);
}
else if(i > 11){
    deck[i+25] = new Card(suitsArray[2], i+1);
}
这不符合逻辑,如果i=11,你什么也不做怎么办

i!=11 =  false and i > 11 == false;
这意味着else if(i>11)将永远不会执行。 你的代码也做了同样的事情

如果您试图初始化所有52张卡,您可以执行以下操作:

for (int i=0;i<deck.size;i++) {
   deck[i] = new Card(suitsArray[i/13], numArray[i % 13]);

这是因为您在数据组[11]中的值为空,因为您跳过了在该索引中放置卡的实例

编辑:
[应该是deck[i+25]]
,其中
i=11


关于指向变量单词为空的答案是NPE的原因。我对此表示怀疑。我在我的机器中尝试了该代码,但它没有给我NPE。(另请参见)

编辑:请参见下面Kick Buttowski的评论,这充其量只是部分答案


您正在调用
Card.display()

问题在于:

public String getTitle(){
    String displayTitle = suit + words; // <-- Problem
    if (number == 1){
        words = " Ace";
    }
    // ...
或者,由于(据我们所知)
单词
仅在
display()
中使用,请将其移到此处:

public void display() {
    String words = ""; // Still need to be initialised
    // ...

你能给出异常回溯吗,它非常有用。回溯会给出一个行号…这将是非常好的,因为我在你发布的内容中看不到空指针的空间。另外,这是你在哪里/如何声明
deck
?你似乎遗漏了相关的代码。这里没有足够的信息告诉NPE可以在哪里发布我的直觉是它来自于你的
构造函数,但我不能确定。这里没有任何东西会导致NPE(前提是
卡组
是实际实例化的)@KickButtowski:毫无疑问。但在我们得到答案之前,这个问题是完全无法回答的。我很抱歉代码不清楚,因为我是第一次问关于stackoverflow的问题。为什么你的文章的第一个代码片段没有加起来?你能解释一下吗?我正试图忽略心后。正如我的任务告诉我的那样。我把这个代码放在第二部分尝试帮助跳过该值。@FrezzeyTsuna您可以同时发布您的驱动程序类吗?@FrezzeyTsuna您是否在此处发布了甲板类的完整代码?此答案的哪一部分解决了NPE?您可以通过声明默认为空字符串的
words
修复此问题
public string words=“”
。我想你应该在你的答案中加上这一点。我真的怀疑这是答案。我从来没有听到过字符串抛出nullpointerexception@KickButtowski你说得对,
null
字符串如果只是级联的话就不会有问题。虽然这可能是预期的行为,但事实并非如此。但是代码是
if(i!=11){…}else if(i>10){…}
。当i=11时,else分支被输入,并且它确实在
deck[i+25]
.hmmm中创建了一张卡。原始条件是如果(i>11)。(请参见KevH的答案)是的,通过编辑,它看起来好像更改了几次
for (int i=0, j=0;j<deck.length;i++) {
    if ((i/13) == 2 && (i%13) == 11)
        continue;
    deck[j++] = new Card( suitsArray[i/13], (i % 13));
}
public String getTitle() {

        return suit + " " + titles[number];

}
for (int i=0; i<13; i++) {
    deck[i+25].display();
}
public void display(){
    System.out.println("< " + getTitle() + " >");
}
public String getTitle(){
    String displayTitle = suit + words; // <-- Problem
    if (number == 1){
        words = " Ace";
    }
    // ...
public class Card {
    // ...
    String words = "";
public void display() {
    String words = ""; // Still need to be initialised
    // ...