在方法中使用linkedlist给出';无法解析';错误,java

在方法中使用linkedlist给出';无法解析';错误,java,java,Java,我有以下snake.snakeMove(点、左方向、右方向、上方向、下方向、点大小)

我有以下
snake.snakeMove(点、左方向、右方向、上方向、下方向、点大小)private SnakeLinkedList snake=new SnakeLinkedList()初始化了snake。然而,在我的SnakeLinkedList类中,snakeMove方法给了我一个错误
snake无法解决

public void snakeMove(int dots, boolean left, boolean right, boolean up, boolean down, final int SIZE) {



     for (int z = dots; z >0; z--) {
       snake.getJoint(z).setX(snake.getJoint(z-1).getX());
     }

     if(left) {
       snake.getHead().setX(snake.getHead().getX() - SIZE);
     }

     if(right) {
       snake.getHead().setX(snake.getHead().getX() + SIZE);
     }

     if(up) {
       snake.getHead().setY(snake.getHead().getY() - SIZE);
     }

     if(down) {
       snake.getHead().setY(snake.getHead().getY() + SIZE);
     }
 }
如何访问snake或在snake linkedlist上执行操作而不发生错误

SnakeLinkedList.java:

package com.zetcode;

import java.awt.Color;

public class SnakeLinkedList {
SnakeNode head = null;

public void addHead(int x, int y, Color c) {
head = new SnakeNode(x, y, c);
}

public void addJoint(int x, int y, Color c) {
SnakeNode newJoint = new SnakeNode(x, y, c);
newJoint.setNext(head.getNext());
head.setNext(newJoint);
}

public void addTail(Color c) {
SnakeNode curr = head;
while (curr.getNext() != null) {
curr = curr.getNext();
}
SnakeNode newJoint = new SnakeNode(curr.getX() + 10, curr.getY() + 10, c);
curr.setNext(newJoint);
}

public SnakeNode getHead() {
return head;
}

public SnakeNode getJoint(int i) {
SnakeNode curr = head;
for (int k = 0; k < i; k++) {
  curr = curr.getNext();
}
return curr;
}


public void addFirst(SnakeNode node) {
node.setNext(head);
head = node;
}

public void addLast(SnakeNode node) {
if (head == null) {
  head = node;
  return;
}

SnakeNode curr = head;
while (curr.getNext() != null) {
  curr = curr.getNext();
}
curr.setNext(node);
}

public void snakeMove(int dots, boolean left, boolean right, boolean up, 
boolean down, final int SIZE) {

     for (int z = dots; z >0; z--) {
       this.getJoint(z).setX(this.getJoint(z-1).getX());
     }

     if(left) {
       this.getHead().setX(this.getHead().getX() - SIZE);
     }

     if(right) {
       this.getHead().setX(this.getHead().getX() + SIZE);
     }

     if(up) {
       this.getHead().setY(this.getHead().getY() - SIZE);
     }

     if(down) {
       this.getHead().setY(this.getHead().getY() + SIZE);
     }
 }
BOARD.JAVA中的相关代码片段:

  private SnakeLinkedList snake = new SnakeLinkedList();
 private Color[] colours = {Color.BLUE, Color.YELLOW, Color.GREEN};



