I am using intellij for the java coursework which is related to clients and databases.

I am receiving the following error

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.net.URL.toExternalForm()" because "location" is null
    at java.desktop/javax.swing.ImageIcon.<init>(ImageIcon.java:232)
    at client.Interface.$$$setupUI$$$(Interface.java)
    at client.Interface.<init>(Interface.java:54)
    at client.Application.main(Application.java:317)

This is the code:

`

` package client;



//region LIBRARIES USED
//Java Libraries:
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.OrientationRequested;
import javax.swing.*;
import java.awt.print.PrinterException;
import java.io.*;
import java.net.Socket;
import java.text.MessageFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
//Our Classes:
import data.*;
//endregion



public class Application {
    //region APPLICATION VARIABLES
    private Socket socket;
    private ObjectOutputStream packetOutputStream;
    private ObjectInputStream packetInputStream;
    private Interface guiWindow;
    private List<Airport> launchData;
    private Airport openAirport;
    private List<Route> routeData;
    private boolean editMode = false;
    //endregion



    // Empty Application Constructor:
    private Application() {}



    //region CONNECT TO SERVER
    /**
     * Establishes a Connection to the Server.
     * <p>
     * Attempts to Connect to the Server. Currently
     * that is set to 127.0.0.1:2000 a.k.a. the local
     * system.
     *
     * @return Whether a Connection was Established or not.
     */
    private boolean connectServer() {
        disconnectServer();
        guiWindow.printLog(MessageType.STATUS,"Connecting to Server..");
        // Connection Succeeded:
        try {
            socket = new Socket("127.0.0.1", 2000);
            packetOutputStream = new ObjectOutputStream(socket.getOutputStream());
            packetInputStream = new ObjectInputStream(socket.getInputStream());
            guiWindow.printLog(MessageType.STATUS,"Server Connected");
            return true;
        // Connection Failed:
        } catch (IOException ex) {
            Logger.getLogger(Application.class.getName()).log(Level.SEVERE, null, ex);
            guiWindow.printLog(MessageType.ERROR,ex.toString());
            return false;
        }
    }
    //endregion


