0

I'm working on JavaFX and SQL project. First of all login window opens and if the username and password matches to one stored in my databases then AddCustomer deatils windows will pop up[Works fine till here] . A table would be in my database for the user entry. But as I click on 'save' button I get an error like this

   Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Node.fireEvent(Node.java:8411)
    at javafx.scene.control.Button.fire(Button.java:185)
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:394)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$353(GlassViewEventHandler.java:432)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431)
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
    at com.sun.glass.ui.View.notifyMouse(View.java:937)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
    ... 48 more
Caused by: java.lang.NullPointerException
    at sample.MysqlConnector.<init>(MysqlConnector.java:22)
    at sample.AddCustomer.addcustomer(AddCustomer.java:52)
    ... 58 more

My Main.java

package sample;

import javafx.application.Application;
import javafx.fxml.*;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        try {
            Parent root = FXMLLoader.load(getClass().getResource("login1.fxml"));
            primaryStage.setTitle("NOVOTEL HOTEL ");
            primaryStage.setScene(new Scene(root, 500, 475));
            primaryStage.show();
        }
        catch(Exception e )
        {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {
        launch(args);
    }
}

My MysqlConnector.java

package sample;
import com.sun.istack.internal.NotNull;
import com.sun.istack.internal.Nullable;
import javafx.fxml.FXML;

import java.sql.*;


public class MysqlConnector {
    @FXML
    public static Statement stmt;
    @FXML
    public static Connection conn;




    public MysqlConnector() {
        Connector();
        String TableName = "CustomerDetails";
        try {
            stmt = conn.createStatement();
            DatabaseMetaData dbm = conn.getMetaData();
            ResultSet tables = dbm.getTables(null, null, TableName.toUpperCase(), null);
            if (tables.next()) {
                System.out.println("Ready to go");

            } else {
                stmt.execute("CREARE TABLE " + TableName + "("
                        + " customername varchar(45) primary key,"
                        + " customername int" +
                        "+ customernumber int" +
                        "+  customerstay int" +
                        "+  customerguests varchar(45)"
                        + ")");
            }
        } catch (SQLException e1) {
            System.err.println(e1.getMessage());
        }
    }

    @Nullable
    @NotNull
    public static Connection Connector() {


        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/login", "root", "password");
            return conn;
        } catch (Exception e) {
            return null;
        }

    }
    @NotNull
    @Nullable
    public  static ResultSet executeQuery(String query) {

        ResultSet result ;

        try {
             stmt = conn.createStatement();
            result=stmt.executeQuery(query);



        } catch (SQLException e) {
            System.out.println("Error here");
            e.printStackTrace();
            return null;

        }
        return result;
    }
    @NotNull
    @Nullable
    public boolean executeAction(String qu) {
        try {
            stmt = conn.createStatement();
            stmt.execute(qu);
            return true;


        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }
}

My LoginModel.java

package sample;
import com.sun.istack.internal.NotNull;
import com.sun.istack.internal.Nullable;
import javafx.fxml.FXML;

import java.sql.*;


public class MysqlConnector {
    @FXML
    public static Statement stmt;
    @FXML
    public static Connection conn;




    public MysqlConnector() {
        String TableName = "CustomerDetails";
        try {
            stmt = conn.createStatement();
            DatabaseMetaData dbm = conn.getMetaData();
            ResultSet tables = dbm.getTables(null, null, TableName.toUpperCase(), null);
            if (tables.next()) {
                System.out.println("Ready to go");

            } else {
                stmt.execute("CREARE TABLE " + TableName + "("
                        + " customername varchar(45) primary key,"
                        + " customername int" +
                        "+ customernumber int" +
                        "+  customerstay int" +
                        "+  customerguests varchar(45)"
                        + ")");
            }
        } catch (SQLException e1) {
            System.err.println(e1.getMessage());
        }
    }

    @Nullable
    @NotNull
    public static Connection Connector() {


        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/login", "root", "password");
            return conn;
        } catch (Exception e) {
            return null;
        }

    }
    @NotNull
    @Nullable
    public  static ResultSet executeQuery(String query) {

        ResultSet result ;

        try {
             stmt = conn.createStatement();
            result=stmt.executeQuery(query);



        } catch (SQLException e) {
            System.out.println("Error here");
            e.printStackTrace();
            return null;

        }
        return result;
    }
    @NotNull
    @Nullable
    public boolean executeAction(String qu) {
        try {
            stmt = conn.createStatement();
            stmt.execute(qu);
            return true;


        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }
}

My Controller class

import com.sun.istack.internal.Nullable;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.control.*;
import javafx.geometry.*;

import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;

import java.net.URL;
import java.sql.SQLException;
import java.util.ResourceBundle;
import javafx.*;
public class Controller  implements Initializable {
    @NotNull
    @Nullable
    public LoginModel loginModel = new LoginModel();
    @FXML

