微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

引起原因:java.lang.StackOverflowError:java.lang.AbstractStringBuilder.appendAbstractStringBuilder.java:649的堆栈大小为1040KB

如何解决引起原因:java.lang.StackOverflowError:java.lang.AbstractStringBuilder.appendAbstractStringBuilder.java:649的堆栈大小为1040KB

我正在尝试使用StringBuilderIterator从json对象动态构建查询

方法

public static void main(String[] args) {
        //JSONArray jsonArray = array of json
        
        //for(int i=0;i<jsonArray.length();i++){
            //JSONObject jsonObject=jsonArray.get(i);
            //for sample json
            JSONObject jsonObject=new JSONObject("{\"SchemaId\":\"186f134a-e65c-4e2d-92c6-04afe6951dd6\",\"SchemaName\":\"CIR\",\"Schema\":\"{}\",\"Parent\":null,\"Application\":\"CA\",\"ModifiedDateTime\":\"2020-08-31T04:21:46.403\",\"Version\":\"3\",\"PageType\":\"Line\",\"favorite\":false,\"CategoryType\":\"bits\",\"IsDeleted\":true}");
            createPreparedStmtQuery(jsonObject,"mytable");
        //}
        
    }
    public static  String createPreparedStmtQuery(JSONObject record,String tableName) throws JSONException {
        record = modifyRecord(record);

        Iterator<String> keys = record.keys();
        StringBuilder builder = new StringBuilder();
        builder.append("insert or replace into ");
        builder.append(tableName);
        builder.append(" (");

        while(keys.hasNext()){
            builder.append(keys.next()).append(",");
        }
        builder.setLength(builder.length() - 1);

        builder.append(") values(");
        keys = record.keys();
        JSArray valuesArray = new JSArray();
        while(keys.hasNext()){
            String key = keys.next();
            if( record.get(key) != null && record.get(key) instanceof String) {
               
            }

            builder.append("?").append(",");

            valuesArray.put(record.get(key));
        }
        builder.deleteCharat(builder.length() - 1);

        builder.append(");");

        JSONObject ret = new JSONObject();
        ret.put("query",builder.toString());
        ret.put("values",valuesArray);
        return ret.toString();
    }

    private static JSONObject modifyRecord(JSONObject record) throws JSONException {

        if (record.has("ValidFrom")) {
            record.remove("ValidFrom");
        }
        if (record.has("ValidTo")) {
            record.remove("ValidTo");
        }

        Iterator<String> keys = record.keys();
        while(keys.hasNext()){
            String key = keys.next();
            if (record.get(key) instanceof JSONObject || record.get(key) instanceof List) {
                record.put(key,((JSObject)record.get(key)).toString());
            }
        }

        return record;
    }

并收到如下错误消息:

Caused by: java.lang.StackOverflowError: stack size 1040KB         at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:649)

以上方法有问题吗?如何解决

谢谢。

解决方法

您可以尝试增加JVM的堆栈大小。您的大小似乎是1040KB。您可以将其设置为其他值(例如48 MB),如下所示:

java -Xss48m

有关更多详细信息和示例,请参见https://www.baeldung.com/jvm-configure-stack-sizes或官方参考文献https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。