IDEA 调试无法进入while循环 求解

「已注销」 2019-10-02 09:57:24
使用JDBC读取数据库中的Blob类型数据保存到指定位置,并将其它信息封装到一个类中,出了点问题,想调试但是奈何不了while循环~~

Servlet的doPost方法中调用了JDBC类中的searchBlob方法,传入数据库连接、数据存储类的class,sql语句,存储Blob类型数据的路径以及sql语句中占位符的替代量,以期将Blob类型数据存入指定位置,并且返回数据存储类的所有实例的集合

把断点设在while (result.next())的外面,调试的时候直接跳过了整个循环,然后直接跳到了finally中关闭资源,但是输入流与输出流的值为null,出错了,把断点设在while循环的第一句,当按f8执行到while中for循环的第一句(从结果集取数据)时报错,显示结果集已经关闭,然而并没有任何关闭结果集的操作(我试了另一个没有问题类似的方法,调试同样的while循环的时候也出了同样的错误),怀疑debug还是跳过了while循环



求助大佬

Servlet实现类的doPost方法

String sql = "SELECT * FROM resource WHERE id = ?";
String[] path = new String[1];
path[0] = "F:\\program design\\JavaWeb\\web\\resource\\2.png";
ArrayList<Datas> arrayList = JDBC.searchBolb(connection, Datas.class, sql, path, 1);
PrintWriter writer = response.getWriter();
for (Datas d : arrayList) {
writer.println(d);
}


JDBC的searchBolb方法

public static <T> ArrayList<T> searchBolb(Connection connection, Class<T> clazz, String sql, String[] resourcePath, Object... args) {
//数据库表中最后一个字段为Blob类型
//输出类中封装Blob资源输出地址
PreparedStatement ps = null;
ResultSet result = null;
ResultSetMetaData rsmd = null;
InputStream is = null;
FileOutputStream fos = null;
int resourcePathNumber = 0;
ArrayList<T> collection = new ArrayList<T>();
try {
ps = connection.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
result = ps.executeQuery();
rsmd = result.getMetaData();




//无法调试这个while循环
while (result.next()) {
int columnCount = rsmd.getColumnCount();
T t = clazz.getDeclaredConstructor().newInstance();
for (int i = 0; i < columnCount - 1; i++) {
Object columnValue = result.getObject(i + 1);
String columnLabel = rsmd.getColumnLabel(i + 1);
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, columnValue);
}




Blob blob = result.getBlob(columnCount);
String blobLabel = rsmd.getColumnLabel(columnCount);
Field field = clazz.getDeclaredField(blobLabel);
field.setAccessible(true);
field.set(t, resourcePath);
is = blob.getBinaryStream();
fos = new FileOutputStream(resourcePath[resourcePathNumber++]);
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
collection.add(t);
}
} catch (SQLException | IOException | NoSuchFieldException | NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
e.printStackTrace();
} finally {
try {
ps.close();
is.close();
fos.close();
} catch (SQLException | IOException e) {
e.printStackTrace();
}
if (collection == null) {
System.out.println("Failed to search");
}
return collection;
}
}
...全文
1321 36 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
bingxie60 2019-10-08
  • 打赏
  • 举报
回复
啥家伙都看不懂
liuwei07111 2019-10-08
  • 打赏
  • 举报
回复
mark down
Mars'Ares 2019-10-07
  • 打赏
  • 举报
回复
hashNext 老哥
luj_1768 2019-10-06
  • 打赏
  • 举报
回复
有些操作,系统不允许中断,单步执行会出错或者结果是错的。数据库操作和sql语句要求比较严,只能批量运行,不许单步跟踪。
陈柏祁 2019-10-05
  • 打赏
  • 举报
回复
具体的报错日志堆栈打出来看下呢?
bugpool 2019-10-04
  • 打赏
  • 举报
回复
应该是异常了,在调试界面有异常断点,打开捕获所有异常短点,自然就会停下来了。
「已注销」 2019-10-03
  • 打赏
  • 举报
回复
2019-10-03 11:07:54,846 [2603852] INFO - ij.compiler.impl.CompileDriver - COMPILATION STARTED (BUILD PROCESS) 2019-10-03 11:07:54,847 [2603853] INFO - j.compiler.server.BuildManager - Using preloaded build process to compile F:\program design\JavaWeb 2019-10-03 11:07:54,848 [2603854] INFO - .ScalaCompilerReferenceService - [compiler indices] onCompilationStart. active indexing phases: 1 2019-10-03 11:07:55,268 [2604274] INFO - .ScalaCompilerReferenceService - [compiler indices] startIndexing. clean build: false 2019-10-03 11:07:56,056 [2605062] INFO - .ScalaCompilerReferenceService - [compiler indices] finishIndexing. 2019-10-03 11:07:56,121 [2605127] INFO - lij.compiler.impl.CompilerUtil - COMPILATION FINISHED (BUILD PROCESS); Errors: 0; warnings: 0 took 1290 ms: 0 min 1sec 2019-10-03 11:07:56,122 [2605128] INFO - .ScalaCompilerReferenceService - [compiler indices] startIndexing. clean build: false 2019-10-03 11:07:56,146 [2605152] INFO - s.CompilerReferenceServiceBase - backward reference index reader is opened 2019-10-03 11:07:56,178 [2605184] INFO - .ScalaCompilerReferenceService - [compiler indices] onCompilationFinish. success: true, active indexing phases: 0 2019-10-03 11:07:56,711 [2605717] INFO - j.compiler.server.BuildManager - BUILDER_PROCESS [stdout]: Build process started. Classpath: C:/Program Files/JetBrains/IntelliJ IDEA 2019.2.2/plugins/java/lib/jps-launcher.jar;F:/ProgramSupport/Java/lib/tools.jar 2019-10-03 11:07:56,815 [2605821] INFO - j.compiler.server.BuildManager - BUILDER_PROCESS [stderr]: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 2019-10-03 11:07:56,815 [2605821] INFO - j.compiler.server.BuildManager - BUILDER_PROCESS [stderr]: SLF4J: Defaulting to no-operation (NOP) logger implementation 2019-10-03 11:07:56,815 [2605821] INFO - j.compiler.server.BuildManager - BUILDER_PROCESS [stderr]: SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 应该是这个吧,也找不到别的了 3Q
oh_Maxy 版主 2019-10-03
  • 打赏
  • 举报
