在 Java 中将 null 传递给破坏性方法



我计划在Java中实现一个破坏性的串联函数,如public static void dcatenate(IntList A, IntList B),用于将列表B附加到A,并且应该修改原始的A。例如

IntList A = new IntList(1,2,3); // A: 1->2->3
IntList B = new IntList(4,5,6); // B: 4->5->6
dcatenate(A, B) // A: 1->2->3->4->5->6

但是,如果A=null呢?

IntList A = null;
IntList B = new IntList(4,5,6); // B: 4->5->6
dcatenate(A, B) // A: 4->5->6 (is it possible?)
由于函数参数

是按值传递的,因此当我将 null 传递给参数时,我无法在函数中找到原始 A。此外,修改参数 A 永远不会更改原始 A,因为它们存储在不同的地址中,尽管它们都是空的。我的理解正确吗?如果是这样,我该如何解决这个问题?是否可以像 C/C++ 一样将原始 A 的地址传递给参数?

你的理解是正确的。您可以通过将A初始化为空列表而不是 null 来解决此问题。这也将避免 NPE 并减少对!= null检查的需求。

我建议你将 dcatenate() 的参数更改为

list = dcatenate(list); 

其中列表包含 IntList A 和 B。

这样,您可以保持引用不变。

我不认为这是一种限制。这只是其中一种方法。

不能

将空引用更改为对象实例。A的值甚至可能根本不是一个变量——也许调用代码看起来像:

dcatenate(getListA(), getListB());

在这种情况下,dcatenate实际上无法将新的对象实例传达回其调用方。

在这种特殊情况下,听起来dcatenate函数的先决条件是A参数必须是可变列表。 null不是一个可变列表,因此dcatenate应该抛出异常(可能是IllegalArgumentExceptionNullPointerException)。

出于您提到的原因,我建议您的dcatenate方法返回一个新列表,而不是尝试直接修改参数。然后,如果需要,您可以简单地将结果分配回A

例:

IntList A = null;
IntList B = new IntList(4,5,6); // B: 4->5->6
A = dcatenate(A, B);

最新更新