in src/main/java/com/univocity/parsers/common/AbstractParser.java [290:372]
private TextParsingException handleException(Throwable ex) {
if(context != null) {
context.stop();
}
if (ex instanceof DataProcessingException) {
DataProcessingException error = (DataProcessingException) ex;
error.restrictContent(errorContentLength);
error.setContext(this.context);
throw error;
}
String message = ex.getClass().getName() + " - " + ex.getMessage();
char[] chars = output.appender.getChars();
if (chars != null) {
int length = output.appender.length();
if (length > chars.length) {
message = "Length of parsed input (" + length + ") exceeds the maximum number of characters defined in" +
" your parser settings (" + settings.getMaxCharsPerColumn() + "). ";
length = chars.length;
}
String tmp = new String(chars);
if (tmp.contains("\n") || tmp.contains("\r")) {
tmp = displayLineSeparators(tmp, true);
String lineSeparator = displayLineSeparators(settings.getFormat().getLineSeparatorString(), false);
message += "\nIdentified line separator characters in the parsed content. This may be the cause of the error. " +
"The line separator in your parser settings is set to '" + lineSeparator + "'. " + getParsedContent(tmp);
}
int nullCharacterCount = 0;
//ensuring the StringBuilder won't grow over Integer.MAX_VALUE to avoid OutOfMemoryError
int maxLength = length > Integer.MAX_VALUE / 2 ? Integer.MAX_VALUE / 2 - 1 : length;
StringBuilder s = new StringBuilder(maxLength);
for (int i = 0; i < maxLength; i++) {
if (chars[i] == '\0') {
s.append('\\');
s.append('0');
nullCharacterCount++;
} else {
s.append(chars[i]);
}
}
tmp = s.toString();
if (nullCharacterCount > 0) {
message += "\nIdentified " + nullCharacterCount + " null characters ('\0') on parsed content. This may " +
"indicate the data is corrupt or its encoding is invalid. Parsed content:\n\t" + getParsedContent(tmp);
}
}
if (ex instanceof ArrayIndexOutOfBoundsException) {
try {
int index = Integer.parseInt(ex.getMessage());
if (index == settings.getMaxCharsPerColumn()) {
message += "\nHint: Number of characters processed may have exceeded limit of " + index + " characters per column. Use settings.setMaxCharsPerColumn(int) to define the maximum number of characters a column can have";
}
if (index == settings.getMaxColumns()) {
message += "\nHint: Number of columns processed may have exceeded limit of " + index + " columns. Use settings.setMaxColumns(int) to define the maximum number of columns your input can have";
}
message += "\nEnsure your configuration is correct, with delimiters, quotes and escape sequences that match the input format you are trying to parse";
} catch (Throwable t) {
//ignore;
}
}
try {
if (!message.isEmpty()) {
message += "\n";
}
message += "Parser Configuration: " + settings.toString();
} catch (Exception t) {
//ignore
}
if (errorContentLength == 0) {
output.appender.reset();
}
TextParsingException out = new TextParsingException(context, message, ex);
out.setErrorContentLength(errorContentLength);
return out;
}