    private Label isConnected,db;
    @FXML
    private TextField txtUsername;
    @FXML
    private TextField txtpassword;

    @FXML
    Button abutton = new Button("Login");

    private AddCustomer  addCustomer;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        // TODO Auto-generated method stub
        if (loginModel.isDBConnected()) {
            db.setText("Connected to DATABASE");
        } else {
            db.setText("Not Connected");
        }
    }

    public void Login (ActionEvent event ) {
        try {
            if (loginModel.isLogin(txtUsername.getText(), txtpassword.getText())) {
                isConnected.setText("Correct");
                try {
                    FXMLLoader addCustomer= new FXMLLoader(getClass().getResource("/sample/addcustomer.fxml"));
                    Parent root1 = (Parent)addCustomer.load();
                    Stage stage = new Stage();
                    stage.setScene(new Scene(root1));
                    stage.setTitle("ENTRY RECORD");
                    stage.show();
                }
                catch (Exception e){
                    e.printStackTrace();
                }

            } else {
                Alert alert=new Alert(Alert.AlertType.ERROR);
                alert.setHeaderText(null);
                alert.setContentText("YOU ARE NOT AUTHENTICATED");
                alert.show();


            }
        } catch (SQLException e) {

            isConnected.setText("Incorrect");
            e.printStackTrace();
        }
    }


}

FXML of COntroller Class

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>

<AnchorPane prefHeight="335.0" prefWidth="526.0" xmlns="http://javafx.com/javafx/8.0.121" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <children>
      <Label id="isConnected" fx:id="isConnected" layoutX="69.0" layoutY="27.0" prefHeight="45.0" prefWidth="165.0" textAlignment="CENTER" textFill="#e81313">
         <font>
            <Font size="15.0" />
         </font></Label>
      <TextField fx:id="txtUsername" accessibleRole="MENU" layoutX="152.0" layoutY="124.0" promptText="Username" />
      <Button fx:id="abutton" layoutX="201.0" layoutY="227.0" mnemonicParsing="false" onAction="#Login" text="Login" />
      <PasswordField fx:id="txtpassword" layoutX="152.0" layoutY="154.0" promptText="Password" />
      <Label fx:id="db" layoutX="247.0" layoutY="41.0" text="status">
         <font>
            <Font size="15.0" />
         </font>
      </Label>
   </children>
</AnchorPane>

My AddCustomer class Here I haven't add functionality for cancel button yet, just want to check 'save' button first.

package sample;

import com.sun.istack.internal.NotNull;
import com.sun.istack.internal.Nullable;
import com.sun.org.apache.bcel.internal.generic.RETURN;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;

public   class AddCustomer {
    @FXML
    public TextField number;
    @FXML
    public TextField name;
    @FXML
    public TextField stay;
    @FXML
    public TextField noofguests;
    @FXML
    public Button savebutton;
    @FXML
    public Button cancelbutton;
    @FXML
    @NotNull
    @Nullable
    public  void addcustomer(ActionEvent actionEvent) throws Exception {


            String customername = name.getText();
            String customernumber = number.getText();
            String customerstay = stay.getText();
            String customerguests = noofguests.getText();
            if (customername.isEmpty() || customerguests.isEmpty() || customernumber.isEmpty() || customerstay.isEmpty()) {
                Alert alert = new Alert(Alert.AlertType.ERROR);
                alert.setHeaderText(null);
                alert.setContentText("PLEASE ENTER ALL THE FIELDS");
                alert.show();
                return;

            }

            String qu = "INSERT INTO CustomerDetails VALUES(" + "'" + customername + "'," +
                    "'" + customernumber + "'," +
                    "'" + customerstay + "'," +
                    "'" + customerguests + "'" + ")";
            System.out.println(qu);

        @NotNull
        @Nullable
        MysqlConnector mysqlConnector=new MysqlConnector();
        try {

            if (mysqlConnector.executeAction(qu)) {
                @NotNull
                @Nullable
                Alert alert = new Alert(Alert.AlertType.INFORMATION);
                alert.setHeaderText(null);
                alert.setContentText("SUCCESS");
                alert.show();
            } else {
                @NotNull
                @Nullable
                Alert alert = new Alert(Alert.AlertType.ERROR);
                alert.setHeaderText(null);
                alert.setContentText("FAILED");
                alert.show();
            }
        }
        catch(Exception e)
        { e.printStackTrace();}

    }
    public void cancel(ActionEvent actionEvent) {
    }
}

My Add Customer FXML

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>


<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.VBox?>


