2015-05-26 2 views
-5

У меня есть функция shortenDisplay (String longDisplay, String display), которая обрезает отображение методом substring(). Однако, если отображаемый на этом методе длиннее, чем ожидалось, метод подстроки будет указывать на отрицательный индекс и вызывать исключение StringIndexOutOfBoundsException. Мне нужен способ обойти это, я хочу сделать код более чистым и эффективным, чтобы он мог обрабатывать более длинные имена строк. Любая помощь будет оценена по достоинству. Заранее спасибо. Вот мой код -Подстановка() throws StringIndexOutOfBoundsException в Java

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 символов)

В соответствии с 3-й строке кода в функции shortenDisplay:
INT numberOfCharsToRemove: 64 - 36 = 28 символов
ИНТ остановка: 21 - 28 = -7 // Отрицательный индекс

Существует конкретная причина для существующего кода (требования), поэтому логика кода должна оставаться прежней, но есть ли способ обойти этот отрицательный индекс и избежать IndexOutOfBoundsException?

+2

Что именно ** является вашим требованием **, то есть каким должен выглядеть результат метода на основе ввода? – Baz

+0

Требование не имеет смысла. Зачем вам потребовалось бы сократить строку на 36, если это будет меньше, чем это нужно? Вы можете проверить, что numberOfCharactersToRemove слишком велик, но тогда что вы делаете? Вернуть пустую строку? Кажется странным. – swingMan

+0

В конечном итоге метод должен иметь возможность обрабатывать более длинное число символов, например, более 100 символов длины String, но в соответствии с текущей логикой отрицательный индекс передается в метод substring(), есть ли способ обработать эту логику кода более эффективным способом? – user3652212

ответ

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?). Я думаю, что переписать код, чтобы показать намерения , лучше было бы огромной победой.

Смежные вопросы