【问题标题】:An exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll but was not handled in user codemscorlib.dll 中出现“System.ArgumentOutOfRangeException”类型的异常,但未在用户代码中处理
【发布时间】:2019-07-04 19:24:41
【问题描述】:

我有这个控制台应用程序,它在数据库上生成一组假数据/信息以进行测试。

public List<LCS_ExchangeDataStaging> GenerateNewData(int count)
            {
                var newData = new List<LCS_ExchangeDataStaging>();
                var random = new Random();
                var branches = new LCSBranchContext().GetAllBranches();
                var schemeIds = new LCSSchemePortfolioContext().SchemePortfolios();

            var branchCount = branches.Count - 1;
            var schemeCount = schemeIds.Count - 1;

            Parallel.For(1, count + 1, i =>
            {
                int gender = random.Next(0, 1);

                var data = new LCS_ExchangeDataStaging
                {
                    AccountNumber = (3000000000 + random.Next(999999999)).ToString(),
                    AccountStatement = random.Next(),
                    Address = Faker.Address.StreetAddress(),
                    AddressOfKeyContact = Faker.Address.StreetAddress(),
                    Age = RandomDate(DateTime.Now.AddYears(-70), DateTime.Now.AddYears(-18), random),
                    AmountDisbursed = Faker.RandomNumber.Next(20000000),
                    AmountOverdue = Faker.RandomNumber.Next(1000000),
                    BranchName = branches[random.Next(branchCount)].Name,
                    ClientId = $"R{(Faker.RandomNumber.Next(99999999) + 200000000).ToString()}",
                    ClientName = gender == 0 ? NameGenerator.Generate(Gender.Male) : NameGenerator.Generate(Gender.Female),
                    CompaniesMandate = "",
                    DateOfIncorporation = RandomDate(DateTime.Now.AddYears(-70), DateTime.Now, random),
                    DaysPastDue = 1,
                    DisbursmentDate = RandomDate(DateTime.Now.AddYears(-3), DateTime.Now, random),
                    Email = Faker.Internet.Email(),
                    EmergencyContact = Faker.Name.FullName(),
                    EmployeeContact = Faker.Name.FullName(),
                    EmployeeContactTelePhone = Faker.Phone.Number(),
                    EmployerAddress = Faker.Address.StreetAddress(),
                    EmployerName = Faker.Company.Name(),
                    EmployerTelephone = Faker.Phone.Number(),
                    ExpiryDate = RandomDate(DateTime.Now.AddYears(1), DateTime.Now.AddYears(7), random),
                    FeesOverdue = Faker.RandomNumber.Next(2000),
                    Gender = gender == 0 ? "M" : "F",
                    GuarantorAddress = Faker.Address.StreetAddress(),
                    GuarantorName = Faker.Name.FullName(),
                    GuarantorTelephone = Faker.Phone.Number(),
                    Income = random.Next(50000, 1000000),
                    InsuranceCompany = Faker.Company.Name(),
                    InsuredAmount = Faker.RandomNumber.Next(2000),
                    InterestRate = random.Next(3, 24),
                    IntrducerAddress = Faker.Address.StreetAddress(),
                    IntrestOverdue = Faker.RandomNumber.Next(2000),
                    IntroducerName = Faker.Name.FullName(),
                    IntroducerTelephone = Faker.Phone.Number(),
                    KeyContactPerson = Faker.Name.FullName(),
                    LastCrAmount = Faker.RandomNumber.Next(20000),
                    LastCrDate = RandomDate(DateTime.Now.AddYears(-1), DateTime.Now, random),
                    LienAmount = Faker.RandomNumber.Next(2000),
                    LoanRestructured = "No",
                    MissedPayin24MonthCount = random.Next(0, 15),
                    MonthlyInflow = Faker.RandomNumber.Next(1000000),
                    OperativeAccountNumber = $"01{random.Next(99999999)}",
                    OutstandingPrincipal = Faker.RandomNumber.Next(200000),
                    PenalChargeDue = Faker.RandomNumber.Next(2000),
                    PrincipalOverdue = Faker.RandomNumber.Next(2000),
                    ProductCategory = "",
                    ProductType = "LAA",
                    RelationshipYears = random.Next(0, 40),
                    RepaymentAmount = Faker.RandomNumber.Next(2000),
                    ReturnedChequeIn6MonthCount = random.Next(0, 3),
                    SchemeID = schemeIds[random.Next(schemeCount)].SchemeCode,
                    Telephone1 = Faker.Phone.Number(),
                    Telephone2 = Faker.Phone.Number(),
                    TelephoneOfKeyContact = Faker.Phone.Number(),
                    Tenor = random.Next(3, 124).ToString(),
                };

                newData.Add(data);
            });

            return newData;
        }

但是,当方法 GenerateNewData 运行时,我得到了这个异常

“System.ArgumentOutOfRangeException”类型的异常发生在 mscorlib.dll 中,但未在用户代码中处理

附加信息:“maxValue”必须大于零。

System.ArgumentOutOfRangeException was unhandled by user code
  HResult=-2146233086
  Message='maxValue' must be greater than zero.
Parameter name: maxValue
  ParamName=maxValue
  Source=mscorlib
  StackTrace:
       at System.Random.Next(Int32 maxValue)
       at RLCS.Tasks.Data.DataGenerator.<>c__DisplayClass1_0.<GenerateNewData>b__0(Int32 i) in C:\Users\Solution Architect\Documents\WORK\lcs\lcs\RLCS.Tasks\Data\DataGenerator.cs:line 50
       at System.Threading.Tasks.Parallel.<>c__DisplayClass17_0`1.<ForWorker>b__1()
  InnerException:

请帮助您提出任何建议。 谢谢

【问题讨论】:

  • 就像旁注一样int gender = random.Next(0, 1); 只会生成零,因为上限是排他的。 branches.CountschemeIds.Count 是 0 吗?
  • 我认为这可能会导致问题:SchemeID = schemeIds[random.Next(schemeCount)].SchemeCode。你在哪里设置schemeCount?错误清楚地说明了问题所在。可能在Faker 类中,因为您也使用Random 对象。尝试调试您的代码。
  • 这条线似乎也有问题:var branches = new LCSBranchContext().GetAllBranches();。我认为LCSBranchContext 是一个实体框架上下文类。如果是这样,您没有正确处理它。您应该在 using 块内创建它。

标签: c# asp.net-mvc-4 console-application


【解决方案1】:

如果不运行或查看所有代码,很难判断,但问题是您对 random.Next(Int32 maxValue) 的调用之一提供的 Int32 maxValue 为 0 或更少。这将其缩小到以下几行之一-

BranchName = branches[random.Next(branchCount)].Name,

SchemeID = schemeIds[random.Next(schemeCount)].SchemeCode,

所以重要的变量似乎是branchCountschemeCount。这些设置为各自上下文方法结果的Count - 1

我怀疑 LCSBranchContext().GetAllBranches()LCSSchemePortfolioContext().SchemePortfolios() 返回 1 或 0 结果,我们可以通过让它们返回更多结果来“修复”它们,但更好的解决方案是使用 Faker.Random.ListItem() 和 C# 6 安全像这样的导航操作员 (?) -

BranchName = Faker.Random.ListItem(branches)?.Name,

SchemeID = Faker.Random.ListItem(schemeIds)?.SchemeCode,

如果提供的列表中没有任何条目,则将值设置为null

【讨论】:

  • 谢谢@gamesmad。但是,Faker.Random.ListItem(branches)?.Name, 未被识别。该错误是由于我现在已排序的branchCountschemeCount 中的空/负数据造成的。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多