C# 数组中的ArgumentOutOfRange异常
我正在创建一个方法,它可以找到下一个元素和上一个元素值之间的最小绝对差异 方法中发生ArgumentOutofRange异常。但是,当我添加try、catch异常时,它是有效的。我的代码有什么问题?然而,我创建了适当的条件,比如如果i等于0,当然它找不到[i-1],那么它将是下一个值[1]和[0]之间的差值。若它成为最后一个元素,那个么这个值就是它最后的[i-1]和之前的[i-2]之间的差值C# 数组中的ArgumentOutOfRange异常,c#,arrays,exception,C#,Arrays,Exception,我正在创建一个方法,它可以找到下一个元素和上一个元素值之间的最小绝对差异 方法中发生ArgumentOutofRange异常。但是,当我添加try、catch异常时,它是有效的。我的代码有什么问题?然而,我创建了适当的条件,比如如果i等于0,当然它找不到[i-1],那么它将是下一个值[1]和[0]之间的差值。若它成为最后一个元素,那个么这个值就是它最后的[i-1]和之前的[i-2]之间的差值 namespace ConsoleApplication3 { class Program
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
List<Cla> Clalist = new List<Cla>();
Clalist.Add(new Cla(0));
Clalist.Add(new Cla(2));
Clalist.Add(new Cla(3));
Clalist.Add(new Cla(10));
Clalist.Add(new Cla(100));
Clalist.Add(new Cla(65));
Program nn = new Program();
nn.GetAbs(Clalist);
Console.WriteLine(Clalist[0].AbsValue);
Console.WriteLine(Clalist[1].AbsValue);
Console.WriteLine(Clalist[2].AbsValue);
Console.WriteLine(Clalist[3].AbsValue);
Console.WriteLine(Clalist[4].AbsValue);
Console.WriteLine(Clalist[5].AbsValue);
Console.ReadLine();
}
public void GetAbs(List<Cla> n)
{
int z = n.Count;
for (int i = 0; i < z; i++)
{
if(i == 0)
{
n[0].AbsValue = Math.Abs(n[1].Value - n[0].Value);
}
if(i == (z-1))
{
n[z-1].AbsValue = Math.Abs(n[z-1].Value - n[z -2].Value);
}
else
{
try
{
var AbsV = Math.Abs(n[i + 1].Value - n[i].Value);
var AbsV2 = Math.Abs(n[i - 1].Value - n[i].Value); //exception occurs here
if (AbsV < AbsV2)
n[i].AbsValue = AbsV;
else
n[i].AbsValue = AbsV2;
}
/* catch (ArgumentOutOfRangeException)
{
n[0].AbsValue = n[1].Value - n[0].Value; */ When i add this it works
}
}
}
}
}
}
class Cla
{
public int Value;
public int AbsValue;
public Cla(int v)
{
Value = v;
}
}
您应该有三种相互排斥的情况:
i==0左边框
i==z-1右边框
i==1..z-2内部值
像这样:
for (int i = 0; i < z; i++)
{
if (i == 0) // 1st case (left border)
{
n[0].AbsValue = Math.Abs(n[1].Value - n[0].Value);
}
else if(i == (z-1)) // 2nd (please, notice "else if") (right border)
{
n[z-1].AbsValue = Math.Abs(n[z-1].Value - n[z -2].Value);
}
else // 3d (inner values)
{
....
}
您应该有三种相互排斥的情况:
i==0左边框
i==z-1右边框
i==1..z-2内部值
像这样:
for (int i = 0; i < z; i++)
{
if (i == 0) // 1st case (left border)
{
n[0].AbsValue = Math.Abs(n[1].Value - n[0].Value);
}
else if(i == (z-1)) // 2nd (please, notice "else if") (right border)
{
n[z-1].AbsValue = Math.Abs(n[z-1].Value - n[z -2].Value);
}
else // 3d (inner values)
{
....
}
抛出异常的行在i==0时出现。第二条if语句需要变成else if,或者else语句需要变成else ifi>0。引发异常的行在i==0时出现。第二个if语句需要变成else if,或者else语句需要变成else ifi>0。将ifi==z-1更改为else ifi==z-1-不同语言的可能重复,相同issue@DmitryBychenko达格瓦诺罗夫·哈格瓦贾夫:不客气!Пожалуйста!@JanDvorak,如果这个问题的答案可以直接应用到C,那么标签应该添加到问题中,特别是如果你希望以它作为重复目标来结束C问题。如果问题适用于多种语言,那么这样做也会帮助人们找到问题。将ifi==z-1更改为else ifi==z-1-不同语言的可能副本,相同issue@DmitryBychenko达格瓦诺罗夫·哈格瓦贾夫:不客气!Пожалуйста!@JanDvorak,如果这个问题的答案可以直接应用到C,那么标签应该添加到问题中,特别是如果你希望以它作为重复目标来结束C问题。如果这个问题适用于多种语言,那么这样做也会帮助人们找到这个问题。