Java Pathfinding Project

I’m doing a project at my school where I make different path finding algorithms and compare them based on their solution, the time it took to get a solution, and the size of their closed sets (my way of measuring how much memory they were taking up). however I am having trouble with my path finder. it finds a path that does solve the maze but it isn’t a correct path. for instance, using the Dikista algorithm it should just go straight diagonal across an empty maze but it goes in all sorts of weird directions. I think the problem happening when the program changes the ‘cameFrom’ of a node but i can’t figure out what is causing it to mess up.

here is my path finding class. it says AStar as its name but i changed it to a dikista algorithm by just making a nodes ‘h’ function return 0. the getData function is just for ease of reading information from the class

Thank you for your help

package main;

import java.util.PriorityQueue;
import java.util.ArrayList;
import java.awt.Point;

public class AStarPathFinder_Euclidian implements HasData {

public static final int SAVE_LOCATION = 2;
private Field field;
private double time;
private PriorityQueue<Node> openSet;
private ArrayList<Node> closedSet;
private ArrayList<Point> solution;

AStarPathFinder_Euclidian(Field f){
    openSet = new PriorityQueue<Node>();
    closedSet = new ArrayList<Node>();
    solution = new ArrayList<Point>();
    field = f;
    closedSet.add(new Node(f.startPoint.x,f.startPoint.y,null));

    Node currN = closedSet.get(0);

    time = System.currentTimeMillis();


    while(!(currN.toPoint().equals(f.endPoint))){
        System.out.println("testing [" + currN.getX()+","+currN.getY()+"]");
        Point[] pl = getAdjPoints(currN);
        System.out.println("going thorugh points list");
        for(Point n : pl){
            if(n != null){
                System.out.print("n NOT equal to null: ");
                Node tn = new Node(n.x, n.y, currN);
                
                //add nodes to openset that are not in openset
                if(!openSet.contains(tn)){
                    openSet.offer(tn);
                    System.out.println("added to openSet");
                
                    
                //test to see if a node would have a smaller gScore if
                //its came from was set to currN, if not then it reverts
                //to its original camefrom
                }else{

                    Node orig = null;
                    Node[] Narray = new Node[openSet.size()];
                    Narray = openSet.toArray(Narray);
                    for(Node e : Narray){
                        if(e.equals(tn)){
                            orig = e;
                            openSet.remove(e);
                        }
                    }

                    if(orig!=null){
                        tn.setCameFrom(orig.getCameFrom());
                        openSet.offer(tn);
                        System.out.println("mChange, ");
                    }

                }
            }else{
                System.out.println("n was equal to null");
            }
        }

        System.out.println();

        currN = openSet.poll();
        closedSet.add(currN);
    }

    while(currN.getCameFrom() != null){
        currN = currN.getCameFrom();
        solution.add(0,currN.toPoint());
    }
    time = System.currentTimeMillis()-time;
}

private Point[] getAdjPoints(Node o){
    System.out.println("getting adjacent points");
    Point tn;
    Point[] rl = new Point[8];
    //for(int i = 0; i<rl.length; i++){
    int counter = 0;
    for(int x = -1; x<2; x++){
        for(int y = -1; y<2; y++){
            if(!(x == 0 && y == 0)){
                //System.out.println(x+","+y);
                tn = new Point(o.getX()+x, o.getY()+y);
                if(field.getCharAt(tn)==Field.WALL_CHARACTER || closedSet.contains(new Node(tn.x, tn.y, null))){
                    System.out.println("set "+counter+" equal to null");
                    rl[counter]=null;
                    // rl*=null;
                }else{
                    System.out.println("set "+counter+" equal "+tn);
                    rl[counter]=tn;
                    //rl* = tn;
                }
                counter++;
            }
            
        }

        //}
    }
    System.out.println();
    return rl;
}

public Data getData() {
    Point[] rSolution = new Point[1];
    Point[] rClosedSet = new Point[1];
    ArrayList<Point> tempArrL = new ArrayList<Point>();
    for(Node n : closedSet){
        tempArrL.add(n.toPoint());
    }
    rSolution = solution.toArray(rSolution);
    rClosedSet = tempArrL.toArray(rClosedSet);
    return new Data(SAVE_LOCATION, field, time,rClosedSet,rSolution);
}

private class Node implements Comparable<Node> {

    public static final int DIAGONAL_DISTANCE = 14;
    public static final int ADJACENT_DISTANCE = 10;

    private int x;
    private int y;
    private double hScore; //heuristic score to goal
    private double gScore; // distance travelled
    private Node cameFrom;
    private double fScore;

    Node(int x, int y, Node cameFrom){
       this.cameFrom = cameFrom;
       this.x = x;
       this.y = y;
       gScore = calcG(cameFrom);
       hScore = calcH(this);
       fScore = calcF();
    }

    private double calcF(){
        return getGScore()+getHScore();
    }

    private double calcG(Node o){
        if(cameFrom == null){
           return 0;
       }else{
           double g = o.getGScore();
           if(isDiagonalTo(o)){
               g += DIAGONAL_DISTANCE;
           }else{
               g += ADJACENT_DISTANCE;
           }

           return g;
       }
    }
    //euclidian
    private double calcH(Node o){
        return 0;
        //return Point.distance(o.getX(), o.getY(), field.startPoint.x, field.startPoint.y);
    }

    public int getX(){
        return x;
    }

    public int getY(){
        return y;
    }

    public double getGScore(){
        return gScore;
    }

    public double getHScore(){
        return hScore;
    }

    public double getFScore(){
        return fScore;
    }

    public Node getCameFrom(){
        return cameFrom;
    }

    public void setCameFrom(Node o){
        Node tempCameFrom = cameFrom;
        double tempGScore = gScore;
        cameFrom = o;
        gScore = calcG(o);
        if(gScore>tempGScore){
            gScore = tempGScore;
            cameFrom = tempCameFrom;
        }
    }

    public Point toPoint(){
        return new Point(x,y);
    }

    /*
    public boolean isNextTo(Node o){
        int difX = Math.abs(x)-Math.abs(o.getX());
        int difY = Math.abs(y)-Math.abs(o.getX());
        if(difX >= -1 && difX <= 1 && difX != 0 &&
                difY >= -1 && difY <= 1 && difY != 0){
            return true;
        }else{
            return false;
        }
    }
    */

    private boolean isDiagonalTo(Node o){
        if(o.getX() != x && o.getY() != y){
            return true;
        }else{
            return false;
        }
    }

    @Override
    public boolean equals(Object o){
        if(o instanceof Node){
            Node a = (Node)o;
            if(a.toPoint().equals(toPoint())){
                return true;
            }else{
                return false;
            }
        }else{
            return false;
        }
    }

    public int compareTo(Node o) {
        if(fScore>o.getFScore()){
            return -1;
        }else if(fScore<o.getFScore()){
            return 1;
        }else{
            return 0;
        }
    }

}

}