ArrayList get方法超出范围

时间:2013-04-19 04:11:52

标签: java arraylist

我一直在努力创建一个小阴影方法,但不断出现同样的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));
    }
}

2 个答案:

答案 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));
    }
}

注意分割方法的方式,并给出更好的名称。