Бывают моменты, когда второй параметр, являющийся длиной, более удобен, и бывают случаи, когда вторым параметром, являющимся «смещением до остановки», более удобно. Точно так же бывают случаи, когда «если я дам вам что-то слишком большое, просто зайдите в конец строки», это удобно, и бывают случаи, когда это указывает на ошибку и действительно должно вызвать исключение.
Второй параметр, представляющий длину, полезен, если у вас фиксированная длина поля. Например:
// C#
String guid = fullString.Substring(offset, 36);
Второй параметр, являющийся смещением, полезен, если вы переходите к другому разделителю:
// Java
int nextColon = fullString.indexOf(':', start);
if (start == -1)
{
// Handle error
}
else
{
String value = fullString.substring(start, nextColon);
}
Как правило, тот, который вы хотите использовать, противоположен тому, который предоставляется на вашей текущей платформе, по моему опыту:)