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