<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="599.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.AddCustomer">
    <children>
        <VBox layoutX="44.0" prefHeight="400.0" prefWidth="513.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="44.0" AnchorPane.rightAnchor="43.0" AnchorPane.topAnchor="0.0">
            <children>
                <TextField fx:id="name" prefHeight="50.0" prefWidth="492.0" promptText="Customer Name">
                    <VBox.margin>
                        <Insets bottom="10.0" left="10.0" right="10.0" top="30.0" />
                    </VBox.margin>
                </TextField>
                <TextField fx:id="number" layoutX="10.0" layoutY="10.0" prefHeight="53.0" prefWidth="492.0" promptText="Customer Number">
                    <VBox.margin>
                        <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                    </VBox.margin>
                </TextField>
                <TextField fx:id="stay" layoutX="10.0" layoutY="10.0" prefHeight="52.0" prefWidth="492.0" promptText="Stay Period ">
                    <VBox.margin>
                        <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                    </VBox.margin>
                </TextField>
                <TextField fx:id="noofguests" layoutX="10.0" layoutY="35.0" prefHeight="50.0" prefWidth="492.0" promptText="No. Of Guests">
                    <VBox.margin>
                        <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                    </VBox.margin>
                </TextField>
                <Button fx:id="savebutton" mnemonicParsing="false" onAction="#addcustomer" prefHeight="47.0" prefWidth="109.0" text="Save">
                    <VBox.margin>
                        <Insets bottom="10.0" left="100.0" right="10.0" top="10.0" />
                    </VBox.margin>
                </Button>
                <Button fx:id="cancelbutton" mnemonicParsing="false" onAction="#cancel" prefHeight="46.0" prefWidth="110.0" text="Cancel">
                    <VBox.margin>
                        <Insets bottom="10.0" left="300.0" right="10.0" top="-57.0" />
                    </VBox.margin>
                </Button>
            </children>
        </VBox>
    </children>
</AnchorPane>

Please help in getting this error fixed.

thatman303
  • 163
  • 6
  • 15
  • 1
    Based on how your question is worded and your comments to Mark's answer, I recommend you read [What is a stack trace, and how can I use it to debug my application errors?](https://stackoverflow.com/questions/3988788/what-is-a-stack-trace-and-how-can-i-use-it-to-debug-my-application-errors). You're focusing on `InvocationTargetException` but that is not the fundamental problem (it rarely is when dealing with `InvocationTargetException`s). You need to look at the `Caused by:`s to see the underlying error. – Slaw Oct 21 '18 at 08:39
  • In your `MysqlConnector.Connector` method you return `null` when an `Exception` is thrown. This means that, if there's an exception, some time later in your code you'll get a `NullPointerException` but that won't be the real issue. Print the stack trace of the `Exception` to see if anything goes wrong when opening a `Connection`. – Slaw Oct 21 '18 at 08:55
  • You also seem to be using `static` methods/fields and then use these inside a constructor. Remember, `static` means the methods/fields are associated with the _entire class_, not _an instance_ of said class. Also, `FXML` annotations don't work with `static`: see [this](https://stackoverflow.com/questions/23105433/javafx-8-compatibility-issues-fxml-static-fields). And you have many things annotated with both `NotNull` and `Nullable`; besides those both appearing to be internal `com.sun.*` annotations their names would indicate they are mutually exclusive. – Slaw Oct 21 '18 at 09:00
  • Hey thanks for sharing stack trace explanation ,it helped me pin pointing the error . Regarding NotNull and Nullablle annotations ,I really don't know much about them I just used them because I read somewhere here that it solves nullpointexception error.I will study them write now ! – thatman303 Oct 21 '18 at 11:03

1 Answers1

2

The reason you're getting this error is because you're trying to call conn.createStatement(); on conn which is never initialized and therefore null.

I see you have a function called Connector() which will initialize the variable conn but you are never calling it, a fix would be to call Connector() inside the constructor of MysqlConnector before you're trying to do anything with the variable conn.

public MysqlConnector() {
   conn = Connector();

   if (conn != null) {
      // Do your things here
   }

}
Mark
  • 5,089
  • 2
  • 20
  • 31
  • hey thanks updated the code with Connector() inside the constructor. Now the connection to the mysql is getting established but still the error :Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException – thatman303 Oct 21 '18 at 08:22
  • On what line of what class? – Mark Oct 21 '18 at 08:23
  • sorry ? didn't get it. – thatman303 Oct 21 '18 at 08:30
  • Where is the new error coming from? What line does it tell you the error is on? – Mark Oct 21 '18 at 08:33
  • But where in your code is the error coming from – Mark Oct 21 '18 at 08:44
  • sorry for mistake in previous comment . errors are shown in these lines--stmt = conn.createStatement(); MysqlConnector mysqlConnector=new MysqlConnector(); – thatman303 Oct 21 '18 at 08:49
  • Is the value of `conn` actually set? The `Connector()` function can also return `null` if there was an error. – Mark Oct 21 '18 at 09:09
  • 1
    hey yes! I didn't set the connection() method to conn variable inside the connection. Now the code is working fine.Though I am getting 'Failed 'alert box message(after clicking save button) but now the error is in sql command which i will sort it out .Thanks again! – thatman303 Oct 21 '18 at 09:26