我有一个函数shortenDisplay(String longDisplay,String display),它通过substring()方法修剪显示。但是,如果显示 传递给这个方法都比预期的要长,substring方法会 指向负索引并导致StringIndexOutOfBoundsException。我需要一种方法来解决这个问题,我的意思是使代码更加清晰和高效,以便它可以处理更长的String名称。任何帮助,将不胜感激。提前致谢。这是我的代码 -
private String shortenDisplay(String longDisplay, String display) {
final int displayLength = display.length();
final int totalLength = longDisplay.length();
final int numberOfCharsToRemove = totalLength - 36;
final int stop = displayLength - numberOfCharsToRemove;
final String beginning = longDisplay.substring(0, stop); //this line throws an error
final int endStart = stop + numberOfCharsToRemove;
final String end = longDisplay.substring(endStart);
String shortenedDisplay = beginning + end;
return shortenedDisplay;
}
例如,如果传入的参数是 -
longDisplay - “嘿,这是一个字符串名称显示,长度非常长!!!!!!!!” (64个字符)
显示 - “嘿,我的名字是字符串”(21个字符)
根据函数 shortenDisplay 中的第3行代码:
int numberOfCharsToRemove :64 - 36 = 28个字符
int stop :21 - 28 = -7 //否定索引
现有代码(需求)有一个特定的原因,所以代码逻辑需要保持不变,但有没有办法绕过这个负面索引并避免 IndexOutOfBoundsException ?
答案 0 :(得分:0)
对该特定行的快速而肮脏的修复是使用Math.max
来防止落入负范围。
final String beginning = longDisplay.substring(0, Math.max(0, stop));
遵循相同的推理,您希望保护对substring
的其他来电。
final String end = longDisplay.substring(Math.max(0, endStart));
你在代码中有一些神奇的数字,很难推理。 (3是否代表省略号?36代表什么?)。我认为重写代码以更好地展示意图将是一个巨大的胜利。