stackoverflow异常

时间:2009-12-28 11:33:13

标签: java exception stack-overflow

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

为什么在调用上面的方法时获取递归函数并抛出StackOverFlow异常。(而参数包含5个值)

7 个答案:

答案 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声明中称呼自己。