Oracle10g 报错'java.lang.Exception: No such metric'的解决方法

本文介绍了解决Oracle EM控制台显示“java.lang.Exception:Nosuchmetric”的问题方法。通过重置监视用户dbsnmp的密码并成功测试后保存设置,可以有效解决该异常。

使用sys登录em控制台后,在页面上显示“java.lang.Exception: No such metric”,查阅了一些资料,终于解决

 

在首页下方有个链接,“监视配置”,在这里重设一下监视用户dbsnmp的密码,测试成功后保存,即可解决。

 

你遇到的新错误: ``` java.lang.UnsupportedOperationException: null at java.util.AbstractList.add(AbstractList.java:148) at java.util.AbstractList.add(AbstractList.java:108) at com.alibaba.excel.metadata.property.ExcelHeadProperty.initHeadRowNumber(ExcelHeadProperty.java:101) at com.alibaba.excel.metadata.property.ExcelHeadProperty.<init>(ExcelHeadProperty.java:81) ``` --- ## 🔍 错误原因分析 这个异常的根本原因是: > ❌ **你传入的 `head` 中包含了不可变列表(unmodifiable List),比如 `Arrays.asList(...)` 的返回值,而 EasyExcel 内部试图对这些列表进行 `add()` 操作,导致抛出 `UnsupportedOperationException`** ### 关键点: - `Arrays.asList("A", "B")` 返回的是 `java.util.Arrays$ArrayList` —— 它是固定大小的,**不支持增删元素** - 而 EasyExcel 在初始化表头时会调用类似 `list.add(null)` 来处理层级结构(例如填充缺失层级) - 当它尝试修改一个“不可变列表”时 → 抛出 `UnsupportedOperationException` --- ## ✅ 正确解决方案:使用可变的 `ArrayList` ### ❌ 错误写法(导致异常) ```java head.add(Arrays.asList("项目A", "分数")); // ❌ 不可变列表! ``` 虽然语法上没问题,但内部无法修改。 --- ### ✅ 正确写法:包装成 `new ArrayList<>(...)` ```java head.add(new ArrayList<>(Arrays.asList("项目A", "分数"))); // ✅ 可变 // 或者直接手动创建 List<String> row = new ArrayList<>(); row.add("项目A"); row.add("分数"); head.add(row); ``` --- ## ✅ 修复后的完整代码(避免 UnsupportedOperationException) ```java import com.alibaba.excel.EasyExcel; import java.util.*; public class SafeDynamicHeaderExport { public static class Metric { private String name; private Map<String, ProjectData> projectScores; private Map<String, Double> iosScores; public Metric(String name, Map<String, ProjectData> projectScores, Map<String, Double> iosScores) { this.name = name; this.projectScores = projectScores; this.iosScores = iosScores; } public String getName() { return name; } public Map<String, ProjectData> getProjectScores() { return projectScores; } public Map<String, Double> getIosScores() { return iosScores; } } public static class ProjectData { private Double score; private Double workload; public ProjectData(Double score, Double workload) { this.score = score; this.workload = workload; } public Double getScore() { return score; } public Double getWorkload() { return workload; } } public static void exportSafe(String filePath) { Set<String> projects = new LinkedHashSet<>(Arrays.asList("项目A", "项目B")); Set<String> iosItems = new LinkedHashSet<>(Arrays.asList("IOS-X", "IOS-Y")); List<Metric> metrics = createTestData(projects, iosItems); // ========== 构建 head:必须使用可变 List ========== List<List<String>> head = new ArrayList<>(); // 第1列:指标名称 head.add(new ArrayList<>(Arrays.asList("指标名称"))); // ✅ 可变副本 // 项目列 for (String project : projects) { head.add(new ArrayList<>(Arrays.asList(project, "分数"))); head.add(new ArrayList<>(Arrays.asList(project, "工作量"))); } // IOS 列 for (String ios : iosItems) { head.add(new ArrayList<>(Arrays.asList(ios, "分数1"))); } // ========== 构建数据 ========== List<List<Object>> data = new ArrayList<>(); for (Metric metric : metrics) { List<Object> row = new ArrayList<>(); row.add(metric.getName()); for (String project : projects) { ProjectData pd = metric.getProjectScores().get(project); row.add(pd != null ? pd.getScore() : null); row.add(pd != null ? pd.getWorkload() : null); } for (String ios : iosItems) { row.add(metric.getIosScores().getOrDefault(ios, null)); } data.add(row); } // ========== 导出 ========== String fileName = filePath + "safe_export_" + System.currentTimeMillis() + ".xlsx"; EasyExcel.write(fileName) .head(head) .sheet("安全导出") .doWrite(data); } private static List<Metric> createTestData(Set<String> projects, Set<String> iosItems) { List<Metric> list = new ArrayList<>(); Map<String, ProjectData> p1 = new LinkedHashMap<>(); p1.put("项目A", new ProjectData(90.0, 5.2)); p1.put("项目B", new ProjectData(85.0, 4.8)); Map<String, Double> i1 = new LinkedHashMap<>(); i1.put("IOS-X", 78.0); i1.put("IOS-Y", 83.0); list.add(new Metric("完成率", p1, i1)); Map<String, ProjectData> p2 = new LinkedHashMap<>(); p2.put("项目A", new ProjectData(95.0, 3.1)); p2.put("项目B", new ProjectData(88.0, 4.0)); Map<String, Double> i2 = new LinkedHashMap<>(); i2.put("IOS-X", 81.0); i2.put("IOS-Y", 90.0); list.add(new Metric("准确率", p2, i2)); return list; } public static void main(String[] args) { exportSafe("/tmp/"); System.out.println("✅ 安全导出成功!"); } } ``` --- ## ✅ 总结:如何避免 `UnsupportedOperationException` | 问题 | 原因 | 解决方案 | |------|------|-----------| | `UnsupportedOperationException` | 使用了 `Arrays.asList()` 返回的固定大小列表 | 包装成 `new ArrayList<>(...)` | | EasyExcel 修改表头结构 | 内部需要动态添加 `null` 占位符 | 必须传入支持 `add()` 的可变列表 | | 表头错乱或崩溃 | 多种不可变集合混用 | 统一使用 `new ArrayList<>()` | --- ## 📌 最佳实践建议 ```java // ✅ 推荐写法 1:包装 asList List<String> col = new ArrayList<>(Arrays.asList("一级", "二级")); // ✅ 推荐写法 2:手动 add List<String> col = new ArrayList<>(); col.add("一级"); col.add("二级"); // ❌ 禁止写法 List<String> col = Arrays.asList("一级", "二级"); // 不可变! head.add(col); // 会导致异常 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值