我有以下代码:
@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
但是怎么能抛出负数呢?
感谢您的帮助
答案 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第一个实例。