【SNAIL】CONNER 2021-06-30 16:43 采纳率: 50%
浏览 320
已结题

BufferUnderflowException怎么处理这个异常

项目上传一个大约2G的shipe文件 需要转换坐标,平时上传小的文件挺正常的, 这次上传了一个大的文件就报BufferUnderflowException异常了,有大神知道怎么回事么, 代码如下:

public static JSONObject generateW84Shapefile(
            SimpleFeatureSource featureSource, String shapeFileName, File inputFolder, File outputFolder,
            boolean keepFileName, int fileCoordinateType) throws JSONException {
        JSONObject jo = new JSONObject();
        try {
            if (!outputFolder.exists()) {
                outputFolder.mkdirs();
            }
            SimpleFeatureType schema = featureSource.getSchema();
            CoordinateReferenceSystem dataCRS = schema.getCoordinateReferenceSystem();
            if (dataCRS == null) { // can't find projection
                log.error("Error: Can't find the projection of the uploaded shapefile.");
                jo.put("Error", "Can't find the projection of the uploaded shapefile.");
            } else {
                Integer epsgCode = -1;
                try {
                    epsgCode = CRS.lookupEpsgCode(dataCRS, true);
                    log.info("EPSG code of the source feature: " + epsgCode);
                } catch (Exception ee) {
                    log.error("Error in finding the EPSG code of the source feature", ee);
                }
                int count = 0;
                if (epsgCode == null || epsgCode != 4326 || fileCoordinateType != 1) {
                    CoordinateReferenceSystem wgs84CRS = CRS.decode("EPSG:4326");
                    File newShapeFile = new File(outputFolder,
                            shapeFileName + ((keepFileName || fileCoordinateType == 1) ? ".shp" : "_gcj02.shp"));
                    DataStoreFactorySpi factory = new ShapefileDataStoreFactory();
                    Map<String, Serializable> create = new HashMap<String, Serializable>();
                    create.put("url", newShapeFile.toURI().toURL());
                    create.put("create spatial index", Boolean.TRUE);
                    DataStore dataStore = factory.createNewDataStore(create);
                    SimpleFeatureType featureType = SimpleFeatureTypeBuilder.retype(schema, wgs84CRS);
                    dataStore.createSchema(featureType);
                    // Get the name of the new Shapefile, which will be used to
                    // open the FeatureWriter
                    String createdName = newShapeFile.getName().substring(0, newShapeFile.getName().lastIndexOf('.'));
                    Transaction transaction = new DefaultTransaction("Reproject");
                    FeatureWriter<SimpleFeatureType, SimpleFeature> writer = dataStore
                            .getFeatureWriterAppend(createdName, transaction);
                    SimpleFeatureCollection featureCollection = featureSource.getFeatures();
                    SimpleFeatureIterator iterator = featureCollection.features();
                    boolean projected = true;
                    MathTransform transform = null;
                    boolean lenient = true; // allow for some error due to
                    // different datums
                    transform = CRS.findMathTransform(dataCRS,wgs84CRS, lenient);
                    try {
                        while (iterator.hasNext()) {  **//这一行报的错**
                            // copy the contents of each feature and transform
                            // the geometry
                            SimpleFeature feature = iterator.next();
                            SimpleFeature copy = writer.next();
                            copy.setAttributes(feature.getAttributes());
                            Geometry geometry = (Geometry) feature.getDefaultGeometry();
                            Geometry geometry2;
                            if (epsgCode == null || epsgCode != 4326) {
                                geometry2 = JTS.transform(geometry, transform);
                            } else {
                                geometry2 = (Geometry) geometry.clone();
                            }
                            if(fileCoordinateType == 2) {//bd09
                                geometry2 = GCJConverter.bd09toGCJ(geometry2);
                            }else if(fileCoordinateType == 3) {
                                geometry2 = GCJConverter.toGCJ(geometry2);
                            }
                            
                            copy.setDefaultGeometry(geometry2);
                            writer.write();
                            count++;
                        }
                        writer.close();
                        transaction.commit();
                    } catch (Exception e) {
                        e.printStackTrace();
                        projected = false;
                        log.error("Error: Can't reproject the uploaded shapefile.", e);
                        log.info("count===>"+count);
                        transaction.rollback();
                    } finally {
                        transaction.close();
                        dataStore.dispose();
                        iterator.close();
                    }
                    if (!projected) {
                        jo.put("Error", "Can't reproject the uploaded shapefile.");
                    } else {
                        shapeFileName = createdName;
                        jo.put("reprojected", projected);
                    }
                }
            }
        } catch (Exception e) {
            log.error("Error: Can't reproject the uploaded shapefile.", e);
            jo.put("Error", "Can't reproject the uploaded shapefile.");
        }
        jo.put("shapefileName", shapeFileName);
        
        return jo;
    }

报错信息:

java.nio.BufferUnderflowException
        at java.nio.Buffer.nextGetIndex(Buffer.java:500)
        at java.nio.DirectByteBuffer.get(DirectByteBuffer.java:249)
        at org.geotools.data.shapefile.dbf.DbaseFileReader.read(DbaseFileReader.java:427)
        at org.geotools.data.shapefile.dbf.DbaseFileReader.readRow(DbaseFileReader.java:321)
        at org.geotools.data.shapefile.ShapefileFeatureReader.hasNext(ShapefileFeatureReader.java:187)
        at org.geotools.data.store.ContentFeatureCollection$WrappingFeatureIterator.hasNext(ContentFeatureCollection.java:143)
        at com.XXX.util.ProjectUtils.generateW84Shapefile(ProjectUtils.java:203)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
        at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:151)
        at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:172)
        at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:195)
        at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104)
        at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:384)
        at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:342)
        at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:101)
        at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:271)
        at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
        at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
        at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:297)
        at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:254)
        at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1030)
        at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:377)
        at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
        at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344)
        at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:1025)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
        at org.apache.coyote.ajp.AjpNioProcessor.process(AjpNioProcessor.java:175)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1775)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1734)
  • 写回答

2条回答 默认 最新

  • 404警告 2021-06-30 16:48
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月26日
  • 已采纳回答 10月18日

悬赏问题

  • ¥15 对于这个问题的解释说明
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。