Database ';应用程序启动方法java.lang.reflect.InvocationTargetException'中出现异常;从数据库中读取和显示时

Database ';应用程序启动方法java.lang.reflect.InvocationTargetException'中出现异常;从数据库中读取和显示时,database,exception,javafx,javafx-2,Database,Exception,Javafx,Javafx 2,我试图从MySQL数据库中读取值,并将其显示在JavaFX中的表中。我使用netbeanside。当我运行代码时,我得到了标题中提到的异常。我将在下面发布代码: public class ViewSubject extends Application { private final TableView<Subject> table = new TableView<>(); private final ObservableList<Subject> data

我试图从MySQL数据库中读取值,并将其显示在JavaFX中的表中。我使用netbeanside。当我运行代码时,我得到了标题中提到的异常。我将在下面发布代码:

public class ViewSubject extends Application {

private final TableView<Subject> table = new TableView<>();
private final ObservableList<Subject> data
        = FXCollections.observableArrayList();
final HBox hb = new HBox();

private Connection connect = null;
private Statement statement = null;
private final PreparedStatement preparedStatement = null;
private ResultSet resultSet = null;

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

@Override
public void start(Stage stage) throws ClassNotFoundException, SQLException {

    Scene scene = new Scene(new Group());
    stage.setTitle("Add Subject");
    stage.setWidth(650);
    stage.setHeight(550);
    stage.setResizable(false);

    final Label label = new Label("Subject Details");
    label.setFont(new Font("Calibri", 20));

    TableColumn sub = new TableColumn("Subject Name");
    sub.setMinWidth(350);
    sub.setCellValueFactory(
            new PropertyValueFactory<Subject, String>("subName"));
    sub.setCellFactory(TextFieldTableCell.forTableColumn());
    sub.setOnEditCommit(
            new EventHandler<TableColumn.CellEditEvent<Subject, String>>() {
                @Override
                public void handle(TableColumn.CellEditEvent<Subject, String> t) {
                    ((Subject) t.getTableView().getItems().get(
                            t.getTablePosition().getRow())).setSubName(t.getNewValue());
                }
            }
    );

    TableColumn code = new TableColumn("Subject Code");
    code.setMinWidth(130);
    code.setCellValueFactory(
            new PropertyValueFactory<Subject, String>("subCode"));
    code.setCellFactory(TextFieldTableCell.forTableColumn());
    code.setCellFactory(TextFieldTableCell.forTableColumn());
    code.setOnEditCommit(
            new EventHandler<TableColumn.CellEditEvent<Subject, String>>() {
                @Override
                public void handle(TableColumn.CellEditEvent<Subject, String> t) {
                    ((Subject) t.getTableView().getItems().get(
                            t.getTablePosition().getRow())).setSubCode(t.getNewValue());
                }
            }
    );

    TableColumn rev = new TableColumn("Revision");
    rev.setMinWidth(130);
    rev.setCellValueFactory(
            new PropertyValueFactory<Subject, String>("subRev"));
    rev.setCellFactory(TextFieldTableCell.forTableColumn());
    rev.setCellFactory(TextFieldTableCell.forTableColumn());
    rev.setOnEditCommit(
            new EventHandler<TableColumn.CellEditEvent<Subject, String>>() {
                @Override
                public void handle(TableColumn.CellEditEvent<Subject, String> t) {
                    ((Subject) t.getTableView().getItems().get(
                            t.getTablePosition().getRow())).setSubCode(t.getNewValue());
                }
            }
    );

    table.setItems(data);
    table.getColumns().addAll(sub, code, rev);

    final VBox vbox = new VBox();
    vbox.setSpacing(10);
    vbox.setPadding(new Insets(20, 20, 20, 20));
    vbox.getChildren().addAll(label, table);

    ((Group) scene.getRoot()).getChildren().addAll(vbox);

    stage.setScene(scene);
    stage.show();

    try {
        Class.forName("com.mysql.jdbc.Driver");
        connect = DriverManager
                .getConnection("jdbc:mysql://localhost:3306/project?"
                        + "user=root&password=virus");
        statement = connect.createStatement();

        resultSet = statement
                .executeQuery("select * from subject");
        writeResultSet(resultSet);
    } catch (ClassNotFoundException | SQLException e) {
        throw e;
    } finally {
        close();
    }

}

private void writeResultSet(ResultSet resultSet) throws SQLException {

    while (resultSet.next()) {

        String subname = resultSet.getString("subname");
        String code = resultSet.getString("subcode");
        String rev = resultSet.getString("subrev");

        data.add(new Subject(subname, code, rev));
    }
}

private void close() {
    try {
        if (resultSet != null) {
            resultSet.close();
        }
        if (statement != null) {
            statement.close();
        }
        if (connect != null) {
            connect.close();
        }
    } catch (SQLException e) {

    }
}
}
以下是例外详细信息:

应用程序启动方法中出现异常 java.lang.reflect.InvocationTargetException 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:606) 位于com.javafx.main.main.launchApp(main.java:698) 位于com.javafx.main.main.main(main.java:871) 原因:java.lang.RuntimeException:应用程序启动方法中的异常 位于com.sun.javafx.application.LaunchImpl.launchApplication1(LaunchImpl.java:403) 访问com.sun.javafx.application.launchempl.access$000(launchempl.java:47) 位于com.sun.javafx.application.launchempl$1.run(launchempl.java:115) 运行(Thread.java:744) 原因:java.lang.ClassNotFoundException:com.mysql.jdbc.Driver 在java.net.URLClassLoader$1.run(URLClassLoader.java:366) 在java.net.URLClassLoader$1.run(URLClassLoader.java:355) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.net.URLClassLoader.findClass(URLClassLoader.java:354) 位于java.lang.ClassLoader.loadClass(ClassLoader.java:425) 位于java.lang.ClassLoader.loadClass(ClassLoader.java:358) 位于java.lang.Class.forName0(本机方法) 位于java.lang.Class.forName(Class.java:190) 在viewsubject.viewsubject.read(viewsubject.java:119) 在viewsubject.viewsubject.start(viewsubject.java:113) 位于com.sun.javafx.application.launchempl$5.run(launchempl.java:319) 位于com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:216) 位于com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:179) 位于com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:176) 位于java.security.AccessController.doPrivileged(本机方法) 位于com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:176) 位于com.sun.glass.ui.invokelateDispatcher$Future.run(invokelateDispatcher.java:76) 在com.sun.glass.ui.win.WinApplication.\u runLoop(本机方法) com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:17) 位于com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:67) ... 还有一个 当代码运行时,一个窗口出现了几分之一秒,然后由于出现此异常而突然关闭。为什么会发生这种异常?如何删除此异常?

您的类路径上没有

在上执行Vogella教程。一步一步地完成整个教程,每一步都运行代码。作为Vogella教程的一部分,它将告诉您如何在Eclipse中使用(如MySQL JDBC库)


发布代码时,请尝试发布与堆栈跟踪匹配的代码。StackTrace在viewsubject.viewsubject.read(viewsubject.java:119)报告了一个错误,但是在viewsubject类中没有这样的read函数。

您是如何理解这个问题的,意思是您是如何发现我的类路径中没有MySQL JDBC驱动程序的?
public class Subject {

    private final SimpleStringProperty sub;
    private final SimpleStringProperty code;
    private final SimpleStringProperty rev;

    Subject(String subName, String subCode, String subRev) {
        this.sub = new SimpleStringProperty(subName);
        this.code = new SimpleStringProperty(subCode);
        this.rev = new SimpleStringProperty(subRev);
    }

    public String getSubName() {
        return sub.get();
    }

    public void setSubName(String subName) {
        sub.set(subName);
    }

    public String getSubCode() {
        return code.get();
    }

    public void setSubCode(String subCode) {
        code.set(subCode);
    }

    public String getSubRev() {
        return rev.get();
    }

    public void setSubRev(String subRev) {
        rev.set(subRev);
    }
}