【问题标题】:ArrayIndexOutOfBoundsException xmlserializerArrayIndexOutOfBoundsException xmlserializer
【发布时间】:2017-06-27 05:41:21
【问题描述】:

我有一个使用XMLserializer 创建kml 文件的代码。它可以很好地创建不同的多边形,但是我在关闭我真的不理解的 xml 时出错。

02-09 10:03:02.919 24712-26301/com.example.accgps W/System.err: java.lang.ArrayIndexOutOfBoundsException: length=24; index=-3
02-09 10:03:02.919 24712-26301/com.example.accgps W/System.err:     at org.kxml2.io.KXmlSerializer.endTag(KXmlSerializer.java:493)
02-09 10:03:02.919 24712-26301/com.example.accgps W/System.err:     at com.example.accgps.KMLHelper.SerialEnd(KMLHelper.java:150)
02-09 10:03:02.919 24712-26301/com.example.accgps W/System.err:     at com.example.accgps.RefreshKML$1.run(RefreshKML.java:283)
02-09 10:03:02.919 24712-26301/com.example.accgps W/System.err:     at java.lang.Thread.run(Thread.java:818)*

SerialEnd() 的调用是在创建多边形后完成的,效果很好,所以我不知道为什么它超出了范围:

        for (s = 0; s < PolyArray.size(); s++) {
            polygon = PolyArray.get(s);
            kH.SerialPlacePol("Tramo " + i, polygon);
            i++;
        }
        Log.i(TAG, "RefreshKML: se han creado " + (i - 1) + " tramos");
        editor.putInt("poligonos", i);
        editor.apply();
    } else {
        Toast.makeText(getApplicationContext(),"No existen datos suficientes para "+
        "generar el archivo KML",Toast.LENGTH_SHORT).show();
    }
} else {
    Log.d(TAG, "RefreshKML: No hay datos de GPS suficientes");
}

if (end) { //Solo cierra el archivo si se termina la recopilación de datos
    kH.SerialEnd();
    end = false; //En caso de que no se completó esta opción
    copyAllFiles();
}

错误是在SerialEnd()方法的第一行引发的:

public void SerialEnd () {
    try{
        serializer.endTag(null,"Document"); //THIS IS THE LINE WITH THE ERROR
        serializer.endTag(null,"kml");
        //serializer.endDocument();
        //serializer.flush();
        fileos.close();
        Log.d(TAG,"KMLHelper: SerialEnd cierra archivo KML");
    }catch(Exception e){
        Log.d(TAG,"KMLHelper: Exception occured in SerialEnd");
        e.printStackTrace();
    }
}

我已经尝试在其他问题中找到答案,但我没有找到合适的解决方案,也许序列化程序已关闭,但我还没有这样做

这就是我创建XMLserializer 的方式,以防您在这里看到问题:

public KMLHelper(File file) {
    try{
        serializer.endTag(null, "Document");
        serializer.endTag(null, "kml");
        serializer.endDocument();
        serializer.flush();
        Log.d(TAG,"KMLHelper: SerialEnd cierra archivo KML");
    }catch(Exception e){
        Log.d(TAG,"KMLHelper: Exception occurred in SerialEnd");
        e.printStackTrace();
    }finally {
        try {fileos.close();} catch (IOException io) {io.printStackTrace();}
    }
}

编辑:我在SerialEnd() 中做了一些更改,将文件的关闭放在finally 中并取消注释endDocument 方法。我还控制了对创建 xml 文件的线程的访问,并与控制所有多边形的 XML 文件创建的意图的创建同步。

【问题讨论】:

    标签: java android xml-serialization indexoutofboundsexception xmlserializer


    【解决方案1】:

    解决了!问题是它正在创建 2 个 XMLserializer 处理同一个文件。我更改了服务调用方法的方式,现在我使用后台线程进行调用,并使用 join() 控制执行,因此一次只有 1 次执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-03
      • 2019-06-19
      • 2014-05-19
      • 2013-02-25
      • 2013-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多