Tag: stack overflow

使用RegEx匹配大输入时的StackOverflowError

使用RegEx模式匹配结果时,我得到了StackOverflowError 。 模式是(\d\*?(;(?=\d))?)+ 。 此正则表达式用于validation输入: 12345;4342;234*;123*;344324 输入是一个字符串,由值(仅数字)分隔; 。 每个值最后可以包含一个* (用作其他匹配的通配符)。 没有; 在字符串的末尾。 问题是这个正则表达式工作正常,少数值。 但是当值的数量太大(超过300)时,它将导致StackOverflowError 。 final String TEST_REGEX = “(\\d\\*?(;(?=\\d))?)+”; // Generate string StringBuilder builder = new StringBuilder(); int number = 123456; for (int count = 1; count <= 300; count++) { builder.append(Integer.toString(number).concat(";")); number++; } builder.deleteCharAt(builder.lastIndexOf(";")) builder.toString().matches(TEST_REGEX); //<———- StackOverflowError 和堆栈跟踪: java.lang.StackOverflowError at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3715) at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556) […]

finally块中的堆栈溢出error handling

我有一个java程序,运行无限次。 程序代码: void asd() { try { //inside try block System.out.println(“Inside try !!!”); asd(); } finally { //inside finally System.out.println(“Inside finally !!!”); asd(); } } OUTPUT:通过不断打印两个sysout,这个程序无限运行。 我的问题:在某些时候,它开始从try块中抛出StackOverflowErrors,因此它到达finally块,我们再次以递归方式调用此函数。 但是,当我们已经面临StackOverflowError时,finally块中的递归函数如何执行? JVM如何处理这种情况? 如果我们也得到OutOfMemoryErrors会发生同样的行为吗?

StackOverflowError计算BigInteger的阶乘?

我正在尝试编写一个Java程序来计算大数的阶乘。 似乎BigInteger无法容纳这么大的数字。 以下是我写的(直截了当的)代码。 public static BigInteger getFactorial(BigInteger num) { if (num.intValue() == 0) return BigInteger.valueOf(1); if (num.intValue() == 1) return BigInteger.valueOf(1); return num.multiply(getFactorial(num.subtract(BigInteger.valueOf(1)))); } 上述程序在5022中处理的最大数量,之后程序抛出StackOverflowError 。 有没有其他方法来处理它?

为什么最大递归深度我可以达到非确定性?

我决定尝试一些实验,看看我能发现堆栈帧的大小,以及当前执行代码在堆栈中的距离。 我们可能会在这里调查两个有趣的问题: 当前代码的深度是多少级别? 当前方法遇到StackOverflowError之前可以达到多少级别的递归? 堆栈当前执行代码的深度 这是我能想到的最好的: public static int levelsDeep() { try { throw new SomeKindOfException(); } catch (SomeKindOfException e) { return e.getStackTrace().length; } } 这看起来有点黑客。 它生成并捕获exception,然后查看堆栈跟踪的长度。 不幸的是,它似乎也有一个致命的限制,即返回的堆栈跟踪的最大长度为1024.除此之外的任何内容都被削减,因此此方法可以返回的最大值为1024。 题: 有没有更好的方法做到这一点,不是那么hacky并没有这个限制? 对于它的价值,我的猜测是没有: Throwable.getStackTraceDepth()是一个本机调用,它建议(但不能certificate)它不能用纯Java完成。 确定我们剩下多少递归深度 我们可以达到的等级数量将由(a)堆栈帧的大小和(b)剩余堆栈量确定。 让我们不要担心堆栈帧的大小,只需看看在我们遇到StackOverflowError之前我们可以达到多少级别。 这是我执行此操作的代码: public static int stackLeft() { try { return 1+stackLeft(); } catch (StackOverflowError e) { return 0; } } 它的工作令人钦佩,即使它在堆栈剩余量方面是线性的。 […]