You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段生成随机值的代码会抛出System.NullReferenceException异常?

为什么你的代码会抛出System.NullReferenceException?

嘿,这个问题我太熟悉了!咱们直接揪出问题根源:

核心原因:数组里的Pora对象根本没被创建

你写了arr = new Pora[n],这一步只是创建了一个空数组容器——它能装下n个Pora类型的对象,但容器里的每个位置默认都是null(因为Pora是引用类型)。当你循环里执行arr[i].integer = rand.Next()时,你其实是在尝试访问一个null对象的属性,这可不就触发空引用异常了嘛!

额外的坑:数组参数的赋值不会影响外部

另外还有个容易踩的点:你在方法内部给参数arr重新赋值arr = new Pora[n],但在C#里,引用类型的参数默认是按值传递的——也就是说,这个赋值只会改变方法内部的局部变量arr,调用方传入的那个数组完全不会被修改。就算你修复了空引用,外面也拿不到你生成的数据。


怎么修复?

第一步:先实例化每个Pora对象

在循环里,先给arr[i]创建一个Pora实例,再给属性赋值:

static void randomize(Pora[] arr, int n, int seed) {
    // 注意:如果调用方已经传入了一个长度为n的数组,就不要重新赋值arr了
    Random rand = new Random(seed);
    for (int i = 0; i < n; i++) {
        arr[i] = new Pora(); // 先创建实例!
        arr[i].integer = rand.Next();
        arr[i].doubl = rand.NextDouble();
    }
}

第二步:解决数组传递的问题(二选一)

如果你本来就想生成一个新数组返回给调用方,更合理的方式是让方法返回数组:

static Pora[] randomize(int n, int seed) {
    Pora[] arr = new Pora[n];
    Random rand = new Random(seed);
    for (int i = 0; i < n; i++) {
        arr[i] = new Pora();
        arr[i].integer = rand.Next();
        arr[i].doubl = rand.NextDouble();
    }
    return arr;
}
// 调用方式:Pora[] myArr = randomize(10, 42);

如果非要通过参数修改外部数组,可以用ref关键字(但一般不推荐,可读性差):

static void randomize(ref Pora[] arr, int n, int seed) {
    arr = new Pora[n];
    Random rand = new Random(seed);
    for (int i = 0; i < n; i++) {
        arr[i] = new Pora();
        arr[i].integer = rand.Next();
        arr[i].doubl = rand.NextDouble();
    }
}
// 调用方式:randomize(ref myArr, 10, 42);

内容的提问来源于stack exchange,提问作者Haidrex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 06:48:11