Как исправить ошибку "java.lang.IllegalArgumentException: image == null" при помещении таблицы в BLOD?
Я начал изучать JDBC, делаю маленький тестовый проект, по гайду с этого видео.
Программа создает таблицу, помещает в неё BLOB. Берет картинку с указанного пути,
помещает её в BLOB. Затем создает 2-ой BLOB, который считывает с 1-ого картинку,и записывает ее в другой файл. Но я получаю следующую ошибку:
java.lang.IllegalArgumentException: image == null!
В чем дело понять самостоятельно не могу, вроде как переписано всё с видео абсолютно правильно.
Прошу у вас помощи, подскажите, что не так, потому что я голову уже сломал лично :D.
Код класса mainClass:
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.imageio.ImageIO;
import java.sql.Driver;
public class mainClass {
public static void main(String[] args) {
System.out.println("Тест подключения к БД");
String userName="root";
String password="pass";
String connectionUrl = "jdbc:mysql://localhost:3306/test";
try{
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection = DriverManager.getConnection(connectionUrl,userName,password);
Statement statment = connection.createStatement();
statment.executeUpdate("drop table IF EXISTS Book;");
statment.executeUpdate("create table Book ( id int not null auto_increment, name VARCHAR(100) not null,img BLOB, primary key (id));");
BufferedImage image = ImageIO.read(new File("testImg/smile.jpg"));
Blob blob = connection.createBlob();
try{
OutputStream outputStream = blob.setBinaryStream(1);
ImageIO.write(image,"jpg",outputStream);
} catch(Exception a ) {
System.out.println("Ошибка считывания картинки : "+a);
}
System.out.println("картиночка считана");
PreparedStatement prState = connection.prepareStatement("insert into Book(name,img) values (?,?);");
prState.setString(1, "sdafsaf");
System.out.println("присвоили 1 значение нейм");
prState.setBlob(2,blob);
System.out.println("присвоили 2 значение имг");
prState.execute();
System.out.println("ЕкзекутУРА");
ResultSet resSet =statment.executeQuery("select * from Book;");
while(resSet.next()) {
Blob blob2 = resSet.getBlob("img");
BufferedImage image2 =ImageIO.read(blob.getBinaryStream());
File outFile = new File("saved.png");
ImageIO.write(image2, "png", outFile);
}
System.out.println("Успех!");
} catch (Exception d){
System.out.println(d);
}
}
}
Ответы (1 шт):
Фактически вы не использовали try-with-resources при записи блоба в таблицу БД, что и было показано в ролике начиная с 7:20, чтобы записать содержимое потока вывода при записи картинки в блоб:
try (OutputStream outputStream = blob.setBinaryStream(1)) {
ImageIO.write(image,"jpg",outputStream);
} catch(Exception a ) {
System.out.println("Ошибка считывания картинки : "+a);
}
или же можно было самому вызвать outputStream.flush() / outputStream.close(), но это делалось в былинные времена до Java 7.