使用charAt时字符串outOfBoundsException

时间:2015-12-28 00:50:40

标签: java bukkit

我有以下代码:

@SuppressWarnings("resource")
public void changeSkin(String name){
    try {
        URL uuidURL = new URL("https://api.mojang.com/users/profiles/minecraft/" + name);

        String uuid = new Scanner(uuidURL.openStream(), "UTF-8").useDelimiter("\\A").next();
        uuid = uuid.substring(7, 39);

        System.out.println(uuid); // works

        URL valueURL = new URL("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid + "?unsigned=false");

        String value = new Scanner(valueURL.openStream(), "UTF-8").useDelimiter("\\A").next();
        value = value.replace('"', '!');
        value = value.replaceAll("!value!:!", "*");
        value = value.replaceAll("=!,", "+");
        value = value.substring(value.charAt('*'), value.charAt('+')); // Gives an error outOfBounds: -13

        String signature = new Scanner(valueURL.openStream(), "UTF-8").useDelimiter("\\A").next();
        signature = signature.replaceAll("!signature!:!", "_");
        signature = signature.replaceAll("=!}]}", "~");
        signature = signature.substring(value.charAt('_'), value.charAt('~'));

        System.out.println(signature);
        System.out.println(value);

        //profile.getProperties().put("textures", new Property(value, signature));

    } catch (Exception e) {
        e.printStackTrace();
    }

}

运行它时抛出outOfBoundsException:-13

但是怎么能抛出负数呢?

感谢您的帮助

修改:这是网站:https://sessionserver.mojang.com/session/minecraft/profile/e96ca9800c6c4a1588a2922a02ae1080?unsigned=false

2 个答案:

答案 0 :(得分:4)

我猜你正在制造某种类型的我的飞机机器人......但那是无关紧要的。

您正在使用charAt错误。

https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#charAt(int)

您正在寻找的是indexOf

https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#indexOf(int)

答案 1 :(得分:-1)

您要求'*'的字符位置,然后询问位置'+'。问题是加号位于字符串中的星号之前,所以它返回一个负数。

为了补救,我建议将子字符串分成两行:

    value = value.substring(value.indexOf('*'));
    value = value.substring(0, value.indexOf('+'));

虽然看似无关紧要,但将它分成两行会破坏*的第一个实例的字符串,然后是+的NEXT第一个实例。