{"record":{"id":"28138b5958ac6483","repo":"alibaba/Sentinel","slug":"charset-can-t-be-null","errorCode":null,"errorMessage":"charset can't be null","messagePattern":"charset can't be null","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"sentinel-core/src/main/java/com/alibaba/csp/sentinel/node/metric/MetricSearcher.java","lineNumber":65,"sourceCode":"     */\n    public MetricSearcher(String baseDir, String baseFileName) {\n        this(baseDir, baseFileName, defaultCharset);\n    }\n\n    /**\n     * @param baseDir      metric文件所在目录\n     * @param baseFileName metric文件名的关键字，比如 alihot-metrics.log\n     * @param charset\n     */\n    public MetricSearcher(String baseDir, String baseFileName, Charset charset) {\n        if (baseDir == null) {\n            throw new IllegalArgumentException(\"baseDir can't be null\");\n        }\n        if (baseFileName == null) {\n            throw new IllegalArgumentException(\"baseFileName can't be null\");\n        }\n        if (charset == null) {\n            throw new IllegalArgumentException(\"charset can't be null\");\n        }\n        this.baseDir = baseDir;\n        if (!baseDir.endsWith(File.separator)) {\n            this.baseDir += File.separator;\n        }\n        this.baseFileName = baseFileName;\n        metricsReader = new MetricsReader(charset);\n    }\n\n    /**\n     * 从beginTime开始，检索recommendLines条(大概)记录。同一秒中的数据是原子的，不能分割成多次查询。\n     *\n     * @param beginTimeMs    检索的最小时间戳\n     * @param recommendLines 查询最多想得到的记录条数，返回条数会尽可能不超过这个数字。但是为保证每一秒的数据不被分割，有时候\n     *                       返回的记录条数会大于该数字。\n     * @return\n     * @throws Exception\n     */","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/alibaba/Sentinel/blob/a3f40ba8e900c8489bd520274739f17235a7721c/sentinel-core/src/main/java/com/alibaba/csp/sentinel/node/metric/MetricSearcher.java#L47-L83","documentation":"MetricSearcher reads metric log files line-by-line as text, so it must know the Charset used when they were written (defaultCharset otherwise). A null charset throws IllegalArgumentException because metric decoding would be undefined.","triggerScenarios":"new MetricSearcher(baseDir, baseFileName, null) — the three-arg constructor with a null Charset argument.","commonSituations":"Injecting a Charset from configuration that failed to resolve (e.g. Charset.forName on a bad name wrapped in a try that yields null), or explicitly passing null intending 'default' instead of using the two-arg constructor.","solutions":["Use the two-argument constructor MetricSearcher(baseDir, baseFileName) if you want the default charset.","Otherwise pass a concrete Charset such as Charset.forName(\"UTF-8\") or StandardCharsets.UTF_8.","Fix upstream code that resolves a charset name and can return null."],"exampleFix":"// before\nCharset cs = maybeNullCharset();\nnew MetricSearcher(baseDir, fileName, cs);\n\n// after\nnew MetricSearcher(baseDir, fileName); // default charset\n// or\nnew MetricSearcher(baseDir, fileName, StandardCharsets.UTF_8);","handlingStrategy":"validation","validationCode":"Charset charset = resolveCharset();\nif (charset == null) {\n    new MetricSearcher(baseDir, baseFileName);      // default charset\n} else {\n    new MetricSearcher(baseDir, baseFileName, charset);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Prefer the two-arg constructor unless you genuinely write metrics in a non-default charset.","Never let Charset.forName failures degrade to null — propagate or default explicitly."],"tags":["sentinel","metrics","charset","constructor-validation"],"backgroundTag":null,"analyzedSha":"a3f40ba8e900c8489bd520274739f17235a7721c","analyzedAt":"2026-08-14T11:10:30.678Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}