解决方案 »

  1.   

    检查下 
    String[] data = line.split("\t");
    System.out.println(data.length);
    Double score = Double.parseDouble(data[2])-Double.parseDouble(data[3]);
      

  2.   


    我调试了, 这个结果是1 应该没有越界啊?
    长度是1 ,确要取 data[2] 就越界了啊
      

  3.   


    我调试了, 这个结果是1 应该没有越界啊?
    长度是1 ,确要取 data[2] 就越界了啊那是什么情况? 我总不能不取吧? 你熟悉这个么? 是进行语义分析方面的
      

  4.   

    不熟悉你的业务,语义场景
    但是 从技术的角度来讲,代码在这里是过不去的
    可以添加一个数组长度的判断,如果长度大于等于4 的时候,可以执行
    Double score = Double.parseDouble(data[2])-Double.parseDouble(data[3]);
      

  5.   

    不熟悉你的业务,语义场景
    但是 从技术的角度来讲,代码在这里是过不去的
    可以添加一个数组长度的判断,如果长度大于等于4 的时候,可以执行
    Double score = Double.parseDouble(data[2])-Double.parseDouble(data[3]);
    谢啦啊 不过这样我感觉就失去意义了
    我再想想其他办法
      

  6.   

    当读到第31行时就不想再读下去了,data[4],w_n[1],这些写法是一定要保护的。
    首先你认为你的数据被split开之后,一定是有多少项或者至少有多少项,要加一个判断的:
    if (data == null || data.length < 5) {
        //或者返回,或者抛出一个有意义的异常
        throw new IllegalStateException("too short data length " + data == null ? "<null>" : "" + data.length);
    }
    if (w_n == null || w_n.length < 2) {
        throw new IllegalStateException("too short w_n length " + w_n == null ? "<null>" : "" + w_n.length);
    }
    如果有必须的话,在抛出的异常信息里把当前行是第几行,当前行的内容是什么都包括进去,这样在debug时一下子知道是因为读到了文件里的哪一行出的问题,然后那一行的内容也在,可以对这一行单独分析为什么出问题,比如你按\t去split的,也许那一条的某一个分隔就不是\t,而是空格之类的,或者那行的数据里就是包括了一个\t,打乱了你对数据位置的假设,你肉眼看不出来,但程序就是出错了。另外,不管你是不是对你的输入数据有信心,程序上对null和arr.length的保护总是有必要的,起码会在出问题时提供debug所需的第一手信息。