我使用以下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
有什么办法可以防止这种情况?例如,如果没有最小要求的数字长度以返回错误?
答案 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)
。