Substring()在Java中抛出StringIndexOutOfBoundsException

时间:2015-05-26 18:27:10

标签: java string swt substring

我有一个函数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

1 个答案:

答案 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代表什么?)。我认为重写代码以更好地展示意图将是一个巨大的胜利。