`

java map循环

    博客分类:
  • j2ee
map 
阅读更多

异常一:

之前遇到一个问题。在用httpclient爬取网页上的代码的时候,出现了内存溢出的异常(Exception in thread "main" java.lang.StackOverflowError)

后来听到群里面大神(也就是我师父的)讲解,知道递归调用方法比较消耗栈内存,改成循环调用方法就好了。

结果可想而知,正确。例如,

public static void cawler(.....){
    .........
     
     cawler(.....);
}
这样递归执行会消耗太多的栈内存,栈在程序执行的时候是不会释放的,需要等到程序执行完毕才会释放。

后台把这个修改成这样。

public static void cawler(.....){
    .........
     
     cawlerling(.....);
}
public static void cawlerling(.....){

}
这样就解决的栈内存溢出的异常了。

 异常二:

 

    还遇到了这样的异常。Exception in thread "main" java.lang.IllegalArgumentException: Illegal character in query at index 54: http://video.baidu.com/v?ct=301989888&word=numb+linkin park

这个异常表示访问的这个url有问题。

用httpclent访问的时候不知道大家有没有注意到这里有一个空格?

这是关键,把这个url直接输入到浏览器可以打开,浏览器默认会补充一个%20,也就是把url编译成unicode(统一编码)。这样问题就差不多解决了。或者编译成unicode,一般的会把//也编译的。我觉得还是直接找空格补充%20就好了。

异常三:

       java.util.ConcurrentModificationException(map的操作异常),在集合和数组执行的时候是不允许直接操作的对集合进行修改的。原因是出在iterator上,后台找到解决办法,循环map的时候跳过iterator。

方法一:
原本的iterator循环,改成 while(!map.isEmpty()){//手写的,不知道单词对不对
      for(String s:map.keySet()){//这个循环只是为了让你得到key和value值的
         .................
        map.remove(s);//删除map中指定的值
        break;
     }
}

方法二:
while(!map.isEmpty){
    List<String> lsit=new ArrayList<String>():
    list.addAll(map.keySet());
     String key=list.get(0);
    String value=map.get(key);
    map.remove(key);
}

 异常四:

            当网络打不开一个url的时候,一般就是直接中断程序,现在我不像中断程序,想继续运行下去。应该把运行的模块包含在try catch(){}里面。然后在catch里面加上 continue;  不过这的在循环里面哦。如果只是执行一段循序程序,哪么直接用finally运行想继续运行的。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics