java.lang.StringIndexOutOfBoundsException:开始0,结束4,长度1

时间:2019-05-17 12:19:51

标签: java

我使用以下Java代码标记一个长数字:

public static String masked(String card_number) {
        return new StringBuilder().append(card_number.substring(0, 4)).append("....")
                .append(card_number.substring(card_number.length() - 3, card_number.length())).toString();
    }

    public static String maskedBin(String card_number) {
        return new StringBuilder().append(card_number.substring(0, 4)).toString();
    }

    public static String maskedTail(String card_number) {
        return new StringBuilder().append(card_number.substring(card_number.length() - 3, card_number.length())).toString();
    }

不幸的是,当我发送的号码很短时,我得到了异常:java.lang.StringIndexOutOfBoundsException: begin 0, end 4, length 1

有什么办法可以防止这种情况?例如,如果没有最小要求的数字长度以返回错误?

2 个答案:

答案 0 :(得分:1)

我添加了最小长度的检查。长度较短的卡号将被完全屏蔽,即1234567 => XXXXXXX。我选择了长度限制,以便至少掩盖一个字符。字符串重复功能从string repeat复制。

public static String masked(String card_number) {
    if(card_number.length() < 9){
        return maskedAll(card_number);
    }

    return new StringBuilder().append(card_number.substring(0, 4)).append("....")
            .append(card_number.substring(card_number.length() - 3, card_number.length())).toString();
}

public static String maskedBin(String card_number) {
    if(card_number.length() < 5){
        return maskedAll(card_number);
    }

    return new StringBuilder().append(card_number.substring(0, 4)).toString();
}

public static String maskedTail(String card_number) {
    if(card_number.length() < 5){
        return maskedAll(card_number);
    }

    return new StringBuilder().append(card_number.substring(card_number.length() - 3, card_number.length())).toString();
}

public static String maskedAll(String card_number) {
    return String.join("", Collections.nCopies(card_number.length(), "X"));
}

答案 1 :(得分:0)

您在此处写了append(card_number.substring(0, 4)),如果card_number长度小于4个值,则使用4个值作为硬编码,这会给您带来错误。因此,请使用此card_number.length()代替硬编码值4。或者,如果您仍然想要硬编码的值4,那么请首先检查if(card_number.length() > 4)