Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Это в основном, что необходимо сделать - или по крайней мере, это - самое легкое решение. Все, что Вы "потратили бы впустую", является стоимостью n вызовов метода - Вы не будете на самом деле проверять случая дважды, если Вы будете думать об этом. (IndexOf возвратится, как только он находит соответствие, и Вы будете продолжать идти от того, где он кончил.)
Вы действительно могли использовать регулярное выражение /((s).*?){n}/
для поиска энного возникновения подстроки s
.
В C# это могло бы быть похожим на это:
public static class StringExtender
{
public static int NthIndexOf(this string target, string value, int n)
{
Match m = Regex.Match(target, "((" + Regex.Escape(value) + ").*?){" + n + "}");
if (m.Success)
return m.Groups[2].Captures[n - 1].Index;
else
return -1;
}
}
Примечание: я добавил Regex.Escape
к исходному решению позволить искать символы, которые имеют особое значение к regex механизму.
private int IndexOfOccurence(string s, string match, int occurence)
{
int i = 1;
int index = 0;
while (i <= occurence && (index = s.IndexOf(match, index + 1)) != -1)
{
if (i == occurence)
return index;
i++;
}
return -1;
}
или в C # с методами расширения
public static int IndexOfOccurence(this string s, string match, int occurence)
{
int i = 1;
int index = 0;
while (i <= occurence && (index = s.IndexOf(match, index + 1)) != -1)
{
if (i == occurence)
return index;
i++;
}
return -1;
}