业务是这样,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));
为什么会报空指针异常?
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));
为什么会报空指针异常?
解决方案 »
- 求java计算器小数点怎样实现,我只实现了整数运算,我带吗在下
- jdk6新增了些什麼功能
- 哪位兄弟給我份bruceeckel裡面用到的包啊謝謝啦
- 请教一个问题?
- 如何将Tree中的叶节点和DesktopPane中的各个InternalFrame联系起来
- 如何得到一个bmp的BufferedImage?
- java.util.MissingResourceException: Can't find bundle for base name operation, locale zh_CN?
- 在jdbtable中如何加入combox组件(不好意思没分了救命啊)
- 16进制值为0D的字符在java里怎么写?
- 关于java文本框的几个问题
- 关于JAVA中判断特定位置后面的字符串的问题
- 强制类型转换异常。自动封装出现问题?
把这个定义在方法里边,不要定义成属性,这样不同的用户都会是新的Socket对象.
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);还是会报空指针异常啊