我一直在努力创建一个小阴影方法,但不断出现同样的IndexOutOfBoundsException
错误。我不认为我对此缺少多少?
import java.util.ArrayList;
public class Shades {
public static String shades(String hex, int offset) {
hex = hex.replace("#", "");
String[] rgb_hex = hex.split(".{2}");
ArrayList<Integer> rgb_int = new ArrayList<>();
for (String i : rgb_hex) {
int intg = Math.min(255, Math.max(
0, Integer.parseInt(i, 16) + offset));
rgb_int.add(intg);
}
return String.format("%02x%02x%02x", rgb_int.get(0),
rgb_int.get(1), rgb_int.get(2));
}
public static void main(String[] args) {
System.out.println(shades("#000000", 20));
}
}
答案 0 :(得分:1)
您假设hex.split(".{2}");
返回包含3个元素的数组。我怀疑情况并非如此。如果调试到该行,您应该看到数组列表少于3个元素。我相信没有句号的字符串会对你这样做。如果发现少于3个元素,可能需要抛出IllegalArgumentExceprtion
或其他东西。
然后当你这样做:
return String.format("%02x%02x%02x", rgb_int.get(0),
rgb_int.get(1), rgb_int.get(2));
如果rgb_int
没有3个元素,这将生成异常。异常中的行号应该为您提供线索。
将来,至少在你的SO帖子中至少有相关的例外行,并显示哪些行与之对应。
答案 1 :(得分:1)
hex.split(".{2}")
会在任意两个字符上拆分hex
。如果x具有偶数长度,例如10,那么它在前两个字符之后,在字符2和4之后,等等分开。测试给出一个空数组。
你需要在字符串上迭代字符。 Java 8可能有Iterator
,但在此之前,您需要:
public class Shades {
public String shades(String hex, int offset) {
hex = hex.replace("#", "");
if (hex.length() != 6) {
throw new IllegalArgumentException("Can only handle 6-hex " +
"character RGB strings.");
}
List<String> rgbHex = splitIntoPairs(hex);
List<Integer> rgbInt = convertToInt(rgbHex, offset);
return String.format("%02x%02x%02x", rgbInt.get(0),
rgbInt.get(1), rgbInt.get(2));
}
public List<String> splitIntoPairs(String s) {
List<String> pairs = new ArrayList<>();
pairs.add(s.substring(0, 2));
pairs.add(s.substring(2, 4));
pairs.add(s.substring(4, 6));
return pairs;
}
public List<Integer> convertToInts(List<String> s, int offset) {
List<Integer> ints = new ArrayList<();
for (String pair: s) {
ints.add(bound(0, Integer.parseInt(s, 16) + offset, 255);
}
return ints;
}
public int bound(int lower, int x, int upper) {
if (x < lower) {
return lower;
} else if (x > upper) {
return upper;
} else {
return x;
}
}
public static void main(String[] args) {
Shades shades = new Shades();
System.out.println(shades.shades("#000000", 20));
}
}
注意分割方法的方式,并给出更好的名称。