Java 调用属性的getter方法时发生NullPointerException
我试图获取由JavaEE服务器管理的数据源和连接对象的属性(在本例中,我将WebSphereApplicationServer和Db2作为RDBMS运行) 我编写了以下代码Java 调用属性的getter方法时发生NullPointerException,java,reflection,nullpointerexception,datasource,invoke,Java,Reflection,Nullpointerexception,Datasource,Invoke,我试图获取由JavaEE服务器管理的数据源和连接对象的属性(在本例中,我将WebSphereApplicationServer和Db2作为RDBMS运行) 我编写了以下代码 public class ClassInfo { protected static final String NOT_APPLICABLE = "N/A"; protected static final String UNKNOWN = "unkown"; public static LinkedH
public class ClassInfo {
protected static final String NOT_APPLICABLE = "N/A";
protected static final String UNKNOWN = "unkown";
public static LinkedHashMap<String, String[]> getLinkedHashMap(Object obj) {
LinkedHashMap<String, String[]> map = new LinkedHashMap<String, String[]>();
BeanInfo bi = null;
PropertyDescriptor[] pd = null;
String name, type, value, getter, setter;
Method m;
try {
bi = Introspector.getBeanInfo(obj.getClass());
} catch (IntrospectionException e) {
e.printStackTrace();
}
pd = bi.getPropertyDescriptors();
for (int i = 0; i < pd.length; i++) {
name = pd[i].getName();
type = pd[i].getPropertyType().getName();
m = pd[i].getReadMethod();
if (m != null) {
getter = m.getName();
try {
value= m.invoke(obj).toString();
} catch (Exception e) {
System.err.println("Exception occured while procession " + m.getName() + " --- " + e.getMessage());
e.printStackTrace();
value = UNKNOWN + " (getter is " + e.getMessage() + " )";
}
} else {
getter = NOT_APPLICABLE;
value = UNKNOWN + " (getter method is not available)";
}
m = pd[i].getWriteMethod();
if (m != null) {
setter = m.getName();
} else {
setter = NOT_APPLICABLE;
}
map.put(name, new String[] { type, getter, setter, value });
}
return map;
}
这是堆栈跟踪日志
[2/4/18 8:33:59:281 JST] 000000aa SystemErr R Exception occured while procession isActive --- null
[2/4/18 8:33:59:282 JST] 000000aa SystemErr R java.lang.reflect.InvocationTargetException
[2/4/18 8:33:59:283 JST] 000000aa SystemErr R at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[2/4/18 8:33:59:283 JST] 000000aa SystemErr R at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:90)
[2/4/18 8:33:59:284 JST] 000000aa SystemErr R at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
[2/4/18 8:33:59:284 JST] 000000aa SystemErr R at java.lang.reflect.Method.invoke(Method.java:508)
[2/4/18 8:33:59:284 JST] 000000aa SystemErr R at net.mognet.servlet.ClassInfo.getLinkedHashMap(ClassInfo.java:35)
[2/4/18 8:33:59:285 JST] 000000aa SystemErr R at net.mognet.servlet.ClassInfo.exposeAsMarkdown(ClassInfo.java:61)
[2/4/18 8:33:59:286 JST] 000000aa SystemErr R at net.mognet.servlet.JDBCProperty.doGet(JDBCProperty.java:58)
[2/4/18 8:33:59:286 JST] 000000aa SystemErr R at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
[2/4/18 8:33:59:287 JST] 000000aa SystemErr R at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
[2/4/18 8:33:59:287 JST] 000000aa SystemErr R at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1235)
[2/4/18 8:33:59:288 JST] 000000aa SystemErr R at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:779)
[2/4/18 8:33:59:288 JST] 000000aa SystemErr R at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:478)
[2/4/18 8:33:59:288 JST] 000000aa SystemErr R at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
[2/4/18 8:33:59:289 JST] 000000aa SystemErr R at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1124)
[2/4/18 8:33:59:289 JST] 000000aa SystemErr R at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:82)
[2/4/18 8:33:59:289 JST] 000000aa SystemErr R at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:963)
[2/4/18 8:33:59:290 JST] 000000aa SystemErr R at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1817)
[2/4/18 8:33:59:290 JST] 000000aa SystemErr R at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:382)
[2/4/18 8:33:59:291 JST] 000000aa SystemErr R at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:465)
[2/4/18 8:33:59:291 JST] 000000aa SystemErr R at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:532)
[2/4/18 8:33:59:291 JST] 000000aa SystemErr R at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:318)
[2/4/18 8:33:59:292 JST] 000000aa SystemErr R at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:289)
[2/4/18 8:33:59:292 JST] 000000aa SystemErr R at com.ibm.ws.ssl.channel.impl.SSLConnectionLink.determineNextChannel(SSLConnectionLink.java:1187)
[2/4/18 8:33:59:292 JST] 000000aa SystemErr R at com.ibm.ws.ssl.channel.impl.SSLConnectionLink$MyReadCompletedCallback.complete(SSLConnectionLink.java:694)
[2/4/18 8:33:59:293 JST] 000000aa SystemErr R at com.ibm.ws.ssl.channel.impl.SSLReadServiceContext$SSLReadCompletedCallback.complete(SSLReadServiceContext.java:1833)
[2/4/18 8:33:59:293 JST] 000000aa SystemErr R at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175)
[2/4/18 8:33:59:294 JST] 000000aa SystemErr R at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
[2/4/18 8:33:59:294 JST] 000000aa SystemErr R at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
[2/4/18 8:33:59:294 JST] 000000aa SystemErr R at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
[2/4/18 8:33:59:295 JST] 000000aa SystemErr R at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
[2/4/18 8:33:59:295 JST] 000000aa SystemErr R at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
[2/4/18 8:33:59:296 JST] 000000aa SystemErr R at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
[2/4/18 8:33:59:296 JST] 000000aa SystemErr R at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1909)
[2/4/18 8:33:59:296 JST] 000000aa SystemErr R Caused by: java.lang.NullPointerException
[2/4/18 8:33:59:297 JST] 000000aa SystemErr R at com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.isActive(WSJdbcDataSource.java:1203)
[2/4/18 8:33:59:298 JST] 000000aa SystemErr R ... 33 more
我确信“getReadMethod()”返回的方法对象(m)不是null,但“m.invoke(obj)”返回的对象是null。
我假设名为“active”的属性不是由JavaEE容器初始化的(具有空值),这导致了这种情况的发生。我的假设正确吗?如果没有,请告诉我为什么会发生这种情况以及如何解决
我是Java新手,如有任何建议或建议,将不胜感激。
关于,让我们取消点击:
首先,我假设此代码在您的isActive
方法中
m = pd[i].getReadMethod();
if(m != null) {
getter = m.getName(); //not null
value = m.invoke(obj).toString(); //throws NullPointerException
}
(如果不是,那么您向我们显示了错误的代码…,因为stacktrace清楚地表明,isActive
抛出了NPE。)
所以假设上面的评论是正确的
m
在语句//not null
中不是null
,我将在下一个语句中假设它仍然不是null
m.invoke(obj)
不是NPE的原因:
- 因为
不是m
,并且null
- 因为如果NPE由于任何原因发生在
内部,stacktrace将不同invoke
toString()
方法中,因为stacktrace会不同invoke
返回null
。。。而NPE是由于null.toString()
引起的
因此,现在您需要弄清楚如何/为什么invoke
返回null
,或者修复原因,或者更改代码以应对这种情况
(证据没有指向getReadMethod
的问题。它指向您“获得”的方法和/或方法调用的目标对象的问题。)
1-如果
m
是一个字段而不是一个局部变量,并且它对其他线程可见,并且其中一个线程恰好在适当的时间将null
分配给它,则这可能是不正确的。感谢您的所有建议。现在我确定“invoke(m(obj)).toString()”(等于“isValid().toString()”)的原因导致了NPE,因为很简单,字段成员就是null
public class IntroSpectionTest {
private String a;
private String b;
public IntroSpectionTest(String a, String b) {
this.a = a;
this.b = b;
}
public String getA() { return a; }
public String getB() { return b; }
public static void main(String[] args) {
System.out.println(ClassInfo.getLinkedHashMap(new IntroSpectionTest(null, "String b").toString()));
}
}
此代码导致完全相同的情况
我只是想看看WebSphere生成的对象内部,而不是代码本身。很抱歉,如果有什么误导您的地方。您正在对内部WebSphere类调用方法,并询问它为什么返回错误?既然您不知道这些方法应该返回什么,那么不调用内部方法或者为异常编写防御代码怎么样?谢谢您的评论。我想看看WebSphere生成的对象内部。它的类是com.ibm thing。所以我想我必须通过类的方法来访问它的值。我知道“isValid()”返回布尔值,因为可以通过调用“getPropertyType().getName();”来检索该类型。谢谢您的回答。现在我很确定我的假设是正确的。我将添加另一个答案来说明值为null的字段对象导致这种情况。
m = pd[i].getReadMethod();
if(m != null) {
getter = m.getName(); //not null
value = m.invoke(obj).toString(); //throws NullPointerException
}
public class IntroSpectionTest {
private String a;
private String b;
public IntroSpectionTest(String a, String b) {
this.a = a;
this.b = b;
}
public String getA() { return a; }
public String getB() { return b; }
public static void main(String[] args) {
System.out.println(ClassInfo.getLinkedHashMap(new IntroSpectionTest(null, "String b").toString()));
}
}