0

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

2 回答 2

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

请注意方法的拆分方式和更好的名称。

于 2013-04-19T04:52:00.160 回答
1

您正在假设hex.split(".{2}");返回一个包含 3 个元素的数组。我怀疑情况并非如此。如果您调试到该行,您应该会看到数组列表的元素少于 3 个。我相信没有句点的字符串会对您执行此操作。IllegalArgumentExceprtion如果发现少于 3 个元素,也许你需要抛出一个或其他东西。

那么当你这样做时:

    return String.format("%02x%02x%02x", rgb_int.get(0), 
        rgb_int.get(1), rgb_int.get(2));

rgb_int如果没有 3 个元素,这将生成异常。异常中的行号应该为您提供线索。

将来,至少在您的 SO 帖子中显示异常的相关行并显示与它对应的行总是一个好主意。

于 2013-04-19T04:15:35.707 回答