Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.StringIndexOutOfBoundsException:开始0,结束4,长度1_Java - Fatal编程技术网

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

java.lang.StringIndexOutOfBoundsException:开始0,结束4,长度1,java,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()))

我使用以下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:开始0,结束4,长度1


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

您编写了
附加(卡号.子字符串(0,4))
这里您使用4值作为硬编码,如果卡号长度小于4值,则它将给您错误。因此,使用此
卡号.length()代替硬编码值4
。或者如果您想要硬编码值4,那么首先检查
if(card_number.length()>4)

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

公共静态字符串屏蔽(字符串卡号){
if(卡号.长度()<9){
返回maskedAll(卡号);
}
返回新的StringBuilder()
.append(card_number.substring(card_number.length()-3,card_number.length()).toString();
}
公共静态字符串屏蔽码(字符串卡号){
if(卡号长度()<5){
返回maskedAll(卡号);
}
返回新的StringBuilder();
}
公共静态字符串掩码邮件(字符串卡号){
if(卡号长度()<5){
返回maskedAll(卡号);
}
返回新的StringBuilder().append(card_number.substring(card_number.length()-3,card_number.length()).toString();
}
公共静态字符串掩码(字符串卡号){
返回字符串.join(“,Collections.nCopies(card_number.length(),“X”);
}

为什么您认为
返回新的StringBuilder().append(卡号.substring(0,4)).toString()
优于
卡号。子字符串(0,4)
无论如何?只需确保卡号至少包含8个字符,然后再将其传递给屏蔽函数。java.lang.StringIndexOutOfBoundsException仅当您尝试访问其限制范围内的字符串时,在对该字符串执行子字符串操作之前,请检查字符串的长度。顺便说一句,您可以使用
。append(卡号,0,4)
无需子字符串
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"));
}