java 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就好了。
异常三:
?????? j方法一:原本的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运行想继续运行的。
?