回复
具体的报错日志堆栈打出来看下呢?
「已注销」 2019-10-03
  • 打赏
  • 举报
回复
f5和f6不是单步调试(根本不是调试····),可能我们版本不太一样,f8是不进入方法体,除此之外还是单步调试,外面的connection没有关闭,我试了另外一个没有问题的方法,报的错误还是结果集关闭(不是你说的连接关闭了),另外我是在循环里打的断点·····,还打了好几个······· 求助谢谢
oh_Maxy 版主 2019-10-03
  • 打赏
  • 举报
回复
断点可以打多个,如果怀疑没进循环,就在循环里打个断点呗。
asd1239323428 2019-10-03
  • 打赏
  • 举报
回复
额,程序改好了,不出错了(硬刚代码~~),但是调试还是没有办法,我想应该是IDEA自己的bug,没救了
qybao 2019-10-03
  • 打赏
  • 举报
回复
你应该用单步调试(f5后是f6),你用f8直接就执行到底,你怎么 知道进没进while循环代码?
你把断点设在while循环的第一句,能够停在断点处,就已经说明能进入while循环,只是后面的代码出错了
searchBolb的Connection是参数传进来的,外面对Connection做了什么操作是不可知的,也有可能连接真的关闭了
你把断点设在ps = connection.prepareStatement(sql);一行,然后再单步跟踪试试
weixin_45711534 2019-10-03
  • 打赏
  • 举报
回复
额,程序改好了,不出错了(硬刚代码~~),但是调试还是没有办法,我想应该是IDEA自己的bug,没救了
「已注销」 2019-10-03
  • 打赏
  • 举报
回复
引用 27 楼 qybao 的回复:
难道是getMetaData出问题了,你单步调试时,getMetaData的下一步能停的,不会直接跑到finally去吧,也就是断点在int j=0这样可以停的,是吧? 如果这行不能停,说明出异常了,你可以追加捕获一下IllegalStateException异常看看
额,程序改好了,不出错了(硬刚代码~~),但是调试还是没有办法,我想应该是IDEA自己的bug,没救了 多谢解答
qybao 2019-10-03
  • 打赏
  • 举报
回复
难道是getMetaData出问题了,你单步调试时,getMetaData的下一步能停的,不会直接跑到finally去吧,也就是断点在int j=0这样可以停的,是吧?
如果这行不能停,说明出异常了,你可以追加捕获一下IllegalStateException异常看看
「已注销」 2019-10-03
  • 打赏
  • 举报
回复
引用 25 楼 qybao 的回复:
while之前,也就是result.next之前,result指针是停在第一行之前的,next后才会停在第一行,而你的结果集为空,所以没有第一行,所以当执行next返回false,跳过while了,你的debug变量跟踪如果真是返回true,就必然能进入while 所以最好就是你把结果集的行数打印出来看看
qybao 2019-10-03
  • 打赏
  • 举报
回复
while之前,也就是result.next之前,result指针是停在第一行之前的,next后才会停在第一行,而你的结果集为空,所以没有第一行,所以当执行next返回false,跳过while了,你的debug变量跟踪如果真是返回true,就必然能进入while
所以最好就是你把结果集的行数打印出来看看
「已注销」 2019-10-03
  • 打赏
  • 举报
回复
总不能是取了个元数据把结果集给关了·········
「已注销」 2019-10-03
  • 打赏
  • 举报
回复
引用 22 楼 qybao 的回复:
从你的图像上来看就没取到结果集啊,所以next为false,跳过while了 你之前是怎么进到while里的for的? while之前打印一下结果集行数 result.last(); Systrm.out.println(result.getRow()); result.beforeFirst();
我在图上写了,在while上面一行的时候next的值是true,怎么没有结果集了呢,不过运行到while这一行的时候next为false 我目前写的这个程序结果集只有一行,出现这个情况还有可能,但是我改过程序,当结果集有多行时依旧是上述情况,所有才有了一切的烦恼
qybao 2019-10-03
  • 打赏
  • 举报
回复
从你的图像上来看就没取到结果集啊,所以next为false,跳过while了
你之前是怎么进到while里的for的?
while之前打印一下结果集行数
result.last();
Systrm.out.println(result.getRow());
result.beforeFirst();
加载更多回复(16)

51,402

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