调用函数getConnection()时线程“main”java.lang.StackOverflowError中的异常

时间:2014-02-07 08:10:49

标签: java

我在编译项目时遇到错误 -

Exception in thread "main" java.lang.StackOverflowError
    at sun.reflect.Reflection.getCallerClass(Native Method)
    at java.lang.ClassLoader.getCallerClassLoader(Unknown Source)
    at java.lang.Class.forName(Unknown Source)
    at testpackage.DriverManager.getConnection(DriverManager.java:14)
    at testpackage.DriverManager.getConnection(DriverManager.java:20)
    at testpackage.DriverManager.getConnection(DriverManager.java:20)

这是我的第一个文件代码 -

package testpackage;

import java.sql.*;

import javax.swing.JOptionPane;

class DriverManager {
       static Connection dbConnection = null;

       public static Connection getConnection(String String_url, String USER, String PASS) throws SQLException 
       {
          try {

            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            //JOptionPane.showMessageDialog(null, "driver load successfully"); 
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            //JOptionPane.showMessageDialog(null, "driver load failed"); 
        }
          dbConnection = DriverManager.getConnection(String_url,USER,PASS);
          return dbConnection;
       }

    } 

我在另一个文件中调用了这个方法 -

package testpackage;
import java.awt.Rectangle;
import org.openqa.selenium.firefox.FirefoxDriver;
public class testclass {
public static void main (String[] args) throws Exception
{   
DriverManager Connection_getConnection = new DriverManager();
        Connection_getConnection.getConnection("database string url","username","password");
}
}

注意 - 我已经使用alert来调试问题并递归地查找函数调用,因为我一个接一个地收到警报。

4 个答案:

答案 0 :(得分:1)

您的DriverManager.getConnection()方法包括调用DriverManager.getConnection(),其中包括调用DriverManager.getConnnection(),...

那是因为您选择以与标准java.sql.DriverManager.getConnection()相同的方式命名您的类和方法。

答案 1 :(得分:0)

看起来你正在打电话:

dbConnection = DriverManager.getConnection(String_url,USER,PASS);

在返回一个值之前,因为这是你当前所处的方法,所以递归调用此方法会导致无限循环。

getConnection(...)方法调用的getConnection(...)方法永远不会结束,因此StackOverflowError

答案 2 :(得分:0)

代码将以无限循环结束。 !这就是你的筹码被填满的原因。!!

修复:

删除

DriverManager.getConnection(String_url,USER,PASS);
从getConnection函数调用的

将再次调用相同的函数。所以从getConnection函数

中删除它

答案 3 :(得分:0)

您的电话

dbConnection = DriverManager.getConnection(String_url,USER,PASS);

创建无限递归。您正在导入java.sql。*但仍然在您的班级中调用getConnection()

更改为

dbConnection = java.sql.DriverManager.getConnection(String_url,USER,PASS);