如何生成随机代码并检查它是否存在于数据库中

时间:2014-03-24 02:57:11

标签: java

我尝试生成随机代码名称作为licenseKey,并检查它是否存在于数据库中。如果不存在,则在我的jsp页面中显示,如果存在,继续生成随机代码。我收到错误“java.lang.StackOverflowError”。怎么解决这个?以下是我的代码:

package com.raydar.hospital;
import com.raydar.hospital.DB_Connection;
import java.sql.*;

public class RandomCodeGenerator {


String licenseKey = "";

int noOfCAPSAlpha = 4;
int noOfDigits = 4;
int minLen = 8;
int maxLen = 8;

char[] code = RandomCode.generateCode(minLen, maxLen, noOfCAPSAlpha, noOfDigits);


public RandomCodeGenerator(){
}


public String getOutputCode() throws Exception{

    String result ="";

    result = isLicenseKeyExist();
    System.out.println("4 + " +result);

    if (result=="false"){

        System.out.println("1 + " +new String(code));

        licenseKey = new String(code);
    }

    else if (result=="true"){

            System.out.println("2 + " +new String(code));

            licenseKey = new String(code);

                isLicenseKeyExist ();         
        }           

    return licenseKey;
}



private String isLicenseKeyExist () throws Exception{
    String code = "";
    code = getOutputCode();

    Connection connection = null;
    Statement statement = null;
    ResultSet rs = null;
    String result="";
    System.out.println("3 + " +code);

    try{
    DB_Connection connect = new DB_Connection();

    connection = connect.getDBConnection();
    statement = connection.createStatement();
    rs = statement.executeQuery("SELECT licenseKey FROM hospital WHERE licenseKey = '" +code+ "'");
    if (rs.next()){    

    result = "true";

    }

    else{

        result = "false";

    }

    }catch (Exception e){
    System.out.println("Error retrieving data! "+e);

}

    return result;

}

}

3 个答案:

答案 0 :(得分:3)

您创建一个递归循环,其中isLicenseKeyExist()调用getOutputCode(),但getOutputCode()调用isLicenseKeyExist()。所以最终你会耗尽堆栈空间,并获得此异常。

下面,

public String getOutputCode() throws Exception{
    String result ="";
    result = isLicenseKeyExist();
   ...

}

private String isLicenseKeyExist () throws Exception{
    String code = "";
    code = getOutputCode();
...
}

答案 1 :(得分:0)

  

@aween - @captureSteve回答了问题的第一部分。   所以,直接到#34;我不打电话给这个功能"评论。看,如果我   正确理解你的问题,你想生成一个密钥,并且   使用isLicenseKeyExist()检查数据库中是否可用。在这样的   为什么不首先创建密钥,然后将密钥传递给   isLicenseKeyExist()。然后此函数将返回true / false   你可以决定做什么。

答案 2 :(得分:0)

我想你想要这样的东西。从您的班级及其初始化程序中删除名为code的字段,然后将RandomCode.generateCode的调用放在getOutputCode方法中,如下所示。原因是如果您的代码已经在数据库中,您将不得不重复调用它。

public String getOutputCode() throws SQLException {
    String code;
    do {
        code = new String(RandomCode.generateCode(minLen, maxLen, noOfCAPSAlpha, noOfDigits));
    }
    while(licenceKeyExists(code));
    return code;
}
private boolean licenceKeyExists(String code) throws SQLException {
    try{
        DB_Connection connect = new DB_Connection();
        connection = connect.getDBConnection();
        statement = connection.createStatement();
        rs = statement.executeQuery("SELECT licenseKey FROM hospital WHERE licenseKey = '" +code+ "'");
        return rs.next();
    }
    finally {
        try {
            connection.close();
        } catch (SQLException ignored){}
    }
}