有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

string Substring()在Java中引发StringIndexOutOfBoundsException

我有一个函数shortenDisplay(String longDisplay,String display),它通过substring()方法修剪显示。然而,如果显示器 如果传递给此方法的时间都比预期的长,则子字符串方法将 指向负索引并引发StringIndexOutOfBoundsException。我需要一种方法来解决这个问题,我的意思是让代码更干净、更高效,这样它就可以处理更长的字符串名。任何帮助都将不胜感激。提前谢谢。这是我的密码

    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中的第三行代码:
int numberOfCharsToRemove:64-36=28个字符
int stop:21-28=-7//负指数

现有代码(要求)有一个特定的原因,因此代码逻辑需要保持不变,但有没有办法绕过这个负面索引,避免出现索引自动边界异常


共 (1) 个答案

  1. # 1 楼答案

    对该特定行的一个快速而肮脏的修复方法是使用Math.max来防止落入负值范围

    final String beginning = longDisplay.substring(0, Math.max(0, stop));

    按照同样的推理,您需要保护对substring的另一个调用

    final String end = longDisplay.substring(Math.max(0, endStart));

    你的代码中有一些神奇的数字,这让你很难推理。(3代表省略号吗?36代表什么?)。我认为重写代码以更好地展示意图将是一个巨大的胜利