2018年8月31日
1、日志:
java.lang.NullPointerException
at com.xs.fun.base.proto.service.WorldChannelProtoBuffer$ProclamationInfoProto$Builder.setContent(WorldChannelProtoBuffer.java:2859)
at com.xs.fun.base.bo.proclamation.ProclamationInfo.copyTo( ProclamationInfo.java:44)
at com.xs.fun.base.bo.proclamation.ProclamationInfoList.copyTo ( ProclamationInfoList.java:30)
at com.xs.fun.base.dao.redis.ProclamationRepo.saveProclamationNotice( ProclamationRepo.java:20)
at com.xs.fun.hall.service.ProclamationService.saveProclamationNotice( ProclamationService.java:22)
at org.apache.jsp.admin.proclamationtManager.sendProclamation_jsp._jspService( sendProclamation_jsp.java:184)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:403)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at org.eclipse.jetty.server.Server.handle(Server.java:370)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
at java.lang.Thread.run(Thread.java:745)
2、解决方法
1)使用了Google的protobuffer;
2)定位是序列化的问题;
at com.xs.fun.base.proto.service.WorldChannelProtoBuffer$ProclamationInfoProto$Builder.setContent(WorldChannelProtoBuffer.java:2859)
at com.xs.fun.base.bo.proclamation.ProclamationInfo.copyTo( ProclamationInfo.java:44)
at com.xs.fun.base.bo.proclamation.ProclamationInfoList.copyTo ( ProclamationInfoList.java:30)
at com.xs.fun.base.dao.redis.ProclamationRepo.saveProclamationNotice( ProclamationRepo.java:20)
at com.xs.fun.hall.service.ProclamationService.saveProclamationNotice( ProclamationService.java:22)
at org.apache.jsp.admin.proclamationtManager.sendProclamation_jsp._jspService( sendProclamation_jsp.java:184)
3)经过测试,是content为null,
if(Split.equals("1")){
proclamationInfo_robotClient.setContent("{c=100,111,11}{"+title2+"}{/}"
+"{c=100,111,11}{"+content2+"}{/}"
+"{c=255,239,28}{"+startTime+"}{/}"
+"{c=255,239,28}{"+endTime+"}{/}");
proclamationInfo_robotClient.setPostTime(Long.parseLong(startTime));
proclamationInfo_robotClient.setType(3);
proclamationInfo_robotClient.setProclamationId(Integer.parseInt(id));
proclamationInfo_robotClient.setPackageInfo(Integer.parseInt(Split));
proclamationInfo_robotClient.setProclamationReadState(ProclamationState.NEW.getCode());
accountService.notifyLogonPlayerWorldChannelMsg(proclamationInfo_robotClient.getType()
,(long)proclamationInfo_robotClient.getPostTime()
,"NEW_PROCLAMATION"
,Integer.parseInt(Split));
System.out.println("1");
}
4)继续找,原因找到了;就是逻辑出错了,将保存的步骤放在了if里头,导致没有遍历别的,但是保存了,空数据结构就会发生报错。如下所示为错的;
wrong:
if(type.equals("new")){
String[] proclamationChannelSplit = packageId.split(",");
System.out.println("0.size:"+proclamationChannelSplit.length);
for(String Split : proclamationChannelSplit){
if(Split.equals("-1")){
//四个WorldChannelInfo组合为list表,存储到redis
proclamationInfoList.addProclamationInfo(proclamationInfo_unknowClient);
proclamationInfoList.addProclamationInfo(proclamationInfo_devClient);
proclamationInfoList.addProclamationInfo(proclamationInfo_robotClient);
proclamationInfoList.addProclamationInfo(proclamationInfo_hanyanClient);
proclamationService.saveProclamationInfoList(proclamationInfoList);
System.out.println("** ProclamationInfoList: "+proclamationService.getProclamationNotice());
}
if(Split.equals("2")){
}
if(Split.equals("1")){
}
if(Split.equals("19588")){
}
}
}else if(type.equals("old")){ //old,当前无需发送公告
accountService.notifyLogonPlayerWorldChannelMsg(3,0l,"NO_PROCLAMATION",-11);
System.out.println("** no procalmation");
}
correct:
if(type.equals("new")){
String[] proclamationChannelSplit = packageId.split(",");
System.out.println("0.size:"+proclamationChannelSplit.length);
for(String Split : proclamationChannelSplit){
if(Split.equals("-1")){
}
if(Split.equals("2")){
}
if(Split.equals("1")){
}
if(Split.equals("19588")){
}
}
}else if(type.equals("old")){ //old,当前无需发送公告
accountService.notifyLogonPlayerWorldChannelMsg(3,0l,"NO_PROCLAMATION",-11);
System.out.println("** no procalmation");
}
//四个WorldChannelInfo组合为list表,存储到redis
proclamationInfoList.addProclamationInfo(proclamationInfo_unknowClient);
proclamationInfoList.addProclamationInfo(proclamationInfo_devClient);
proclamationInfoList.addProclamationInfo(proclamationInfo_robotClient);
proclamationInfoList.addProclamationInfo(proclamationInfo_hanyanClient);
proclamationService.saveProclamationInfoList(proclamationInfoList);
System.out.println("** ProclamationInfoList: "+proclamationService.getProclamationNotice());