Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将某些字符串切成片时出现堆栈溢出_Java_Minecraft_Minecraft Forge - Fatal编程技术网

Java 将某些字符串切成片时出现堆栈溢出

Java 将某些字符串切成片时出现堆栈溢出,java,minecraft,minecraft-forge,Java,Minecraft,Minecraft Forge,我用cutString做的是让下一个字符串排成一行,比如上面的第二行想要…,然后把它切成两半。一半将是开头的单词,以填充前一个字符串的任何尾随空格。另一半则走上了新的路线。这一切都是为了很好地包装字符串 我觉得cutString的堆栈溢出了。日志不够具体,但在textModule中注释掉任何使用cutString的内容都会消除崩溃,但当然,会删除屏幕上的所有包装和痕迹 日志是: ... "learn how to manipulate light using reflection and ref

我用cutString做的是让下一个字符串排成一行,比如上面的第二行想要…,然后把它切成两半。一半将是开头的单词,以填充前一个字符串的任何尾随空格。另一半则走上了新的路线。这一切都是为了很好地包装字符串

我觉得cutString的堆栈溢出了。日志不够具体,但在textModule中注释掉任何使用cutString的内容都会消除崩溃,但当然,会删除屏幕上的所有包装和痕迹

日志是:

...
"learn how to manipulate light using reflection and refraction!",
"Ever wanted to suck items and entities with a single beam of light? Ever wanted to create a disco ball based quarry? How about creating a laser defense system? Or, heck, maybe you just wanted to make an epic laser show?",
...

该方法是:

[16:19:29] [Client thread/FATAL]: Unreported exception thrown!
java.lang.StackOverflowError
at net.minecraft.client.gui.FontRenderer.getFormatFromString(FontRenderer.java:945) ~[FontRenderer.class:?]
at net.minecraft.client.gui.FontRenderer.wrapFormattedStringToWidth(FontRenderer.java:848) ~[FontRenderer.class:?]
at net.minecraft.client.gui.FontRenderer.wrapFormattedStringToWidth(FontRenderer.java:849) ~[FontRenderer.class:?]
整个FontRenderer类:

TextModule类:

使用从TextModule生成的组件对象的TextAdapter类:

通过读取json使用TextAdapter的类:

和json文件:


是什么导致堆栈溢出?如果您需要更多信息,请告诉我。

跟踪表明此方法中的错误在此简化

    String wrapFormattedStringToWidth(String str, int wrapWidth)
{
    int i = this.sizeStringToWidth(str, wrapWidth);

    if (str.length() <= i)
    {
        return str;
    }
    else
    {
        String s = str.substring(0, i);
        char c0 = str.charAt(i);
        boolean flag = c0 == 32 || c0 == 10;
        String s1 = getFormatFromString(s) + str.substring(i + (flag ? 1 : 0));
        return s + "\n" + this.wrapFormattedStringToWidth(s1, wrapWidth);
    }
}
此方法递归调用自身,仅当字符串长度小于或等于sizeStringToWidth返回的值时才返回。在导致堆栈溢出的特定情况下,可能永远不会发生这种情况。可能是计算错误,或者字符串中有奇怪的字符


如果不知道这些方法在做什么,就很难说出更多信息-我无法访问gist,这与AxelH的问题相同。

快速阅读,愤怒是永远不会改变的。但这显然是一个无限或过于接近的递归调用。您应该调试wrapFormattedStringToWidth方法,以检查此方法是否正确。@AxelH调试cutString表明它正在从我所看到的内容正确地拆分字符串。它最终捕获一个字符串,并在不分裂的情况下反复循环它。但是我只看到过一次这种情况,不能轻易复制。sizeStringToWidth应该如何从String和wrapFormattedStringToWidth中获取格式。其中一个任务可能是不做is工作,用这些信息更新代码。不确定第一个代码是否有用,没有对wrapFormattedStringToWidth的调用。@AxelH List lines=fr.listFormattedStringToWidthstring,TextAdapter.wrapLength-x;直接使用wrapFormattedStringToWidth的。只需转换为列表,然后运行它。错误来自我的逻辑。我这方面有些地方不对劲。不是fontrenderer。。。如果你不多解释,我看不出你希望得到什么帮助。
    String wrapFormattedStringToWidth(String str, int wrapWidth)
{
    int i = this.sizeStringToWidth(str, wrapWidth);

    if (str.length() <= i)
    {
        return str;
    }
    else
    {
        String s = str.substring(0, i);
        char c0 = str.charAt(i);
        boolean flag = c0 == 32 || c0 == 10;
        String s1 = getFormatFromString(s) + str.substring(i + (flag ? 1 : 0));
        return s + "\n" + this.wrapFormattedStringToWidth(s1, wrapWidth);
    }
}
String wrapFormattedStringToWidth(String str, int wrapWidth)
{
    int i = this.sizeStringToWidth(str, wrapWidth);

    if (str.length() <= i)
    {
        return str;  // exit of recursive call
    }
    else
    {
        ...
        // recursive call
        return s + "\n" + this.wrapFormattedStringToWidth(s1, wrapWidth);
    }
}