{"record":{"id":"77d073ada6fa2a89","repo":"alibaba/spring-ai-alibaba","slug":"error-77d073","errorCode":null,"errorMessage":"实验不存在: {}","messagePattern":"实验不存在: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/service/impl/ExperimentServiceImpl.java","lineNumber":172,"sourceCode":"                        EvaluatorDO evaluatorDO = evaluatorMapper.selectById(evaluatorConfig.getEvaluatorId());\n                        evaluatorConfig.setEvaluatorName(evaluatorDO != null ? evaluatorDO.getName() : \"Unknown Evaluator\");\n                    } catch (Exception e) {\n                        log.warn(\"Failed to fetch evaluator name for id: {}\", evaluatorConfig.getEvaluatorId(), e);\n                        evaluatorConfig.setEvaluatorName(\"Error Fetching Name\");\n                    }\n                });\n        experiment.setEvaluatorConfig(JSON.toJSONString(evaluatorConfigList));\n        return experiment;\n    }\n\n    @Override\n    public List<ExperimentEvaluatorResult> getResults(Long experimentId) {\n        log.info(\"查询实验结果: {}\", experimentId);\n        \n        // 先检查实验是否存在\n        ExperimentDO experiment = experimentMapper.selectById(experimentId);\n        if (experiment == null) {\n            log.warn(\"实验不存在: {}\", experimentId);\n            return null;\n        }\n\n        Integer dataCount = datasetVersionMapper.selectById(experiment.getDatasetVersionId()).getDataCount();\n        // 检查dataCount是否为null或0，避免除零异常\n        if (dataCount == null || dataCount == 0) {\n            log.warn(\"数据集版本数据量为0或不存在: {}\", experiment.getDatasetVersionId());\n            dataCount = 1; // 避免除零异常，设置默认值\n        }\n\n\n        // 正确解析 evaluatorConfig JSON 数组字符串为 List<EvaluatorConfig>\n        List<EvaluatorConfig> evaluatorConfigList = JSON.parseArray(experiment.getEvaluatorConfig(), EvaluatorConfig.class);\n\n        // 提取 evaluatorVersionId 列表\n        List<Long> evaluatorList = evaluatorConfigList.stream()\n                .map(e -> Long.valueOf(e.getEvaluatorVersionId()))\n                .toList();","sourceCodeStart":154,"sourceCodeEnd":190,"githubUrl":"https://github.com/alibaba/spring-ai-alibaba/blob/f82da0b50f35744c13968191be2b1cd2452ef550/spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/service/impl/ExperimentServiceImpl.java#L154-L190","documentation":"ExperimentServiceImpl.getResults first verifies the experiment exists. When experimentMapper.selectById(experimentId) returns null, it logs this warning and returns null. This is a guard against querying results for a nonexistent experiment; the null return means 'no such experiment' and must be handled by the caller.","triggerScenarios":"Calling experimentService.getResults(experimentId) with an experimentId that does not exist in the experiment table, or that was deleted before the call.","commonSituations":"Client retries with an old ID after experiment deletion; results page refreshed after cleanup; ID copy-paste from another environment; race between list and results fetch.","solutions":["Verify the experimentId via list() or a direct selectById before requesting results.","Null-check getResults' return and respond with 404 rather than assuming empty results.","Re-run or re-create the experiment if it was deleted.","Check that the service connects to the expected database."],"exampleFix":"// before\nList<ExperimentEvaluatorResult> results = experimentService.getResults(id);\nresults.size(); // NPE when experiment missing\n\n// after\nList<ExperimentEvaluatorResult> results = experimentService.getResults(id);\nif (results == null) {\n    throw new ResponseStatusException(HttpStatus.NOT_FOUND, \"Experiment not found: \" + id);\n}","handlingStrategy":"type-guard","validationCode":"public static boolean experimentExists(Long id) {\n    return id != null && experimentMapper.selectById(id) != null;\n}","typeGuard":"List<ExperimentEvaluatorResult> results = experimentService.getResults(experimentId);\nif (results == null) {\n    throw new ResponseStatusException(HttpStatus.NOT_FOUND, \"Experiment not found: \" + experimentId);\n}","tryCatchPattern":null,"preventionTips":["Never assume getResults returns a list — null means the experiment is missing.","Validate experimentId existence before requesting results.","Avoid holding experiment IDs past their deletion (soft-delete or cascade results).","Add integration tests covering lookup of deleted experiments."],"tags":["java","spring","experiment","null-return","mybatis"],"backgroundTag":"record-not-found","analyzedSha":"f82da0b50f35744c13968191be2b1cd2452ef550","analyzedAt":"2026-09-09T15:32:42.421Z","contentChangedAt":"2026-09-09T15:32:42.421Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}