public static int ExecuteNonQuery(String procedure, params SqlParameter[] args)
{
if (args == null) throw new ArgumentNullException("args");
else
return ExecuteNonQuery(procedure, new SqlParameter[] { });
}
为什么在调用上面的方法时获取递归函数并抛出StackOverFlow异常。(而参数包含5个值)
答案 0 :(得分:8)
不要将空数组与 null数组混淆。您使用空数组再次调用相同的方法,但是必须停止此函数的唯一检查是检查空数组,并抛出异常。你需要这样的东西:
if (args.length == 0) {
// bail out somehow
}
(在你的空检查之后,为了防止NPE)
答案 1 :(得分:3)
这是因为重载决策选择了相同的ExecuteNonQuery方法,所以你实际上是一遍又一遍地调用相同的方法。
你的方法需要一个SqlParameter [](params部分只是语法糖),你再次调用相同的方法,使用SqlParameter []作为第二个参数。
答案 2 :(得分:1)
该函数将无限递归,因为没有终止条件:当使用非null args
参数调用时,它只是使用indentical参数调用自身,并且除了耗尽之外没有任何东西可以阻止此无限递归堆栈空间。
答案 3 :(得分:1)
也许你想要像
这样的东西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
}
答案 4 :(得分:0)
您的args
变量永远不会为空;你应该编码:
return ExecuteNonQuery(procedure, null);
或创建一个没有args
参数的重载。
答案 5 :(得分:0)
您需要检查列表的长度是否为0,而不是为null。或者您可以将其传递为null,如下所示:
public static int ExecuteNonQuery(String procedure, params SqlParameter[] args)
{
if (args == null) throw new ArgumentNullException("args");
else
return ExecuteNonQuery(procedure, null);
}
答案 6 :(得分:0)
因为你在return
声明中称呼自己。