复制所有手机号码从文本文件java代码错误

时间:2016-02-08 10:38:08

标签: java

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 10
    at java.lang.String.charAt(Unknown Source)
    at pdfToExcel.FileRead.mobile_number(FileRead.java:15)
    at pdfToExcel.FileRead.remove_other(FileRead.java:45)
    at pdfToExcel.FileRead.main(FileRead.java:65)


import java.io.*;

public class FileRead {

  public static void mobile_number (String line){
    int len = line.length();
    try{
        for(int i=0;i<len;i++){
            String res = "88";
            if(line.charAt(i)=='0' && line.charAt(i+1)=='1'){
                if(line.charAt(i+2)>='5' && line.charAt(i+2)<='9' ){
                    if((line.charAt(i+10)>='0' && line.charAt(i+10)<='9')){
                        res+="01"+line.charAt(i+2)+"1";
                        res+= line.substring(i+3, i+10);
                    }else if((line.charAt(i+11)>='0' && line.charAt(i+11)<='9')){
                        res+= line.substring(i, i+11);
                    }

                 }else if(line.charAt(i+2)=='1' && line.charAt(i+3)=='9') {
                        if((line.charAt(i+10)>='0' && line.charAt(i+10)<='9')){
                            res+="01191";
                            res+= line.substring(i+4, i+10);
                        }else if((line.charAt(i+11)>='0' && line.charAt(i+11)<='9')){
                            res+= line.substring(i, i+11);
                        }
                 }
            }
            if(res.length()>9) System.out.println(res);
        }
    }finally{

    }
}


public static void remove_other(String l){
    String str="";
    for(int i=0;i<l.length();i++){
        if(l.charAt(i)>='0' && l.charAt(i)<='9'){
            str+=l.charAt(i);
        }
        if(str.length()>9) mobile_number(str);
    }
}



public static void main(String[] args) throws IOException {


    File f=new File("C:\\Users\\User\\Desktop\\abc.txt");

    BufferedReader br = new BufferedReader(new FileReader(f));
    try {
        StringBuilder sb = new StringBuilder();
        String line = br.readLine();
        while (line != null) {
            sb.append(line);
            sb.append(System.lineSeparator());
            line = br.readLine();
            if(line.length()>9){
                remove_other(line);
            }
            //System.out.println(line);
            //System.out.println(">>>>>>>>>>>>>>> " + line.length());

        }
        String everything = sb.toString();
    } finally {
        br.close();
    }

  }

}

2 个答案:

答案 0 :(得分:1)

你使用&#39; i&#39;作为一个迭代计数器,它长大到line.length:

int len = line.length();
for(int i=0;i<len;i++){...}

想象一下当&#39; i&#39;在某一时刻等于line.length -1,它遇到了

这样的指令
if(line.charAt(i+10) == '9') {...}

E.g。当line.length = 10时,你会尝试获得它的第19个字符。

答案 1 :(得分:0)

如果我正确读取您的代码和堆栈跟踪,我可以假设使用至少包含10个字符的字符串调用方法mobile_number。这一行是这样做的:

if(str.length()>9) mobile_number(str);

没有关于弦的最大长度的假设。您尝试访问字符串的单独字符,如

line.charAt(i+11)

但永远不要检查位置(即i+11)是否指向字符串中的字符。对于某些职位,这可能会有效,但对于其他职位,您将收到上述StringOutOfBoundsException