Как отладить ошибку System.ArgumentOutOfRangeException в C#?
Предполагается, что этот код берет две выборки, одну оригинальную и одну новую, а затем определяет длину наименьшего единственного последовательного фрагмента, который был вставлен в первую последовательность.
При попытке некоторых примеров я получаю следующее сообщение об ошибке:
System.ArgumentOutOfRangeException: 'Индекс и длина должны указывать на место в строке. Имя параметра: длина
Вот код:
class Program
{
static void Main(string[] args)
{
Console.WriteLine(GetSample());
Console.ReadKey();
}
public static int GetSample()
{
string sample1 = Console.ReadLine();
string sample2 = Console.ReadLine();
if (sample1 == sample2) return 0;
if (sample1.Length >= sample2.Length)
{
for (int i = 0; i < sample2.Length; i++)
{
if (!(sample1[i] == sample2[i]))
{
sample1 = sample1.Substring(i, sample1.Length);
sample2 = sample2.Substring(i, sample2.Length);
break;
}
}
int var = sample1.Length - sample2.Length;
for (int i = sample2.Length - 1; i >= 0; i--)
{
if (sample2[i] == sample1[i + var])
sample2 = trimlast(sample2);
}
}
else
{
for (int i = 0; i < sample1.Length; i++)
{
if (!(sample1[i] == sample2[i]))
{
sample1 = sample1.Substring(i, sample1.Length);
sample2 = sample2.Substring(i, sample2.Length);
break;
}
}
int var = sample2.Length - sample1.Length;
for (int i = sample1.Length - 1; i >= 0; i--)
{
if (sample2[i + var] == sample1[i])
sample2 = trimlast(sample2);
}
}
return sample2.Length;
}
public static string trimlast(string str)
{
return str.Substring(0, str.Length - 1);
}
}
}
2 ответа
Проблема в:
sample1 = sample1.Substring(i, sample1.Length);
и другие подобные вызовы методов. Второй параметр Substring
это длина (то есть количество символов, которые нужно извлечь для подстроки). Таким образом, если i
больше 0, в этом случае произойдет сбой, поскольку метод попытается получить символы, которых нет в строке.
Один из ваших циклов пытается получить доступ к элементу, который не существует. Например, у вас есть массив a ={1,2,3}, вы пытаетесь получить доступ к четвертому элементу, который не существует.
Если вы не можете узнать, где именно, может быть проблема, попробуйте использовать операторы print внутри ваших циклов, отображая значения counter (i). Он укажет, для какой итерации ваш код терпит неудачу.