我尝试生成随机代码名称作为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;
}
}
答案 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){}
}
}