小站重新装修,欢迎到访。

记一个Iterator的异常

今天在一个熟悉的场景首次遇到了异常,在使用ArrayList的Iterator时,抛出了java.lang.IllegalStateException。仔细分析后,发现是一个不合适的循环嵌套,导致了it.remove()连续调用了两次。结合源码看了下,AbstractList$Itr类使用了一个int lastRet变量标记最近一次next()所指向的元素,而在调用it.remove()时,先检查lastRet的值,如果为-1,则抛出IllegalStateException,否则将lastRet置为-1。用以保证一个元素只被remove一次。在Itr类的子类ListIterator里,previous()也是同样原理。

古人云:

吃一堑长一智

又云:

学如逆水行舟,不进则退

重点在吃和行两个字,讲究行动,一定要在实践中遇到困难,并解决,方能长一智,方能前进。对于码农,则一定是要多动手,多碰钉子,多独立解决问题,如是自勉。

对user.dir的误解

今天调试程序的时候,发现我之前hard code的一段路径修改成了System.getProperty("user.dir")之后,依然可以正常运行。我一直以来都以为user.dir就是当前用户的home dir,似乎这个印象应该自大学时代就已经有了,所以我有些先入为主地认为是环境有问题。

我的程序是最终由一个py脚本调用jar包来执行,为了搞明白这个困惑的问题,我在java代码里插入了多处out.println(System.getProperty("user.dir")),然后执行py,结果输出并非home dir。于是凭直觉将问题定位在py里的一句os.chdir(sys.path[0]+"/..")上。再然后我就写了个测试的Main函数,在控制台直接java -cp a.jar path.to.Main,果然输出了当前目录,于是问题清晰了。

于是网上查了下,竟然是我搞混了。如下摘自jdk文档

“user.dir” User working directory

“user.home” User home directory

最后我也终于记起来为什么会有这个错误的印象了。大学时用java写了个简单的http server,创建配置文件时,我默认写在了user.home,所以有了这个印象。如今看到user.dir,便和user.home混淆起来。

都写这么多年java了,让大家见笑了。问题也搞清楚了,我发现以后遇到路径问题,借助user.dir和脚本,可以非常方便的解决了。

4clojure

最近开始在4clojure上刷题,推荐对clojure有兴趣的同学一起来玩。

正好刷到第38题,贴出来分享下。

Write a function which takes a variable number of parameters and returns the maximum value.

1
2
3
4
5
6
(= (__ 1 8 3 4) 8)
(= (__ 30 20) 30)
(= (__ 45 67 11) 67)

不得使用max和max-key

##解

1
(fn [x & other] (reduce #(if (> %1 %2) %1 %2) x other))

博主是一个不是很聪明的码农。完美主义者,强迫症中期。这里会记录一些回忆和点滴,以博为镜。

武器库:

该博客使用基于  Hexo  的  simpleblock  主题。博客内容使用  CC BY-NC-SA 3.0  授权发布。最后生成于 2017-02-20.