Java 堆栈溢出异常

Java 堆栈溢出异常,java,exception,stack-overflow,Java,Exception,Stack Overflow,调用上述方法时,为什么要获取递归函数并引发StackOverFlow异常(虽然参数包含5个值)这是因为重载解析选择相同的ExecuteOnQuery方法,所以实际上是在反复调用相同的方法 您的方法接受一个SqlParameter[](params部分只是语法糖),您再次调用同一个方法,使用SqlParameter[]作为第二个参数。您的args变量从不为空;您应该编写以下代码: public static int ExecuteNonQuery(String procedure, params

调用上述方法时,为什么要获取递归函数并引发StackOverFlow异常(虽然参数包含5个值)

这是因为重载解析选择相同的ExecuteOnQuery方法,所以实际上是在反复调用相同的方法


您的方法接受一个SqlParameter[](params部分只是语法糖),您再次调用同一个方法,使用SqlParameter[]作为第二个参数。

您的
args
变量从不为空;您应该编写以下代码:

public static int ExecuteNonQuery(String procedure, params SqlParameter[] args)
{
    if (args == null) throw new ArgumentNullException("args");
    else
    return ExecuteNonQuery(procedure, new SqlParameter[] { });
}

或者创建一个没有参数的重载。

您需要检查列表的长度是否为0,而不是null。或者可以将其传递为null,如下所示:

return ExecuteNonQuery(procedure, null);
不要将空数组与空数组混淆。使用空数组再次调用同一个方法,但必须停止此函数的唯一检查是检查空数组,并引发异常。你需要像这样的东西:

 public static int ExecuteNonQuery(String procedure, params SqlParameter[] args)
 {
            if (args == null) throw new ArgumentNullException("args");
            else
            return ExecuteNonQuery(procedure, null);
 }

(在空检查之后,为了防止NPE)

因为您在
return
语句中调用自己。

函数将无限递归,因为没有终止条件:当使用非空
参数调用args
参数时,它只使用缩进参数调用自己,除了耗尽堆栈空间之外,没有什么能阻止这种无限递归。

也许您想要类似的东西

if (args.length == 0) {
   // bail out somehow
}

1.
null
不能很好地处理重载-调用不明确,代码无法编译。2.让我们假设它编译了,那么它会做什么呢?下一个
args
将为null,导致异常(但不会),或者
{null}
,导致另一个无限循环。。。
public static int ExecuteNonQuery(String procedure, params SqlParameter[] args)
{
  if (args == null) 
      return ExecuteNonQuery(procedure, new SqlParameter[] { });

  // Do some stuff here where args can be assumed != null
}