【问题标题】:Trying to solve - String index out of range试图解决 - 字符串索引超出范围
【发布时间】:2020-04-06 23:09:27
【问题描述】:

我收到此错误:

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;

【问题讨论】:

    标签: java string exception range substring


    【解决方案1】:

    问题在于迭代边界:

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

    除非dData.length() 恰好能被 10 整除,否则这将迭代超出范围。为了说明,下面的 sn-p 将尝试读取 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));
    

    【讨论】:

      【解决方案2】:
      public static Map<Integer, Celula> descompilarMapaData(Mapa mapa, String dData) {
              Map<Integer, Celula> celulas = new TreeMap<Integer, Celula>();
              //changes are here
                for (int f = 0; f <= dData.length() - 10; 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;
          }
      

      试试这个,我认为它对你有用。

      【讨论】:

        【解决方案3】:

        谢谢你的回答:)

        我放代码:

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

        我现在得到了这个:

        Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 0
                at java.util.ArrayList.rangeCheck(Unknown Source)
                at java.util.ArrayList.get(Unknown Source)
                at estaticos.Criptografador.descompilarMapaData(Criptografador.java:152)
                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)
        

        我觉得差不多了

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-13
          • 1970-01-01
          • 2016-02-19
          • 2012-03-02
          • 2016-02-10
          • 2021-01-30
          相关资源
          最近更新 更多