java.lang.StringIndexOutOfBoundsException:使用PolyUtil.decode时

java.lang.StringIndexOutOfBoundsException:使用PolyUtil.decode时,java,android,string,exception,indexoutofboundsexception,Java,Android,String,Exception,Indexoutofboundsexception,我对安卓系统比较陌生,目前正在从事安卓项目。在这里,我偶然发现了一个关于解码谷歌地图加密地图字符串的问题。在这里,短弦可以很好地工作,而长弦则会让它崩溃 这是我解码map字符串的方法 public static List<LatLng> decode2(String encoded) { List<LatLng> track = new ArrayList<>(); int index = 0; int lat = 0, lng =

我对安卓系统比较陌生,目前正在从事安卓项目。在这里,我偶然发现了一个关于解码谷歌地图加密地图字符串的问题。在这里,短弦可以很好地工作,而长弦则会让它崩溃

这是我解码map字符串的方法

public static List<LatLng> decode2(String encoded) {

    List<LatLng> track = new ArrayList<>();
    int index = 0;
    int lat = 0, lng = 0;

    while (index < encoded.length()) {
        int b, shift = 0, result = 0;
        do {
            b = encoded.charAt(index++) - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);
        int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
        lat += dlat;

        shift = 0;
        result = 0;
        do {
            b = encoded.charAt(index++) - 63; // Error at this line.
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);
        int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
        lng += dlng;

        LatLng p = new LatLng( (double)lat/1E5, (double)lng/1E5 );
        track.add(p);
    }
    return track;
}
有关字符串:

argtJ}vg`A{F}Cw@aAi@eAy@oCmBeJWw@mBqDi@}Aw@aEoA_Iu@wC_BoDwB{CmAwB}@iAsBkBeAmAeE}Cg@MeCoB{CsDuJwMgHcG_E{DoHoKaByAq@_@iB]}CQu@@s@NyH~Bk@?k@O{AaBeAgBmDsD{CaEoD{HwE}IoDiGwCqEgB_D{HeM}CuFu@cAcAs@g@Mu@Ik@F_AdAqArCeAzA}@|@iB~@kADUGqBkA_EaGmEuE}DuDsB}B}FcJiDwEgAiA_C{AkB}AqCaEeAsBqA}C_@sAUyBQoDW_CYoBYw@]_@{Bm@gBuA{D{EmDyEy@qAeBqDwBcCgBcBa@Q]?_Bh@{@CcEkAw@i@u@{AsGiQa@w@YYkGqD_F{Eu@i@_A_@m@Ck@LwHbEk@P_A?q@Qs@m@e@oAWgBq@wLc@wDg@aDoEwT_AqDsAkEs@cDe@}Cu@eIe@wC{@kBgAiAwA}@iBo@_@Y{@oAm@qAc@eAsAcEoBkHo@cDe@kDM_BKoCEaP?sDH_IRoGj@_Lp@mK^kE^gBzBiG~AyFhA}Gh@aEBeCK_Bg@yAc@c@c@SwCk@{AcAqByCYkAAiANkB`A_H^mB`@cDDu@EgF@cETeJ@eDMcFMwA}D_YKaAEwALeBl@yCt@uChAmCLeA@o@CcAMeBGaGO{BKm@}AwDgCiFKMhAgAhAaBnA_CfCkBxA{A~@sA`B{Cl@uAbA{A~CqB~@a@lIaFvBeAvAE`AZdABlCgArA_@xCUz@_@X]nA}Bd@iAtAyEbAcBpAcAnD_BfGuAz@e@xDgDfB_Eb@u@XUr@Ef@FvB\\vD`A|B?dAU|DGhA_@zBuAz@YZAr@Ff@ZnBnB`DpAX@rB]vD]f@Sf@o@|EoMrDcHtAyEr@aErAoGhBwFp@eA~NyGrDuAxFuAjFYf@Of@]tBaChEwG~B_AnAuAdBuC`AuBv@cA`AeBh@kAn@cCVe@j@Ut@Gb@Up@s@p@mAn@i@v@DhBdAhDrAjAWvAw@bA{@n@{@n@qBXcB\\uDR{@Zu@fAaBu@yHM}@ISa@m@aAu@qBa@WQaAeBm@gC}@gGKwEM{Aq@aDOcBC_A@gJC_FFgBLs@tAcExAaFx@uAvAq@Xy@Do@CwDDm@p@aDFq@J{EF{@r@{E?eAKgAmAiFe@yDMkBByCZ}DDuBMmFa@iL?gDH}BRcALQIYwAcBe@cB_@{@gAoAYm@k@M}@\\g@ASMKSYcA`A}Ab@eAjBmGxBsFrGyJKRCI]mD}@iNA}BDeA_@mBY_@WIeBN}@Oy@aAyAqDy@}AcAmAy@a@c@EYNyAhDOTYJi@@kAOoBm@oB_A_@m@UeAW{EI}@Oy@]aA_@k@o@q@_Aq@sC}@qB]aBBsCd@u@Eq@oA_@sAiC{Kk@}C]mAuA}Bm@iBs@}DyA}Ki@kCmAcByFwFeBg@{AEIGc@_BoCuOo@sCYy@aFaGg@a@O?UJWZcCvFm@dAeCrBw@j@sAd@uBo@o@m@uBsCw@cC{@{DUaBQmBSmDQcBeA{ESiB`BmElDeH~AsCz@cCpD{Mr@kBl@gCpAyHZkAt@iBlC{ChBsANA^NzAtAlAn@p@NnAK~BeAtCy@`J{Dh@_@xA}Ab@k@HWTiBNsBpAaD^yB`@iAh@m@~@kBvBoBZi@x@uB|@}@Tc@tAoGzCaH~AqG~@sCh@c@vAOjBg@V_@ZkA^w@z@uAx@q@`AYt@a@pAqApCE\\K\\]f@s@jAaDh@eApByBb@oA`@iBVq@hAeBbA_Dr@oCb@c@|C\\tDM|EJp@]vBmCn@i@^IhA@pCbAfMnIt@PfCS~@FzBlCjAp@vB^vCLZH`CzApE`AnBNpF?d@L\\`@HVd@tBRbBZlA^n@`@Fn@O`@Rn@|BZt@Nn@Bp@HXr@|@f@`Al@f@rA?dAPZd@h@zA`@`@j@XdB?|CdA^BjB}@jAJl@UtAM`Bk@TWv@yAr@]b@KfBTZK|@y@j@aBRE\\^dAlDdAxAd@dAVzAP|BX|@vClCzAtBjAlA`Bt@nAJ|JmDhA[n@CtB|A~IhDt@AdBwAxHaKpAaCd@oAr@mDpAwK^yEpA}MLsBTqA`@wAvA}DnCeH|CgK`D_J\\e@ZOfEcBrBg@jAe@lBkCjAmBlDuEdBaB~CyBdAeAjEuFb@_@d@Wf@G|BX|@@jBi@z@g@|AuCvAqD~E}KdDkKvAqD\\i@r@k@dBOZFh@~@P@hDoAx@_Ab@xB^tDt@`GNxBClCQbF?bDHnCCvAk@rFu@rEi@dEIhAQlFo@zHInLGzCSlCYhC}@vECdADl@~BQvAVtAlAnBhCrAhA~A`@nBKjG_C|Cg@bD_A`BcAvGqF|AcAzCwCvAo@vAIxBf@vA|@hA`Az@lA|@lBl@zBXtAf@~Ej@hC\\p@^\\n@Pz@DdFy@~Bm@rEkCt@s@hGsJnAsAjG_Fn@U~AWvADzBp@~B`AxFxC~C~@fCBjCg@hGcBdAKf@BfA`@`ClBlD~DnBjBd@Z~@Z~AD~@W~@i@fBo@zD_AlDMpBBbBf@zCnCvFfHrApBfD|DfN|QdBzANFn@Ap@Q|CeB~CeCtB}@fAE`AFdBn@`CrAlLlItBhAjGnCjBl@xDv@|`@pGfDdAnFjEb@h@jArB`BtBrCzAtA^d@?|@e@bB_B~CoDt@e@xBu@jA?xEe@~HwF|Bw@fBCzE^~S`AfAAtBc@hFs@zAgA`CyC`BaBxL{KtEiDVKl@Af@Vh@l@tAvCnCnMl@zBj@fAbBnAx@rAjBdK|@~C`@dA~AnCv@`B~@rAf@XvBFhCp@}HpP_@~AQhA_@xDGbBDpJOfKKlD?tABpAP`ChApIf@lFFbCBdHFjC|@tR@nAKdG]pFm@`DsAlF_@tBqD|LeA|E_@tB_@vCkBfFi@fBsDvRg@jDeBnQi@lLc@`FwBhO]~Cc@`BWp@yKjRyDzHuAdCgApAcChBoEfByAB_CKeCTeGbDoA\\aEl@iTxBoCf@UHmD~C_CvCkDfH{@hCwF`Oo@vB{F~N_Ml]mA|Di@vBoApGYrCMvCKtEC`IKvFq@zIm@lGw@jK[vAuBjG_ChIm@vDeAlLe@pCcAtDi@nA_@h@yAbAuAn@eCv@g\\|LiCn@q@ZoBBiKcAcA@}@NkBbAkAnAuAxBeAnCDb@Nj@zAlB~AfA~@|@t@hAZ|@jChNp@bF\\jBf@vAfBpBZt@ZfBVhCZnB`@vATf@p@`AzCfCpC~Cr@XbCJdA\\b@f@Z~@Px@B^Ot@MlAUrDD~MEzKCz@OdBa@tCcCnOo@lCcApB_CtBoBfCiAlAsBnAq@r@eA`CoAlDoBjGo@bDiBpLu@|CSlAGlBEpEGx@W|AkBbHaBvIo@jAmCrCa@l@_@vA?bBb@`EF`CC~AU`C_@vB}AhHoAzGe@vESfDuAFmI|BcAHsBp@]Bu@GiEsAe@E}@P}BvAsA^cAc@kBmAsAi@oAJk@j@_@v@Sx@UnBk@~LMfAWr@]f@eBjBm@tA{AnFiAlDiFjRkCxIe@fBg@tDo@tCYbA_ChGSx@MlAA~BMhBo@tGc@vCcBlD[jAo@xEk@xFIZOZwAxAk@vAk@dCOfASjCC|FCzAGl@M\\u@fAw@fCkApH_@fF^gFjAqHv@gCt@gAL]Fm@B{AB}FRkCNgAj@eCj@wAvAyAN[H[j@yFn@yEZkAbBmDb@wCn@uGLiB@_CLmARy@~BiGXcAn@uCf@uDd@gBjCyIhFkRhAmDzAoFl@uAdBkB\\g@Vs@LgAj@_MToB^sA~@iAnAKrAh@jBlAbAb@rA_@|BwA|@Qd@DhErAt@F\\CrBq@bAIlI}BtAGUbFUpI?n`@S`KSjDOdAk@fCOjAM|Aq@zFM~B?vFj@`OC`CI|A[`CaAdF]pC{BtTgAjMm@lCyCvHw@tCm@hDGp@Az@D`CG~Ag@tCqAfES`AGl@CdANvDGvGFbEGnAUlBK\\QN_Dm@o@\\e@`AMf@qBvJKfAK|G_@dEa@dCc@zAoAxCWbAQjAGjABvEO~BsAdJm@hF}AbJWhAsBtO{AnMiAbNg@fEk@|BwAfDg@jBOz@}ApLaAzIs@nI]vCs@fEmAfFaAjFmAzHcAjFSnCS~E[xDa@nIuApIM`CK|DQtCe@fCsCxLWbBO~BCxA?~BJ`ECXW^ERWyAUy@aAoB_AeAy@c@yA?yDr@uADsCq@qAo@_@_@w@aBuBaJQi@y@qAYSk@MuBDu@Mq@e@iFaGaBc@iBD{H|AgBx@}AdBcC|Dm@r@{@t@mAf@}HpBiB\\iBNiLeAoAVo@d@m@r@{B`EwAxByC|Cy@hAi@rAkAbFo@vBk@t@]To@Na@?}IeA}BMuBR{FlAw@Vq@n@[h@uAbEy@jAaAZuFn@mD~@}B`AaJvEeAH_ASyH_GqAm@y@M_B\\aDvB{Ah@wI[mI{@eABm@PWLs@t@e@hAmAtFsBdG_@xA]`CWnDWtAi@dAe@Vw@Ea@_@}DeHsAqCuAgDeA_ByAsA}Ag@gAAuBT}AO_NcEw@c@uAoA
我目前正在尝试检查是否存在转义字符问题,但似乎无法使用我目前尝试的方法。
如果有任何解决方法,我们将不胜感激。

从您粘贴的输出中,您可以看到索引确实超出了范围:

length=4438; index=4438;
索引的有效位置从0到4437

您在
中增加
索引
,同时在不同位置循环

b = encoded.charAt(index++) - 63;
在第一个
do while
和第二个
do while

执行第一个
charAt()
-操作时,
while
-循环中的检查条件断言
索引
位置在
字符串编码
内。
在第一个
do while
索引上进行后期增量后,它可能已到达
字符串编码的末尾。这导致在第二个
do while

执行
charAt()
时出现StringIndexOutOfBoundsException,非常感谢Stefan,您快速简单的回答解决了我的问题。可能有点代码盲。看起来您可能会受益于此代码:
length=4438; index=4438;
b = encoded.charAt(index++) - 63;