来自TARENA的教程上的一个例子:package core20.sql3;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import com.allanlxf.util.JdbcUtil;/**
 * Add your description here.
 * 
 * @author alan
 * @version 1.0
 * 
 */
public class ImageLibraryService {
public void addImage(long id, String imageName, String path)
throws SQLException {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null; try {
con = JdbcUtil.getConnection();// 这个连接是正确的
con.setAutoCommit(false); String sql = "INSERT INTO ImageLibrary(id, name, image)";
sql += " VALUES(?,?,empty_blob())";
ps = con.prepareStatement(sql); ps.setLong(1, id);
ps.setString(2, imageName); ps.executeUpdate();
JdbcUtil.close(ps, null); ps = con.prepareStatement("SELECT image FROM ImageLibrary WHERE id = ? FOR UPDATE");
ps.setLong(1, id);
rs = ps.executeQuery(); if (rs.next()) {
Blob image = rs.getBlob(1); OutputStream out = image.setBinaryStream(0); BufferedOutputStream bufferedOut = new BufferedOutputStream(out);
BufferedInputStream bufferedIn = new BufferedInputStream(
new FileInputStream(path));
int c;
while ((c = bufferedIn.read()) != -1) {
bufferedOut.write(c);
}
bufferedIn.close();
bufferedOut.close();
}
con.commit();
} catch (Exception e) {
e.printStackTrace();
try {
con.rollback();
} catch (SQLException ex) {
}
throw new SQLException(e.getMessage());
} finally {
JdbcUtil.close(rs, ps, con);
}
} public void restoreImage(long id, String fileName) throws SQLException {
Connection con = null;
Statement st = null;
ResultSet rs = null; try {
con = JdbcUtil.getConnection(); String sql = "SELECT image FROM ImageLibrary WHERE id = " + id;
st = con.createStatement();
while (rs.next()) {
Blob image = rs.getBlob("image"); BufferedOutputStream out = new BufferedOutputStream(
new FileOutputStream(fileName));
BufferedInputStream in = new BufferedInputStream(
image.getBinaryStream()); int c;
while ((c = in.read()) != -1) {
out.write(c);
}
in.close();
out.close();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(rs, st, con);
}
} public static void main(String[] args) throws Exception {
ImageLibraryService service = new ImageLibraryService(); if (args.length == 3) {
service.addImage(Long.parseLong(args[0]), args[1], args[2]);
} else {
service.restoreImage(Long.parseLong(args[0]), args[1]);
}
}}执行的时候用添加参数1 top1 top1.jpg结果就出这个问题,那老师在演示时就完全没有这样的问题。不知道是怎么回事。java.lang.NullPointerException
at com.allanlxf.util.JdbcUtil.close(JdbcUtil.java:27)
at core20.sql3.ImageLibraryService.addImage(ImageLibraryService.java:45)
at core20.sql3.ImageLibraryService.main(ImageLibraryService.java:120)
Exception in thread "main" java.lang.NullPointerException
at com.allanlxf.util.JdbcUtil.close(JdbcUtil.java:43)
at core20.sql3.ImageLibraryService.addImage(ImageLibraryService.java:76)
at core20.sql3.ImageLibraryService.main(ImageLibraryService.java:120)求高手解决。
驱动:ojdbc6.jar

解决方案 »

  1.   

    当然,如果直接用setBinaryStream(参数1, 参数2, 参数3)方法,前面不用ResultSet,可以成功存取。但是为什么用ResultSet后,那个老师的演示没有问题,我的代码就出异常呢?谢谢各位了!新手
      

  2.   

    top1.jpg改成完整路径试试,怀疑路径问题不对
      

  3.   

    直接用setBinaryStream(参数1, 参数2, 参数3)方法,前面不用ResultSet,可以成功存取。但是为什么用ResultSet后,那个老师的演示没有问题,我的代码就出异常呢?谢谢各位了!新手
      

  4.   


    路径没有问题,用过完整路径。我在1楼写的那个异常好像有问题。报的是java.sql.SQLException: 调用中的无效参数。还有我在百度提问有一个和这个差不多的例子,http://zhidao.baidu.com/question/320918615.html。也是这种异常。不明白是为什么。
      

  5.   

    现在报的是java.sql.SQLException: 调用中的无效参数
    这个异常打印异常栈信息最下边一条是
    blob.setBinaryStream(0);这句有错。实在是想不出来为什么了。视频中老师的代码一模一样的,却执行得很好。
      

  6.   

    oracle用blob.setBinaryStream(0);可以 db2必须是blob.setBinaryStream(1);
      

  7.   

    看下你的   JdbcUtil.close 方法 。里面 关闭的对象的时候 ,有没有先判断 参数是否为空 。
    应该这样子格式关闭。
    if(rs == null){ 
      rs.close() ;
    }