开发者社区> 问答> 正文

JFinal读取空的blob数据报错?报错

@JFinal 你好,想跟你请教个问题:Jfinal读取Oracle数据库中Blob数据时,Blob有值没事,但是Blob为空时就报错,报错信息:

[ERROR]-[Thread: http-bio-8888-exec-9]-[com.jfinal.core.ActionHandler.handle()]: /zd
com.jfinal.plugin.activerecord.ActiveRecordException: java.lang.NullPointerException
	at com.jfinal.plugin.activerecord.Model.find(Model.java:455)
	at com.zdnw.model.IndexSiteInfo.findZDColumn(IndexSiteInfo.java:140)
	at com.zdnw.controller.ZDController.index(ZDController.java:69)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:55)
	at com.zdnw.interceptor.IndexSiteInfoInterceptor.intercept(IndexSiteInfoInterceptor.java:11)
	at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:51)
	at com.jfinal.plugin.activerecord.tx.TxByRegex.intercept(TxByRegex.java:60)
	at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:51)
	at com.jfinal.plugin.activerecord.tx.TxByRegex.intercept(TxByRegex.java:60)
	at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:51)
	at com.jfinal.plugin.activerecord.tx.TxByRegex.intercept(TxByRegex.java:60)
	at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:51)
	at com.jfinal.plugin.activerecord.tx.TxByActionMethods.intercept(TxByActionMethods.java:57)
	at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:51)
	at com.jfinal.core.ActionHandler.handle(ActionHandler.java:73)
	at com.zdnw.handler.GlobalHandler.handle(GlobalHandler.java:20)
	at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
	at oracle.sql.BLOB.getBytes(BLOB.java:344)
	at oracle.jdbc.driver.OracleBlobInputStream.needBytes(OracleBlobInputStream.java:181)
	at oracle.jdbc.driver.OracleBufferedStream.readInternal(OracleBufferedStream.java:169)
	at oracle.jdbc.driver.OracleBufferedStream.read(OracleBufferedStream.java:143)
	at oracle.jdbc.driver.OracleBufferedStream.read(OracleBufferedStream.java:132)
	at com.jfinal.plugin.activerecord.ModelBuilder.handleBlob(ModelBuilder.java:83)
	at com.jfinal.plugin.activerecord.ModelBuilder.build(ModelBuilder.java:57)
	at com.jfinal.plugin.activerecord.Model.find(Model.java:437)
	at com.jfinal.plugin.activerecord.Model.find(Model.java:453)
	... 36 more



展开
收起
爱吃鱼的程序员 2020-06-12 11:16:42 644 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

      这是因为com.jfinal.plugin.activerecord.ModelBuilder.handleBlob(Blobblog)方法的 is=blob.getBinaryStream();这一行代码返回的is对象为null,所以添加一个判断,当is为null时直接returnnull,并且在finally块中也判断一下内有在is!=null时才关闭InputStream,具体的代码如下:<preclass="brush:java;toolbar:true;auto-links:false;">publicstaticbyte[]handleBlob(Blobblob)throwsSQLException{if(blob==null)returnnull;InputStreamis=null;try{is=blob.getBinaryStream();if(is==null)returnnull;byte[]data=newbyte[(int)blob.length()];is.read(data);returndata;}catch(IOExceptione){thrownewRuntimeException(e);}finally{if(is!=null)try{is.close();}catch(IOExceptione){thrownewRuntimeException(e);}}}



    位置是对的,但是我这个还有个小问题,就是Blob是空的情况下,is是不为空的,但是data值为null,所以我又加了个data长度的判断<preclass="brush:java;toolbar:true;auto-links:false;">publicstaticbyte[]handleBlob(Blobblob)throwsSQLException{if(blob==null){returnnull;}InputStreamis=null;try{is=blob.getBinaryStream();if(is==null){returnnull;}byte[]data=newbyte[(int)blob.length()];if(data.length<=0){returnnull;}is.read(data);returndata;}catch(IOExceptione){thrownewRuntimeException(e);}finally{if(is!=null){try{is.close();}catch(IOExceptione){thrownewRuntimeException(e);}}}}



    回复<aclass='referer'target='_blank'>@Aenocyon:这样就更完善了,赞一个,下一版的jfinal已改进了<aclass='referer'target='_blank'>@JFinal

    2020-06-12 11:17:01
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载