一个关于数组越界的问题

前辈们,我碰到一个数组越界的问题,也定位到哪一句了,可是各种改都不对。请前辈们指点一下,大家遇到数组越界问题时都是如何解决的呢?我的APP安装在小米PAD3上,第一次打开时是崩溃的,一闪而退,然后出现这个错误。第二次打开就没有问题了,求解。另外,我用魅族手机就没事,一次就能打开,也不报错,请前辈指点。
logcat如下:
07-23 09:05:05.936: E/AndroidRuntime(14208): FATAL EXCEPTION: Thread-7
07-23 09:05:05.936: E/AndroidRuntime(14208): Process: com.Frank.wifirobot, PID: 14208
07-23 09:05:05.936: E/AndroidRuntime(14208): java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
07-23 09:05:05.936: E/AndroidRuntime(14208): at com.Frank.wifirobot.WifiRobot_right$7.run(WifiRobot_right.java:593)
07-23 09:05:05.936: E/AndroidRuntime(14208): at java.lang.Thread.run(Thread.java:761)
部分代码如下:
我贴一些代码出来,其中错误定位在if (msg2ch[0] == ':') 上。

 while(true){

                    //char msg2ch[]=new char[100];
                    char msg2ch[];
                    try {
                        PubUtil.msg2 = PubUtil.br.readLine();
                        if ( ( PubUtil.msg2  ) != null ) {

                            msg2ch = PubUtil.msg2.toCharArray();//将字符串对象中的字符转换为一个字符数组
                        //if (msg2ch.length!=0) {
                                if (msg2ch[0] == ':') {

                                    switch (msg2ch[1]) {
                                        case 'Z': {
                                            PubUtil.dis[0] = msg2ch[2];  //距离百位
                                            Log.e("dis[0]:", "" + msg2ch[2]);
                                            PubUtil.dis[1] = msg2ch[3];  //距离十位
                                            Log.e("dis[1]:", "" + msg2ch[3]);
                                            PubUtil.dis[2] = msg2ch[4];  //距离个位
                                            Log.e("dis[2]:", "" + msg2ch[4]);
                                            break;
                                        }

                                        case 'X': {
                                            PubUtil.temp[0] = msg2ch[2];   //水温百位
                                            Log.e("temp[0]:", "" + msg2ch[2]);
                                            PubUtil.temp[1] = msg2ch[3];  //水温十位
                                            Log.e("temp[1]:", "" + msg2ch[3]);
                                            PubUtil.temp[2] = msg2ch[4];  //水温个位
                                            Log.e("temp[2]:", "" + msg2ch[4]);
                                            break;
                                        }

                                        case 'Y': {
                                            PubUtil.power[0] = msg2ch[2];   //功率百位
                                            Log.e("power[0]:", "" + msg2ch[2]);
                                            PubUtil.power[1] = msg2ch[3];  //功率十位
                                            Log.e("power[1]:", "" + msg2ch[3]);
                                            PubUtil.power[2] = msg2ch[4];  //功率个位
                                            Log.e("power[2]:", "" + msg2ch[4]);
                                            break;



5个回答

会不会是PubUtil.br.readLine(),读取太耗时间了,使得msg2ch为null或者msg2ch.length==0

sinat_35241575
sinat_35241575 嗯嗯,后来我也是这么考虑的。
2 年多之前 回复

就在这一行 if (msg2ch[0] == ':') {
你在上一行加日志 读取msg2ch.length 看看是不是0

zml_moxueli
呓语的风 回复sinat_35241575: 回复sinat_35241575: 那就循环到PubUtil.msg2不为null也不为空,不就行了
2 年多之前 回复
sinat_35241575
sinat_35241575 回复呓语的风: 嗯嗯,对对,这法子我试了,确实能够一次打开,可是悲催的是运行后我就没法 收发数据了,关闭再打开APP就又行了。也属于第二次打开才能正常运行,也是醉了
2 年多之前 回复
zml_moxueli
呓语的风 回复sinat_35241575: 如果业务中 PubUtil.msg2可以为空,只需要判断 msg2ch.length>0 执行以下代码
2 年多之前 回复
zml_moxueli
呓语的风 回复sinat_35241575: PubUtil.msg2 = PubUtil.br.readLine();为什么会是空呢
2 年多之前 回复
sinat_35241575
sinat_35241575 你判断的对,发帖子之前我就锁定了错误是什么在什么位置,报的那个错就是说msg2ch.length 为0,测试也是这样,纠结的是该如何修改呢?求指点
2 年多之前 回复
zml_moxueli
呓语的风 java.lang.ArrayIndexOutOfBoundsException: length=0; index=0 这句就很明显
2 年多之前 回复

1、先定义数组,再使用。可能你这数组都没定义就用就报越界了呗。2、PubUtil.br.readLine();读取的这个字符null。最好debug跟踪看下最明显。

肯定是PubUtil.br.readLine();这个方法返回的数据长度为0了,可能是机型不同导致你,你着重看先pubutil.br.reandine里面实现了什么,为什么第一次打开返回的长度为0。如果实在没办法,可以用调acitivty的finsh之后再start一次应该就可以了

加个非空判断且长度大于0

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问