业务是这样,A.jsp 每10秒访问一次action的eachColieryInfoResults方法,
eachColieryInfoResults主要是用来接收socket发送的数据,然后按照协议解析当只有一个用户点击A.jsp的时候,程序不报错但是有个用户都点击A.jsp的时候,程序就报NullPointerException,这是怎么回事?
private Logger log = Logger.getLogger(this.getClass()); // 客户端: 发送表示请求接收数据 服务端:接收表示有客户端请求接收数据
private static final short DATA_RECEIVE = 15377; private static Socket socket=null;
/**
 * @param mapping
 * @param form
 * @param request
 * @param response
 * @return
 */
@SuppressWarnings("unchecked")
public ActionForward eachColieryInfoResults(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
EachColieryInfoBO bo = new EachColieryInfoBO();
StringBuffer sb = new StringBuffer();
Global bal = new Global();
int kuang = 0;  
int ke = 0;  
int dui = 0;  
int wa = 0; 
int an = 0; 
int other = 0; 
int downWellCount = 0; 
int upWellCount= 0; 
EachColieryWorkTypeVO ecwt = null;
String mineName = null;  
List socketMineNameList = new ArrayList();  
List eachColierySummaryList = new ArrayList();  
EachColieryBasicInfo colieryDetailed = null;  
List eachColieryBasicInfoList = new ArrayList(); 
DataInputStream in=null;

try {
byte[] keyWord = SocketFlushUtil.ShorttoByteArray(DATA_RECEIVE);
byte[] send = new byte[4];
send[0] = 0;
send[1] = 0;
send[2] = keyWord[0];
send[3] = keyWord[1];
            
socket = new Socket("10.30.128.26", 34567);
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
in = new DataInputStream(socket.getInputStream());
out.write(send); // 验证成功后才能收到数据
out.flush();
 
int c;
byte[] receive = new byte[65535];
while ((c = in.read(receive, 0, 65535)) >= 0) {
// 客户端数
byte[] clientByte = new byte[2];
clientByte[0] = receive[0];
clientByte[1] = receive[1];
short clientShort = SocketFlushUtil.ByteArraytoShort(clientByte); // 数据长度 
byte[] dataLengthByte = new byte[2];
dataLengthByte[0] = receive[2];
dataLengthByte[1] = receive[3];
short dataLengthShort = SocketFlushUtil.ByteArraytoShort(dataLengthByte);
int changeDateLegth=(int)(char)dataLengthShort;
   System.out.println("转换后的数据长度:"+changeDateLegth);
  
int sum = 4;
// 循环客户端数
for (int j = 0; j < clientShort; j++) {
// 分矿编号
byte[] mineidByte = new byte[2];
mineidByte[0] = receive[sum];
mineidByte[1] = receive[sum + 1];
System.out.println("data["+sum+"]"+mineidByte[0]);
System.out.println("data["+(sum+1)+"]"+mineidByte[1]);
short mineidShort = SocketFlushUtil.ByteArraytoShort(mineidByte);
socketMineNameList = bal.socketMineName(String.valueOf(mineidShort));
MineInfoVO mineInfoVO = (MineInfoVO) socketMineNameList.get(0);
// 分矿名称
mineName = mineInfoVO.getMinename();
System.out.println("分矿编号:" + mineidShort + "  分矿名称:"+ mineName); // 分站总数
int cardReaderCount = Integer.parseInt(String.valueOf(receive[sum + 6]));   sum = sum + 15;
 
for (int k = 0; k < cardReaderCount; k++) {
 
sum = sum + 6;
// 按照卡数循环
 

 
sum = sum + 1;
 
sum = sum + 6;
 
//实时显示各矿井下人员总数
EachColierySummary info = new EachColierySummary(mineName,
downWellCount, kuang, ke, dui, wa, an, other);
eachColierySummaryList.add(info); // 清空井下人员
downWellCount=0;
                    upWellCount=0;
kuang = 0;
ke = 0;
dui = 0;
wa = 0;
an = 0;
other = 0;
}// 客户端数
 
System.out.println("c:" + c + "---changeDateLegth:"+ changeDateLegth);
//socket一直保持连接,每5秒输出一次数据,所以不存在c == -1
if (c == changeDateLegth) {
break;
}
}// while
} catch (ConnectException ce) {
if (ce.getMessage().equals("Connection refused: connect")) {
log.error("==采集程序未开启==", ce);
} else {
ce.printStackTrace();
}
} catch (SocketTimeoutException ste) {
log.error("==socket连接超时==",ste);
} catch (Exception e) {
log.error("==解析协议错误==",e);
e.printStackTrace();
}finally{
 if(socket != null){
 try {
 System.out.println("close...");
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
 
 }
}
return null;
}错误日志如下:data[4]2
data[4]2
data[4]2
data[5]0
data[5]0
data[5]0
org.speedframework.exception.SpeedFrameworkException: java.lang.NullPointerException
at org.speedframework.db.executor.ExecutorImpl.select(ExecutorImpl.java:241)
at org.speedframework.action.AbstractSelectAction.doAction(AbstractSelectAction.java:35)
at org.speedframework.application.AbstractApplication.dealMessage(AbstractApplication.java:84)
at org.speedframework.engine.AbstractQuery.getResults(AbstractQuery.java:70)
at telezone.util.Global.socketMineName(Global.java:237)
at telezone.action.EachColieryAction.eachColieryInfoResults(EachColieryAction.java:125)其中EachColieryAction.java:125就是下面这行
socketMineNameList = bal.socketMineName(String.valueOf(mineidShort));
为什么会报空指针异常?

解决方案 »

  1.   

     private static Socket socket=null; 写到方法里面!set<>single--->your error
      

  2.   

    short mineidShort ;这个短整型,有没有超范围呢..
      

  3.   

    Action 是单实例的,你这样同时请求的话,socket 会被多个线程同时赋值和操作,天下将会大乱。
      

  4.   

    就是一个一个Action只有一个对象.多个请求都是同一个对象在服务,所以你可以把private static Socket socket=null;
    把这个定义在方法里边,不要定义成属性,这样不同的用户都会是新的Socket对象.
      

  5.   

    Socket socket=null;
    try {
    byte[] keyWord = SocketFlushUtil.ShorttoByteArray(DATA_RECEIVE);
    byte[] send = new byte[4];
    send[0] = 0;
    send[1] = 0;
    send[2] = keyWord[0];
    send[3] = keyWord[1];
                
    socket = new Socket("10.30.128.26", 34567);还是会报空指针异常啊
      

  6.   

    非常感谢AWUSOFT,当然也要谢谢回复的网友