java - 尝试解决 - 字符串索引超出范围

标签 java string exception range substring

我收到此错误:

Carregando os mapas: Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String 
index out of range: 4800
        at java.lang.String.substring(Unknown Source)
        at estaticos.Criptografador.descompilarMapaData(Criptografador.java:147)
        at variables.Mapa.<init>(Mapa.java:1306)
        at estaticos.GestorSQL.CARREGAR_MAPAS(GestorSQL.java:696)
        at estaticos.MundoDofus.criarServer(MundoDofus.java:1398)
        at estaticos.VrauEMU.main(VrauEMU.java:130)

我正在尝试解决,但我做不到。

我的代码:(原来的模拟器是西类牙语,所以之前的celula = celda)

public static Map<Integer, Celula> descompilarMapaData(Mapa mapa, String dData) {
        Map<Integer, Celula> celulas = new TreeMap<Integer, Celula>();
        for (int f = 0; f < dData.length(); f += 10) {
            String CellData = dData.substring(f, f + 10);
            List<Byte> celulaInfo = new ArrayList<Byte>();
            for (int i = 0; i < CellData.length(); i++)
                celulaInfo.add((byte) getNumeroPorValorHash(CellData.charAt(i)));
            int caminhavel = (celulaInfo.get(2) & 56) >> 3;// 0 = nao, 1 = meio, 4 = sim
            boolean linhaDeVisao = (celulaInfo.get(0) & 1) != 0;
            int layerObject2 = ( (celulaInfo.get(0) & 2) << 12) + ( (celulaInfo.get(7) & 1) << 12) + (celulaInfo.get(8) << 6)
                    + celulaInfo.get(9);
            boolean layerObjeto2Interac = ( (celulaInfo.get(7) & 2) >> 1) != 0;
            int objeto = (layerObjeto2Interac ? layerObject2 : -1);

            celulas.put(f / 10, new Celula(mapa, f / 10, caminhavel != 0, linhaDeVisao, objeto));
        }
        return celulas;

最佳答案

问题在于迭代边界:

 for (int f = 0; f < dData.length(); f += 10) {
            String CellData = dData.substring(f, f + 10);

除非dData.length()恰好能被 10 整除,这会迭代出界。为了说明这一点,下面的代码片段将尝试读取 0-10 和 10-20,即使虚拟数组边界仅为 0-15。

for (let i = 0; i < 25; i += 10)
  console.log(i, i + 10);

也许只是将上限限制为 substring.length()就足够了:

 for (int f = 0; f < dData.length(); f += 10) {
            int upperBound = min(f + 10, dData.length());
            String CellData = dData.substring(f, upperBound));

关于java - 尝试解决 - 字符串索引超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61070351/

相关文章:

c - 指针和字符串的段错误

java - JOptionPane 从 showOptionDialog 获取字符串

c# - 解析字符串包含一天中的时间

ruby-on-rails - 可以在 Rails Controller 中渲染并引发异常吗?

java - C++ 中的反射

Java多线程同步方法有两个线程

vb.net - 如何使用多字符分隔符分割字符串并维护分隔符

ruby - 在 Ruby 中拯救 bash/系统 STDERR

java - 如何在android上进行内部存储和拉取?

java - 如何在java中使用digester读取命名空间前缀