 public void actionPerformed(ActionEvent e) {

    if (inGame) {

        checkApple();
        checkCollision();
        snake.snakeMove(dots, leftDirection, rightDirection, upDirection, downDirection, DOT_SIZE);
        //move();
    }

    repaint();
}

您需要使用
SnakeLinkedList
中的
getHead()
方法中的
head
访问列表,并确保在调用
addHead()
方法之前分配了head

此外,我还添加了check
if(head==null)返回snakeMove()
中进行code>以确保头部不为空

像这样

public void snakeMove(int dots, boolean left, boolean right, boolean up, boolean down, final int SIZE) {
     if (head == null) return;
     for (int z = dots; z >0; z--) {
       getJoint(z).setX(snake.getJoint(z-1).getX());
     }

     if(left) {
       getHead().setX(snake.getHead().getX() - SIZE);
     }

     if(right) {
       getHead().setX(snake.getHead().getX() + SIZE);
     }

     if(up) {
       getHead().setY(snake.getHead().getY() - SIZE);
     }

     if(down) {
       getHead().setY(snake.getHead().getY() + SIZE);
     }
 }
,及更新

public SnakeNode getJoint(int i) {
SnakeNode curr = head;
for (int k = 0; k < i && curr !=null ; k++) {
  curr = curr.getNext();
}
return curr;
}
publicsnakenodegetjoint(inti){
蛇形管电流=水头;
对于(int k=0;k
您需要使用
SnakeLinkedList
中的
getHead()
方法中的
head
访问列表,并确保在调用
addHead()
方法之前分配了head

此外,我还添加了check
if(head==null)返回snakeMove()
中进行code>以确保头部不为空

像这样

public void snakeMove(int dots, boolean left, boolean right, boolean up, boolean down, final int SIZE) {
     if (head == null) return;
     for (int z = dots; z >0; z--) {
       getJoint(z).setX(snake.getJoint(z-1).getX());
     }

     if(left) {
       getHead().setX(snake.getHead().getX() - SIZE);
     }

     if(right) {
       getHead().setX(snake.getHead().getX() + SIZE);
     }

     if(up) {
       getHead().setY(snake.getHead().getY() - SIZE);
     }

     if(down) {
       getHead().setY(snake.getHead().getY() + SIZE);
     }
 }
,及更新

public SnakeNode getJoint(int i) {
SnakeNode curr = head;
for (int k = 0; k < i && curr !=null ; k++) {
  curr = curr.getNext();
}
return curr;
}
publicsnakenodegetjoint(inti){
蛇形管电流=水头;
对于(int k=0;k
方法中存在问题,
getJoint
。除非您选中curr.getNext()=null
,您将从调用
getJoint(z).setX(snake.getJoint(z-1).getX())
中获得
NullPointerException

按如下方式操作:

public SnakeNode getJoint(int i) {
    SnakeNode curr = head;
    for (int k = 0; k < i && curr.getNext()!=null; k++) {
        curr = curr.getNext();
    }
    return curr;
}
publicsnakenodegetjoint(inti){
蛇形管电流=水头;
对于(int k=0;k
方法中存在问题,
getJoint
。除非您选中curr.getNext()=null
,您将从调用
getJoint(z).setX(snake.getJoint(z-1).getX())
中获得
NullPointerException

按如下方式操作:

public SnakeNode getJoint(int i) {
    SnakeNode curr = head;
    for (int k = 0; k < i && curr.getNext()!=null; k++) {
        curr = curr.getNext();
    }
    return curr;
}
publicsnakenodegetjoint(inti){
蛇形管电流=水头;
对于(int k=0;k
当您声明
SnakeLinkedList
对象时,它与方法所在的类是同一个类?您能否共享导致此问题的完整代码段?从这个问题上看,你在哪里声明了这些方法,以及你在这些变量中使用了什么修饰符并不十分明显。不,这个方法在不同的类中,即board.java@sc0der@AjayKrChoudhary我无法将整个代码放入其中的原因是,该方法位于SnakeLinkedList类中,而snake的初始化是在另一个名为board.java的类中完成的,在该类中调用该方法。@如果该类是静态的,则可以通过类名访问这些元素;如果列表不是静态的,则可以通过实例访问这些元素静态在声明
SnakeLinkedList
对象的地方,该对象与该方法所在的类是同一个类?能否共享导致此问题的完整代码段?从这个问题上看,你在哪里声明了这些方法,以及你在这些变量中使用了什么修饰符并不十分明显。不,这个方法在不同的类中,即board.java@sc0der@AjayKrChoudhary我无法将整个代码放入其中的原因是,该方法位于SnakeLinkedList类中,而snake的初始化是在另一个名为board.java的类中完成的,在该类中调用该方法。@如果该类是静态的,则可以通过类名访问这些元素;如果列表不是静态的,则可以通过实例访问这些元素通过@sc0der实现正确方法后解决了我的问题非常感谢这通过@sc0der实现正确方法后解决了我的问题非常感谢这些建议不供进一步讨论;此对话已结束。评论不用于扩展讨论;这段对话已经结束。