Skip to content

StackOverflowError when reading a file with a large amount of lines #11

@jzaratei

Description

@jzaratei

Summary
I'm implementing a LineReader as in the example [0] with a default padder. But, sometimes, I'm getting an StackOverflowError when the file has more than 50 lines aprox.

java.lang.StackOverflowError
	at java.base/java.util.regex.Pattern$Curly.match(Pattern.java:4379)
	at java.base/java.util.regex.Pattern$GroupHead.match(Pattern.java:4804)
	at java.base/java.util.regex.Pattern$GroupTail.match(Pattern.java:4863)
	at java.base/java.util.regex.Pattern$Curly.match0(Pattern.java:4392)
	at java.base/java.util.regex.Pattern$Curly.match(Pattern.java:4379)
	at java.base/java.util.regex.Pattern$GroupHead.match(Pattern.java:4804)
	at java.base/java.util.regex.Pattern$GroupTail.match(Pattern.java:4863)
	at java.base/java.util.regex.Pattern$Curly.match0(Pattern.java:4392)
	at java.base/java.util.regex.Pattern$Curly.match(Pattern.java:4379)
	at java.base/java.util.regex.Pattern$GroupHead.match(Pattern.java:4804)
	at java.base/java.util.regex.Pattern$GroupTail.match(Pattern.java:4863)
	at java.base/java.util.regex.Pattern$Curly.match0(Pattern.java:4392)
	at java.base/java.util.regex.Pattern$Curly.match(Pattern.java:4379)
	at java.base/java.util.regex.Pattern$GroupHead.match(Pattern.java:4804)
	at java.base/java.util.regex.Pattern$GroupTail.match(Pattern.java:4863)
	at java.base/java.util.regex.Pattern$Curly.match0(Pattern.java:4392)
	at java.base/java.util.regex.Pattern$Curly.match(Pattern.java:4379)
	at java.base/java.util.regex.Pattern$GroupHead.match(Pattern.java:4804)
	at java.base/java.util.regex.Pattern$GroupTail.match(Pattern.java:4863)
	at java.base/java.util.regex.Pattern$Curly.match0(Pattern.java:4392)
	at java.base/java.util.regex.Pattern$Curly.match(Pattern.java:4379)
	at java.base/java.util.regex.Pattern$GroupHead.match(Pattern.java:4804)
	at java.base/java.util.regex.Pattern$GroupTail.match(Pattern.java:4863)
	at java.base/java.util.regex.Pattern$Curly.match0(Pattern.java:4392)
	at java.base/java.util.regex.Pattern$Curly.match(Pattern.java:4379)
	at java.base/java.util.regex.Pattern$GroupHead.match(Pattern.java:4804)
	at java.base/java.util.regex.Pattern$GroupTail.match(Pattern.java:4863)
	at java.base/java.util.regex.Pattern$Curly.match0(Pattern.java:4392)
	at java.base/java.util.regex.Pattern$Curly.match(Pattern.java:4379)
	at java.base/java.util.regex.Pattern$GroupHead.match(Pattern.java:4804)
	at java.base/java.util.regex.Pattern$GroupTail.match(Pattern.java:4863)
	at java.base/java.util.regex.Pattern$Curly.match0(Pattern.java:4392)
	at java.base/java.util.regex.Pattern$Curly.match(Pattern.java:4379)
	at java.base/java.util.regex.Pattern$GroupHead.match(Pattern.java:4804)
...

Detail
When I'm mapping a plain text file using a custom reader, sometimes, the unmarshaller method thows a java.lang.StackOverflowError exception, probably because of the large amount of lines. It ussually happpens when the file has more than 100 lines but it has occurred on files with 60 or so.

Code

private static void setUp(Process process) {

        String defFile = getDefinitionFile(process);
        unmarshaller = new Unmarshaller<>(PedUtils.loadDefinition(defFile), new LineReader() {

           private SimpleLineReader simpleLineReader = new SimpleLineReader();

            public String readLine(Reader reader, Padder defaultPadder, String propertyDelimiter, int recordLength, String lineSeparator) {
                String line = simpleLineReader.readLine(reader, defaultPadder, propertyDelimiter, recordLength, lineSeparator);
                LOGGER.debug(process + "-Unmarshaller-Line read: " + line);
                if (line != null) {
                    if (line.contains("\r")) line = line.replace("\r", "");
                }
                return line;
            }
        });
    }

List<PedFile> file = unmarshaller.unmarshallToStream(PedUtils.openStream(getFileSource(process)))
                .collect(Collectors.toList());

file example:

1202101050045834582
200100458345829520513820201115202101050000250000000105
200200458345829520513800012021010500079344800008410695027022RON CENT 23A ZACAP  RON CENTENARIO 23 A ZACAPA 70 000010000000100000051900A000U 00005190           10000519000051900000051900005190000002500000051900005190000000000000000000000000021000000000000000
200200458345829520513800022021010500004579400008436532094088EST2 MATARROME CZA  EST2 DUE MATARROMERA TTO CZA  000010000000100000032390A001U 00003239           10000323900032390000035990003599000002500000032390003239000000000000000000000000021000000000000000
2002004583458295205138000320210105000220273000084203780615196FRI.YLLERA 5.5 25  PACK 6FRIZZ.YLLERA 5.5 VDJO 25000010000000100000015250A002U 00001525           10000152500015250000015250001525000002500000015250001525000000000000000000000000021000000000000000
200200458345829520513800042021010500003330300008423954260061RJA V.TONDONIA RVA  -RIOJA VIA TONDONIA RVA 75CL  000010000000100000030900A003U 00003090           10000309000030900000030900003090000002500000030900003090000000000000000000000000021000000000000000
...

[0]
https://github.com/ffissore/jrecordbind/blob/3.1.0/jrecordbind-test/src/test/java/org/fissore/jrecordbindtests/test/SimpleNotPaddedLineReaderUnmarshallTest.java

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions