Как исправить ошибку "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 шт):

Автор решения: Nowhere Man

Фактически вы не использовали 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.

→ Ссылка