public void start(Stage primaryStage) throws Exception { String CONNECTION_URL = "jdbc:hive2://192.168.88.100:10000/default"; String USERNAME = "root"; String PASSWORD = "123456"; String JDBC_DRIVER = "org.apache.hive.jdbc.HiveDriver"; // 加载 Hive JDBC 驱动 Class.forName(JDBC_DRIVER); // 建立 JDBC 连接 Connection conn = DriverManager.getConnection(CONNECTION_URL, USERNAME, PASSWORD); // 创建 Statement 对象 Statement stmt = conn.createStatement(); // 执行查询语句 String sql = "SELECT data FROM picture_01 WHERE dt = '2023-07-13'"; ResultSet rs = stmt.executeQuery(sql); // 处理查询结果 while (rs.next()) { // 处理数据,例如打印输出 System.out.println(rs.getBinaryStream("data")); } // 从 Hive 数据库获取二进制数据的输入流对象 InputStream inputStream = rs.getBinaryStream("data"); // 将输入流对象转换为 BufferedImage 对象 BufferedImage bufferedImage = ImageIO.read(inputStream); // 转换 BufferedImage 为 JavaFX 的 Image 对象 Image image = SwingFXUtils.toFXImage(bufferedImage, null); System.out.println("1"); // 创建图像视图 ImageView imageView = new ImageView(image); // 创建场景,并将图像视图添加到场景中 Scene scene = new Scene(imageView.getParent()); // 设置舞台并显示场景 primaryStage.setTitle("Image Viewer"); primaryStage.setScene(scene); primaryStage.show(); // 关闭连接和释放资源 rs.close(); stmt.close(); conn.close(); // 关闭输入流 inputStream.close(); } }此代码报错上述代码报错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 com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)什么原因
时间: 2024-04-17 15:24:32 浏览: 160
根据你提供的代码和错误信息,这个问题可能是由于在 JavaFX 的 `start` 方法中直接执行了数据库查询和 UI 操作,导致在 JavaFX 应用程序线程中发生了阻塞操作,从而引发了 `InvocationTargetException` 异常。
在 JavaFX 应用程序中,`start` 方法是在主线程上调用的,用于初始化和显示应用程序的 UI。然而,数据库查询是一个耗时操作,应该在后台线程中执行,而不是直接在 `start` 方法中执行。
为了解决这个问题,可以将数据库查询的代码放在后台线程中执行,并在查询完成后更新 UI。可以使用 `javafx.concurrent.Task` 或 `javafx.concurrent.Service` 类来实现这个目的。
以下是一个使用 `javafx.concurrent.Task` 的示例代码:
```java
public void start(Stage primaryStage) throws Exception {
String CONNECTION_URL = "jdbc:hive2://192.168.88.100:10000/default";
String USERNAME = "root";
String PASSWORD = "123456";
String JDBC_DRIVER = "org.apache.hive.jdbc.HiveDriver";
Task<BufferedImage> queryTask = new Task<BufferedImage>() {
@Override
protected BufferedImage call() throws Exception {
Class.forName(JDBC_DRIVER);
Connection conn = DriverManager.getConnection(CONNECTION_URL, USERNAME, PASSWORD);
Statement stmt = conn.createStatement();
String sql = "SELECT data FROM picture_01 WHERE dt = '2023-07-13'";
ResultSet rs = stmt.executeQuery(sql);
rs.next();
InputStream inputStream = rs.getBinaryStream("data");
BufferedImage bufferedImage = ImageIO.read(inputStream);
rs.close();
stmt.close();
conn.close();
inputStream.close();
return bufferedImage;
}
};
queryTask.setOnSucceeded(event -> {
BufferedImage bufferedImage = queryTask.getValue();
Image image = SwingFXUtils.toFXImage(bufferedImage, null);
ImageView imageView = new ImageView(image);
Scene scene = new Scene(imageView.getParent());
primaryStage.setTitle("Image Viewer");
primaryStage.setScene(scene);
primaryStage.show();
});
queryTask.setOnFailed(event -> {
Throwable exception = queryTask.getException();
// 处理异常
exception.printStackTrace();
});
Thread queryThread = new Thread(queryTask);
queryThread.start();
}
```
这样,数据库查询将在后台线程中执行,完成后将触发 `onSucceeded` 事件,其中可以更新 UI。如果查询过程中发生异常,将触发 `onFailed` 事件,在该事件中可以处理异常情况。
请注意,这只是一个示例代码,你需要根据实际情况进行调整。希望能帮助你解决问题!如果有任何问题,请随时提问。
阅读全文