循环读取输入流的出现java.lang.NegativeArraySizeException怎么处理?

likeshare 2012-03-22 09:04:41
public class recv {
public static void main(String[] args) {
recv atestprocesse=new recv();
}
public recv() {
ServerSocket serversocket=null;
Socket so=null;
OutputStream output=null;
InputStream input=null;
SGIP_Command command=null;
try {
serversocket=new ServerSocket(8809);
System.out.println("等待接收");
so=serversocket.accept();
System.out.println("接收完毕");
System.out.println("New connection accepted "
+ so.getInetAddress() + ":" + so.getPort());
command=new SGIP_Command();

SGIP_Command tmpCMD=null;
Deliver deliver=null;
DeliverResp deliverresp = null;

Report report=null;
ReportResp reportresp=null;

Userrpt userrpt = null;
UserrptResp userrptresp = null;

Bind active=null;
Unbind term=null;
BindResp resp=null;
UnbindResp Unresp=null;
boolean loop=true;
while(loop)
{
input=new DataInputStream(so.getInputStream());
output=new DataOutputStream(so.getOutputStream());
tmpCMD=command.read(input);//接收sgip消息
System.out.println( tmpCMD.getTotalLength());
switch (command.getCommandID())
{
case SGIP_Command.ID_SGIP_BIND :
{
active=(Bind)tmpCMD;//强制转换
int result=active.readbody();//解包
System.out.println(tmpCMD.getTotalLength());
System.out.println(tmpCMD.getCommandID());
System.out.println(tmpCMD.getSeqno_1());
System.out.println(tmpCMD.getSeqno_2());
System.out.println(tmpCMD.getSeqno_3());
System.out.println(active.GetLoginType());
System.out.println(active.GetLoginName());
System.out.println(active.GetLoginPassword());
resp=new BindResp(352101,//node id 3+CP_id
0);//result
resp.SetResult(1);
resp.write(output);
System.out.println("resp完成");
break;
}


这是部分代码,测试的时候每次下发短息的回复报告都是出现
等待接收
接收完毕
New connection accepted /192.168.0.119:2973
61
61
1
3027352101
321161427
1
2
resp完成
java.lang.NegativeArraySizeException
应该是数据流到最后-1标志结尾,但是程序还是读取导致的,我处理了,还是不行,不知道怎么办?
...全文
2236 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
tfhui928 2013-02-07
  • 打赏
  • 举报
回复
您好!请问最后这问题是如何处理的?解决了吗?我现在碰到了与你一样的问题情况?希望能借鉴下处理方式,谢谢!
magong 2012-03-25
  • 打赏
  • 举报
回复
嗯。我12楼说的就是这个意思。
likeshare 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 likeshare 的回复:]

引用 10 楼 magong 的回复:

引用 6 楼 likeshare 的回复:

break跳出本次,回到while(loop)这继续读取,问题出在这,出错是在这个位置,因为输入流没有数据了,在读取时候是-1,自然出现这个问题,-1标志一段输入流的结束。在这地方我不知道怎么处理为好

在语句
System.out.println("resp完成");
后加入一句:
loo……
[/Quote]


我的代码这个样子现在,您看看,有问题吗?

while (loop) {

try{
so = serversocket.accept();
input = new DataInputStream(so.getInputStream());
output = new DataOutputStream(so.getOutputStream());
System.out.println("----接收完毕----");
if((input.read())!=-1){
tmpCMD = command.read(input);// 接收sgip消息
System.out.println(tmpCMD.toString());


switch (command.getCommandID()) {
case SGIP_Command.ID_SGIP_BIND: {
active = (Bind) tmpCMD;// 强制转换
int result = active.readbody();// 解包
System.out.println(tmpCMD.getTotalLength());
System.out.println(tmpCMD.getCommandID());
System.out.println(tmpCMD.getSeqno_1());
System.out.println(tmpCMD.getSeqno_2());
System.out.println(tmpCMD.getSeqno_3());
System.out.println(active.GetLoginType());
System.out.println(active.GetLoginName());
System.out.println(active.GetLoginPassword());
resp = new BindResp(352101,// node id 3+CP_id
0);// result
resp.SetResult(1);
resp.write(output);
System.out.println("resp完成");

break;
}
magong 2012-03-23
  • 打赏
  • 举报
回复
你如果read()读字节读到-1了,说明流已经结束了,再读无益。
这时如果不想退出循环,
应该关以前的流,
然后重新accept(),
也就是说,accept()要放到循环中去做。
likeshare 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 magong 的回复:]

引用 6 楼 likeshare 的回复:

break跳出本次,回到while(loop)这继续读取,问题出在这,出错是在这个位置,因为输入流没有数据了,在读取时候是-1,自然出现这个问题,-1标志一段输入流的结束。在这地方我不知道怎么处理为好

在语句
System.out.println("resp完成");
后加入一句:
loop = false;
[/Quote]

如果loop = false;设置那么会跳出while循环。但是要求是在8809端口持续坚听,一旦有数据过来,按流程处理
我按您说的debug,看到问题是出在:
while (loop) {

input = new DataInputStream(so.getInputStream());
output = new DataOutputStream(so.getOutputStream());
try{
这个地方,无限循环出现 tmpCMD = command.read(input);// 接收sgip消息
System.out.println(tmpCMD.toString());
}catch (Exception e) {
log.debug("command.read_error:"+e);
}
// System.out.println("length:"+tmpCMD.getTotalLength());
switch (command.getCommandID()) {
case SGIP_Command.ID_SGIP_BIND: {
active = (Bind) tmpCMD;// 强制转换
int result = active.readbody();// 解包



这个地方,无限循环出现 tmpCMD = command.read(input);// 接收sgip消息
我应该在这个地方处理下,我试试看
dryZeng 2012-03-22
  • 打赏
  • 举报
回复
tmpCMD=command.read(input)
if(tmpCMD==-1) break;
likeshare 2012-03-22
  • 打赏
  • 举报
回复
流程是这样子的。网关上行一个我下发的一条短信的状态报告。发送到我的8809端口, 在while(loop)这个循环读取,然后经过tmpCMD=command.read(input)处理会得到相应的参数,之后
System.out.println("resp完成");
break;
break跳出本次,回到while(loop)这继续读取,问题出在这,出错是在这个位置,因为输入流没有数据了,在读取时候是-1,自然出现这个问题,-1标志一段输入流的结束。在这地方我不知道怎么处理为好,-1是流的结束也是查资料这样说的。



resp完成
java.lang.NegativeArraySizeException
dryZeng 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 likeshare 的回复:]

serversocket=new ServerSocket(8809);
so=serversocket.accept();

input=new DataInputStream(so.getInputStream());
output=new DataOutputStream(so.getOutputStream())

input是读取的客户端的数据流,


tmpCMD=……
[/Quote]

while((input.red())!=-1)这一段在哪呢?

也就是说你判断-1结束的那段。
magong 2012-03-22
  • 打赏
  • 举报
回复
try块后面的代码没有贴出来。

其实这种问题无需问的,你找到报异常的行,Debug一下就行了。
菖蒲老先生 2012-03-22
  • 打赏
  • 举报
回复
在哪一行报错的啊,就是集合size为负数的异常,
定位到出错的地方应该好解决的。
likeshare 2012-03-22
  • 打赏
  • 举报
回复
serversocket=new ServerSocket(8809);
so=serversocket.accept();

input=new DataInputStream(so.getInputStream());
output=new DataOutputStream(so.getOutputStream())

input是读取的客户端的数据流,


tmpCMD=command.read(input);
command是类实例,导入的jar包
dryZeng 2012-03-22
  • 打赏
  • 举报
回复
so在哪个位置读的?没看到呢。
magong 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 likeshare 的回复:]

break跳出本次,回到while(loop)这继续读取,问题出在这,出错是在这个位置,因为输入流没有数据了,在读取时候是-1,自然出现这个问题,-1标志一段输入流的结束。在这地方我不知道怎么处理为好
[/Quote]
在语句
System.out.println("resp完成");
后加入一句:
loop = false;
五哥 2012-03-22
  • 打赏
  • 举报
回复
下标为 负数啦
likeshare 2012-03-22
  • 打赏
  • 举报
回复
这是try的后面的代码。还是没有搞定,我再仔细的调试调试
} catch (Exception e) {
System.out.println(e.toString());

} finally {
// while((input.red())!=-1)



}

50,526

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