{"record":{"id":"ff87c3a1cb944de8","repo":"apache/flink","slug":"delimiter-must-not-be-null","errorCode":null,"errorMessage":"Delimiter must not be null","messagePattern":"Delimiter must not be null","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"flink-core/src/main/java/org/apache/flink/api/common/io/DelimitedInputFormat.java","lineNumber":231,"sourceCode":"     * @param charset name of the charset\n     */\n    @PublicEvolving\n    public void setCharset(String charset) {\n        this.charsetName = Preconditions.checkNotNull(charset);\n        this.charset = null;\n\n        if (this.delimiterString != null) {\n            this.delimiter = delimiterString.getBytes(getCharset());\n        }\n    }\n\n    public byte[] getDelimiter() {\n        return delimiter;\n    }\n\n    public void setDelimiter(byte[] delimiter) {\n        if (delimiter == null) {\n            throw new IllegalArgumentException(\"Delimiter must not be null\");\n        }\n        this.delimiter = delimiter;\n        this.delimiterString = null;\n    }\n\n    public void setDelimiter(char delimiter) {\n        setDelimiter(String.valueOf(delimiter));\n    }\n\n    public void setDelimiter(String delimiter) {\n        if (delimiter == null) {\n            throw new IllegalArgumentException(\"Delimiter must not be null\");\n        }\n        this.delimiter = delimiter.getBytes(getCharset());\n        this.delimiterString = delimiter;\n    }\n\n    public int getLineLengthLimit() {","sourceCodeStart":213,"sourceCodeEnd":249,"githubUrl":"https://github.com/apache/flink/blob/2f3c205e9266cb30240eb7f4fdab15cad629a70f/flink-core/src/main/java/org/apache/flink/api/common/io/DelimitedInputFormat.java#L213-L249","documentation":"DelimitedInputFormat splits input into records by scanning for a delimiter byte sequence; a null delimiter has no meaning and would break every record boundary. setDelimiter(byte[]) rejects null with IllegalArgumentException. The format also clears the cached string form so the two stay consistent.","triggerScenarios":"Calling format.setDelimiter((byte[]) null). Common when the delimiter comes from a config/parameter that was not set and resolved to null.","commonSituations":"Reading a CSV/TSV/text input where the separator property is missing from configuration; passing a byte[] that was never initialized; chaining getBytes on a null String before calling setDelimiter.","solutions":["Provide a non-null byte[] delimiter, e.g. format.setDelimiter(\"\\n\".getBytes(StandardCharsets.UTF_8)).","Default the delimiter to newline when the configured value is null before calling setDelimiter.","Prefer the String overload setDelimiter(String) or the char overload setDelimiter(char) for readability."],"exampleFix":"// before\nbyte[] delim = config.get(\"delimiter\"); // null\nformat.setDelimiter(delim); // throws\n\n// after\nbyte[] delim = config.get(\"delimiter\");\nformat.setDelimiter(delim != null ? delim : \"\\n\".getBytes(StandardCharsets.UTF_8));","handlingStrategy":"validation","validationCode":"byte[] delim = configuredDelimiter;\nif (delim == null) {\n    delim = \"\\n\".getBytes(StandardCharsets.UTF_8);\n}\nformat.setDelimiter(delim);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Default the delimiter to newline when config returns null.","Prefer the String/char overloads which are harder to leave null.","Centralize delimiter resolution in one helper and reuse it."],"tags":["input-format","delimited","delimiter","validation","illegal-argument"],"backgroundTag":null,"analyzedSha":"2f3c205e9266cb30240eb7f4fdab15cad629a70f","analyzedAt":"2026-08-14T08:48:24.518Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}