    //region DISCONNECT FROM SERVER
    /**
     * Disconnects from the Server.
     * <p>
     * Attempts to Disconnect from the Server.
     */
    public void disconnectServer() {
        if (socket != null) {
            guiWindow.printLog(MessageType.STATUS,"Disconnecting from the Server..");
            try {
                socket.close();
            } catch (IOException ex) {
                Logger.getLogger(Application.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                socket = null;
            }
        }
    }
    //endregion


    //region TALK TO SERVER
    /**
     * Send (& Receive) a Packet to (& from) the Server.
     * <p>
     * Sends a Packet that contains an instruction (and
     * data) to the Server and receives a Packet (with
     * information) in return.
     *
     * @param container A Packet object to be sent.
     * @return A Packet object received in return.
     */
    public Packet talkToServer(Packet container) {
        Packet recievedContainer = null;
        // Send Data:
        guiWindow.printLog(MessageType.STATUS,"Sending to Server..");
        try {
            packetOutputStream.writeObject(container);
        } catch (IOException e) {
            Logger.getLogger(Application.class.getName()).log(Level.SEVERE, null, e);
        }
        // Receive Data:
        guiWindow.printLog(MessageType.STATUS,"Waiting for Server..");
        try {
            recievedContainer = (Packet) packetInputStream.readObject();
            guiWindow.printLog(MessageType.STATUS,"Received Response");
        } catch (IOException e) {
            guiWindow.printLog(MessageType.ERROR,"(IOException) " + e);
            Logger.getLogger(Application.class.getName()).log(Level.SEVERE, null, e);
        } catch (ClassNotFoundException e) {
            guiWindow.printLog(MessageType.ERROR,"(ClassNotFoundException) " + e);
            Logger.getLogger(Application.class.getName()).log(Level.SEVERE, null, e);
        }
        return recievedContainer;
    }
    //endregion


    //region FIND AIRPORT
    /**
     * Check if an Airport Exists in the Database.
     * <p>
     * This Method Looks for the Given Airport from
     * a List of Airports Pre-Fetched From the Server.
     *
     * @param category String Specifying the Search Category ("IATA Code"/"ICAO Code"/"Airport Name").
     * @param searchTerm Airport Name or other Identifying Piece of Text.
     * @return Whether a Match Was Found.
     */
    public boolean matchAirport(String category, String searchTerm) {
        if (category.equals(SearchCategories.IATA.toString()) && searchTerm.length()!=3) {
            guiWindow.printLog(MessageType.FAILURE,"IATA Code Not 3 Characters Long");
            return false;
        } else if (category.equals(SearchCategories.ICAO.toString()) && searchTerm.length()!=4) {
            guiWindow.printLog(MessageType.FAILURE,"ICAO Code Not 4 Characters Long");
            return false;
        }
        for (int airport=0;airport<launchData.size();airport++) {
            if ((category.equals(SearchCategories.NAME.toString()) && launchData.get(airport).getName().toLowerCase().equals(searchTerm.toLowerCase())) ||
            (category.equals(SearchCategories.IATA.toString()) && new String(launchData.get(airport).getIATA()).equals(searchTerm.toUpperCase())) ||
            (category.equals(SearchCategories.ICAO.toString()) && new String(launchData.get(airport).getICAO()).equals(searchTerm.toUpperCase()))) {
                guiWindow.printLog(MessageType.SUCCESS,"Found " + launchData.get(airport).getName() + " Airport");
                guiWindow.setAirportLabel("Welcome to " + launchData.get(airport).getName() + " Airport, [" +
                    new String(launchData.get(airport).getIATA()) + "], [" +
                    new String(launchData.get(airport).getICAO()) + "], Local Time: "+
                        (LocalDateTime.now().plusHours((long) launchData.get(airport).getUTCoffset()).format(DateTimeFormatter.ofPattern("HH:mm"))));
                openAirport = launchData.get(airport);
                return true;
            }
        }
        guiWindow.printLog(MessageType.FAILURE,"Finding Search Term");
        return false;
    }
    //endregion


    //region REQUEST ROUTES
    /**
     * Request Routes for the Open Airport from the Server.
     * <p>
     * This Method Request A List of Routes for the
     * Open Airport and Sends it onwards to the
     * table in the GUI Window.
     */
    public void requestRoutes() {
        Packet request = new Packet(Command.FETCH_ROUTES);
        request.sendNumber(openAirport.getID());
        Packet response = talkToServer(request);
        routeData = response.receiveRouteList();
        guiWindow.tableDisplayRoutes(routeData);
        if (response.receiveRouteList() != null) {
            guiWindow.printLog(MessageType.SUCCESS,"Received Routes for "+openAirport.getName());
        } else {
            guiWindow.printLog(MessageType.FAILURE, "Receiving Routes for "+openAirport.getName());
        }
    }
    //endregion


    //region ADD A ROUTE
    /**
     * Add a New Route.
     * <p>
     * This Method Request an Available Route
     * ID from the Server and Creates a new
     * Route Object.
     */
    public void addRoute() {
        Packet request = new Packet(Command.FETCH_AVAILABLE_ROUTE_ID);
        Packet response = talkToServer(request);
        int newID = response.receiveNumber();
        routeData.add(new Route(String.valueOf(newID)));
        int tableRow = guiWindow.tableAddRow();
        guiWindow.tableModifyValue(tableRow,0,String.valueOf(newID));
        guiWindow.printLog(MessageType.SUCCESS,"Created Route "+newID);
    }
    //endregion


    //region REMOVE A ROUTE
    /**
     * Delete a Route.
     * <p>
     * This Method Removes a Route Based on the
     * Row Number that it is Stored/Displayed on.
     * @param routeRow The Row Number that Contains the Route.
     */
    public void removeRoute(int routeRow) {
        guiWindow.tableRemoveRow(routeRow);
        guiWindow.printLog(MessageType.SUCCESS,"Removed " + routeData.get(routeRow).getAirline().getName()+"'s " +routeData.get(routeRow).getConnectingAirport().getName() + " Route");
        routeData.remove(routeRow);
    }
    //endregion


    //region SYNCHRONISE ROUTES
    /**
     * Send Routes to the Server for Saving.
     * <p>
     * This Method Requests the Server to
     * update it's database to match the
     * clients route info.
     */
    public void saveChanges() {
        Packet dispatch = new Packet(Command.DISPATCH_CHANGES);
        dispatch.sendRouteList(routeData);
        dispatch.sendNumber(openAirport.getID());
        Packet response = talkToServer(dispatch);
        if (response.receiveCondition()) {
            guiWindow.printLog(MessageType.SUCCESS,"Updated Routes in Server");
        } else {
            guiWindow.printLog(MessageType.FAILURE,"Updating Routes in Server");
        }
    }
    //endregion


    //region SEND ROUTES TO PRINTER
    /**
     * Send a Table to the Printer.
     * <p>
     * Given a JTable, this method sends
     * the table to a printer.
     *
     * @param guiTable The Table that Is Sent to the Printer.
     */
    public void printRoutes(JTable guiTable) {
        PrintRequestAttributeSet set = new HashPrintRequestAttributeSet();
        set.add(OrientationRequested.LANDSCAPE);
        MessageFormat header = new MessageFormat("ATC Routes for " + openAirport.getName() + " at "+ (LocalDateTime.now().plusHours((long) openAirport.getUTCoffset())));
        MessageFormat footer = new MessageFormat("IATA:["+new String(openAirport.getIATA())+"], ICAO:["+new String(openAirport.getICAO())+"]");
        try {
            guiTable.print(JTable.PrintMode.FIT_WIDTH, header, footer, false, set, false);
            guiWindow.printLog(MessageType.SUCCESS,"Printed Open Routes");
        } catch (PrinterException e) {
            e.printStackTrace();
            guiWindow.printLog(MessageType.ERROR,"(Printing) "+e);
        }

    }
    //endregion


    //region VARIABLE ACCESS METHODS
    /**
     * Returns Whether User is in Edit Mode.
     *
     * @return Whether Edit Mode is Active or Not.
     */
    public boolean getEditMode() {return editMode;}
    /**
     * Modifies the Edit Mode.
     *
     * @param mode (True/False).
     */
    public void setEditMode(boolean mode) {editMode = mode;}
    /**
     * Returns the Local List of Routes.
     *
     * @return A List of Route Objects.
     */
    public List<Route> getAppData() {return routeData;}
    /**
     * Modifies the Local List of Routes.
     *
     * @param tableData A List of Route Objects.
     */
    public void setAppData(List<Route> tableData) {routeData = tableData;}
    //endregion



    //region MAIN
    @SuppressWarnings("CStyleArrayDeclaration")
    public static void main(String args[]) {
        //Create a New Application and GUI for it:
        Application clientApplication = new Application();
        clientApplication.guiWindow = new Interface(clientApplication);
        //Connect to Server and Download Available Airports:
        while (!clientApplication.connectServer()) {
            clientApplication.guiWindow.printLog(MessageType.FAILURE,"Connection Failed, Retrying in 3...");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            clientApplication.guiWindow.printLog(MessageType.FAILURE,"Connection Failed, Retrying in 2...");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            clientApplication.guiWindow.printLog(MessageType.FAILURE,"Connection Failed, Retrying in 1...");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        clientApplication.launchData = (clientApplication.talkToServer(new Packet(Command.FETCH_ALL_AIRPORTS))).receiveAirportList();
        //Display the Available Airports and Enable Search:
        clientApplication.guiWindow.tableDisplayAirports(clientApplication.launchData);
        clientApplication.guiWindow.printLog(MessageType.SUCCESS,"Connected, Ready to Select an Airport");
        clientApplication.guiWindow.enableSearchFeature(clientApplication);

    }
    //endregion
`

`

Recommended Answers

All 4 Replies

The error is in the Interface class, but I can't see the code for that.
The exception appears to be telling you that you have passed a null value for location when trying to create an ImageIcon.

package client;



//region LIBRARIES USED
//Java Libraries:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
//Our Classes:
import data.*;
//endregion



public class Interface{
    //region GUI ELEMENT VARIABLES
    private JComboBox<String> airportParameter;
    private JTextField airportField;
    private JButton searchButton;
    private JTable table;
    private JPanel mainPanel;
    private JLabel logLabel;
    private JButton editButton;
    private JButton addButton;
    private JButton removeButton;
    private JLabel airportLabel;
    private JButton saveButton;
    private JButton printButton;
    private final UniversalTableModel guiTable;
    //endregion



    //region INTERFACE CONSTRUCTOR
    /**
     * Creates a new GUI JFrame for given ATC Application.
     * <p>
     * Provided an Air Traffic Control Client Application,
     * Creates a new Graphical User Interface, based on
     * JFrame.
     *
     * @param  referenceApplication Client Application.
     * @return New GUI Window.
     */
    public Interface(Application referenceApplication) {
        final JFrame clientWindow = new JFrame("Air Traffic Information");
        // Initialise the Search Parameter Selector:
        final DefaultComboBoxModel<String> parameters = new DefaultComboBoxModel<>();
        parameters.addElement(SearchCategories.NAME.toString());
        parameters.addElement(SearchCategories.IATA.toString());
        parameters.addElement(SearchCategories.ICAO.toString());
        airportParameter.setModel(parameters);
        // Initialise the Table:
        guiTable = new UniversalTableModel();
        table.setModel(guiTable);
        // Clear Search Box on Click:
        airportField.addFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(FocusEvent e) {
                if (!airportField.getForeground().equals(Color.BLACK)) {
                    super.focusGained(e);
                    airportField.setText("");
                    airportField.setForeground(Color.BLACK);
                }
            }
        });
        // Attempt to Safely Disconnect from Server when Window is Closed:
        clientWindow.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                super.windowClosing(e);
                referenceApplication.disconnectServer();
                System.exit(0);
            }
        });
        // Display and Re-Size Contents:
        clientWindow.add(mainPanel);
        clientWindow.setVisible(true);
        clientWindow.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        clientWindow.pack();
    }
    //endregion



    //region TABLE FILLING METHODS
    /**
     * Fills the table with a list of Airports.
     * <p>
     * Takes a list of Airports and converts it to
     * the expected structure before filling out the
     * Table in our Interface.
     *
     * @param  data List of Airport objects.
     */
    public void tableDisplayAirports(List<Airport> data) {
        List<String[]> expectedFormat = new ArrayList<>();
        String[] titles = {"ID","Name","IATA","ICAO"};
        for (int item=0; item<data.size();item++) {
            expectedFormat.add(data.get(item).toStringArray());
        }
        guiTable.fillTable(expectedFormat, titles);
        guiTable.refreshTable();
    }
    /**
     * Fills the table with a list of Routes.
     * <p>
     * Takes a list of Routes and converts it to
     * the expected structure before filling out the
     * Table in our Interface.
     *
     * @param  data List of Route objects.
     */
    public void tableDisplayRoutes(List<Route> data) {
        List<String[]> expectedFormat = new ArrayList<>();
        String[] titles = {"Route ID","Expected Aircraft(s)","Airline","Callsign","Direction","From/To Airport","Airport IATA","Airport ICAO","Connecting City","Connecting Country"};
        for (int item=0; item<data.size();item++) {
            expectedFormat.add(data.get(item).toStringArray());
        }
        guiTable.fillTable(expectedFormat, titles);
        guiTable.refreshTable();
    }
    //endregion


    //region TABLE ROUTES READING METHOD
    /**
     * Reads the Table Contents into a Routes List.
     * <p>
     * Takes the Raw Contents of our Table and
     * converts it into a List of Route objects
     * before returning. Requires a Reference
     * list of Routes to match up with, since the
     * table does not display all of the parameters.
     *
     * @param  appData Reference List of Route objects.
     * @return List of Route objects.
     */
    public List<Route> tableReadRoutes(List<Route> appData) {
        ArrayList<String[]> tableFormat =  guiTable.getTableContents();
        for (int item=0; item<tableFormat.size(); item++) {
            if (appData.get(item).getID() == Integer.parseInt(tableFormat.get(item)[0])) {
                appData.get(item).setAircrafts(tableFormat.get(item)[1]);
                appData.get(item).getAirline().setName(tableFormat.get(item)[2]);
                appData.get(item).getAirline().setCallsign(tableFormat.get(item)[3]);
                if (tableFormat.get(item)[4] != null) {
                    if (tableFormat.get(item)[4].toLowerCase().equals("arriving")) {
                        appData.get(item).setArriving(true);
                    } else if (tableFormat.get(item)[4].toLowerCase().equals("departing")) {
                        appData.get(item).setArriving(false);
                    }
                }
                appData.get(item).getConnectingAirport().setName(tableFormat.get(item)[5]);
                if (tableFormat.get(item)[6] != null) {
                    appData.get(item).getConnectingAirport().setIATA(tableFormat.get(item)[6].toUpperCase());}
                if (tableFormat.get(item)[7] != null) {
                    appData.get(item).getConnectingAirport().setICAO(tableFormat.get(item)[7].toUpperCase());}
                appData.get(item).getConnectingAirport().setCity(tableFormat.get(item)[8]);
                appData.get(item).getConnectingAirport().setCountry(tableFormat.get(item)[9]);
            } else {
                printLog(MessageType.FAILURE,"Table Data Mismatched Application Data"); //This might happen if the user moves rows around, might get around it by sorting beforehand
            }
        }
        return appData;
    }
    //endregion


    //region TABLE MODIFYING METHODS
    /**
     * Removes Given Row from Table.
     * <p>
     * Given a row number, our table is modified
     * to remove the row.
     *
     * @param  row Row Number (Not ID).
     */
    public void tableRemoveRow(int row) {
        if (guiTable.removeRow(row)) {
            guiTable.refreshTable();
            printLog(MessageType.STATUS,"Removed Row "+row+" from Table");
        } else {
            printLog(MessageType.FAILURE,"Could not Remove Row "+row+" from Table");
        }
    }
    /**
     * Adds a New Row to our Table.
     * <p>
     * Creates and Adds a New Row to the Table.
     *
     * @return The Row Number for the New Row.
     */
    public int tableAddRow() {
        int rowPosition = guiTable.addRow();
        printLog(MessageType.STATUS,"Created New Item at Row "+rowPosition+" in Table");
        guiTable.refreshTable();
        return rowPosition;
    }
    /**
     * Modifies a Cell in our Table
     * <p>
     * Given a Column and Row Value, along with the new
     * value, this method Modifies the Table to display
     * the given value at that position instead.
     *
     * @param row Table Row Number (Not ID).
     * @param column Table Column Number.
     * @param value The New String Value.
     */
    public void tableModifyValue(int row, int column, String value) {
        if (guiTable.modifyValue(row,column,value)) {
            guiTable.refreshTable();
            printLog(MessageType.STATUS,"Set [Row: "+row+", Column: "+column+"] to "+value+" in Table");
        } else {
            printLog(MessageType.FAILURE,"Could not Modify [Row: "+row+", Column: "+column+"] in Table");
        }
    }
    //endregion


    //region LABEL UPDATING METHODS
    /**
     * Displays the Given Status Message.
     * <p>
     * Given a String, it is Displayed on the
     * log label in our Window for the User to
     * see.
     *
     * @param  text String Message.
     */
    public void printLog(MessageType type, String text) {
        logLabel.setForeground(type.colour());
        logLabel.setFont(type.font());
        logLabel.setText(type.startString()+text+type.endString());
    }


    /**
     * Displays the Given Airport.
     * <p>
     * Given a String, it is Displayed on the
     * Airport label in our Window for the User
     * to see.
     *
     * @param  text String Message.
     */
    public void setAirportLabel(String text) {airportLabel.setText(text);}
    //endregion


    //region ENABLE SEARCH METHOD
    /**
     * Enables the Search Tools in our GUI.
     * <p>
     * This method is designed to prevent the user
     * from accessing search tools before we have
     * established a connection to the server.
     *
     * @param  referenceApplication Client Application.
     */
    public void enableSearchFeature(Application referenceApplication) {
        airportParameter.setEnabled(true);
        airportField.setEnabled(true);
        searchButton.setEnabled(true);
        //Search Triggered By Button:
        searchButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                boolean airportFound = referenceApplication.matchAirport(airportParameter.getSelectedItem().toString(),airportField.getText());
                //Searched Airport Exists, Fetching Routes:
                if (airportFound) {
                    referenceApplication.requestRoutes();
                    enableRouteFeatures(referenceApplication);
                }
            }
        });
        //Search Triggered By Enter Key:
        airportField.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {}
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode()==KeyEvent.VK_ENTER) {
                    boolean airportFound = referenceApplication.matchAirport(airportParameter.getSelectedItem().toString(),airportField.getText());
                    //Searched Airport Exists, Fetching Routes:
                    if (airportFound) {
                        referenceApplication.requestRoutes();
                        enableRouteFeatures(referenceApplication);
                    }
                }
            }
            @Override
            public void keyReleased(KeyEvent e) {}
        });
    }
    //endregion


    //region ENABLE ROUTE-TOOLS METHOD
    /**
     * Enables the Route Tools in our GUI.
     * <p>
     * This method is designed to prevent the user
     * from accessing route tools before we have
     * displayed the requested routes.
     *
     * @param  referenceApplication Client Application.
     */
    public void enableRouteFeatures(Application referenceApplication) {
        editButton.setEnabled(true);
        printButton.setEnabled(true);
        //Edit Mode Triggered:
        editButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (!referenceApplication.getEditMode()) {
                    referenceApplication.setEditMode(true);
                    editButton.setText("CANCEL");
                    addButton.setEnabled(true);
                    removeButton.setEnabled(true);
                    saveButton.setEnabled(true); saveButton.setForeground(Color.RED);
                    guiTable.setEditMode(true);
                    printLog(MessageType.STATUS,"Editing Mode Enabled");
                    enableEditMode(referenceApplication);
                } else {
                    referenceApplication.setEditMode(false);
                    editButton.setText("EDIT");
                    addButton.setEnabled(false);
                    removeButton.setEnabled(false);
                    saveButton.setEnabled(false); saveButton.setForeground(Color.BLACK);
                    guiTable.setEditMode(false);
                    printLog(MessageType.STATUS,"Editing Mode Disabled");
                }

            }
        });
        //Print Triggered:
        printButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                referenceApplication.printRoutes(table);
            }
        });
    }
    //endregion


    //region ENABLE EDITING METHOD
    /**
     * Enables Route Editing in our GUI.
     * <p>
     * This method is designed to prevent the user
     * from accessing route editing tools before
     * they have confirmed they wish to edit.
     *
     * @param  referenceApplication Client Application.
     */
    public void enableEditMode(Application referenceApplication) {
        //Add Route Triggered:
        addButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                referenceApplication.addRoute();
                editButton.setText("CANCEL");
            }
        });
        //Remove Route Triggered:
        removeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int routeRow = table.getSelectedRow();
                if (routeRow != -1) {
                    referenceApplication.removeRoute(routeRow);
                    editButton.setText("CANCEL");
                } else {
                    printLog(MessageType.FAILURE,"Please Select a Route Before Clicking Remove");
                }
            }
        });
        //Server Synchronising Triggered:
        saveButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                referenceApplication.setAppData(tableReadRoutes(referenceApplication.getAppData()));
                referenceApplication.saveChanges();
                editButton.setText("CLOSE");
            }
        });
    }
    //endregion
}

The interface code

It tells you EXACTLY where the error is and what the error is. You're passing a null value for an argument where an actual value is required.

It's for you to figure out what that actual value should be.

That code does not match the exception - it has no ImageIcons

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.