attributenotfoundexception是受检异常,继承自exception而非runtimeexception,编译器强制要求捕获或声明;常因ide屏蔽错误或反射绕过检查而被误认为非受检。

AttributeNotFoundException 是受检异常(checked exception),不是非受检异常(unchecked exception)。它继承自 Exception,而非 RuntimeException,所以编译器强制你处理它——要么捕获,要么声明抛出。
为什么常误以为它是“非受检”?
实际中很多人在 JMX 相关代码里遇到它却没写 try-catch,结果编译不通过,就误以为“没报错”,其实是 IDE 或构建工具屏蔽了编译错误提示;或者用了反射调用、动态代理等间接方式绕过了编译检查,导致运行时才暴露。
正确捕获 AttributeNotFoundException 的写法
在操作 MBeanServer、ObjectName 或调用 getAttribute() 时,必须显式处理:
- 用 try-catch 包裹可能抛出该异常的调用,比如
mbs.getAttribute(objName, "SomeAttr") - 捕获后可记录日志、返回默认值、或封装成业务异常向上抛出
- 不要只 catch Exception 或 Throwable,应优先单独捕获
AttributeNotFoundException,再考虑更宽泛的异常类型
常见触发场景和应对建议
该异常通常表示:MBean 中不存在指定名称的属性(getter 方法缺失、拼写错误、属性未暴露、或 MBean 实现类未按 JMX 规范命名)。
- 检查目标 MBean 的接口是否定义了
getXXX()方法,且符合 JMX 属性命名规范(如属性名Timeout对应方法getTimeout()) - 确认 MBean 注册时使用的 ObjectName 与实际注册的实例一致
- 调试时可用
mbs.getMBeanInfo(objName)获取属性列表,验证目标属性是否存在
不想写 try-catch?可以声明 throws
若当前方法逻辑上不适合处理该异常,可在方法签名中声明抛出:
public String readConfigValue(ObjectName objName) throws AttributeNotFoundException, MBeanException, ReflectionException {
return (String) mbs.getAttribute(objName, "ConfigValue");
}
但调用方仍需处理——JMX 的这组异常(AttributeNotFoundException、MBeanException、ReflectionException)通常需成组声明或捕获。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











