博主是一个不是很聪明的码农。完美主义者,强迫症中期。这里会记录一些回忆和点滴,以博为镜。
武器库:
今天在一个熟悉的场景首次遇到了异常,在使用ArrayList的Iterator时,抛出了java.lang.IllegalStateException
。仔细分析后,发现是一个不合适的循环嵌套,导致了it.remove()
连续调用了两次。结合源码看了下,AbstractList$Itr
类使用了一个int lastRet
变量标记最近一次next()
所指向的元素,而在调用it.remove()
时,先检查lastRet的值,如果为-1,则抛出IllegalStateException
,否则将lastRet置为-1。用以保证一个元素只被remove一次。在Itr类的子类ListIterator里,previous()
也是同样原理。
古人云:
吃一堑长一智
又云:
学如逆水行舟,不进则退
重点在吃和行两个字,讲究行动,一定要在实践中遇到困难,并解决,方能长一智,方能前进。对于码农,则一定是要多动手,多碰钉子,多独立解决问题,如是自勉。
今天调试程序的时候,发现我之前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上刷题,推荐对clojure有兴趣的同学一起来玩。
正好刷到第38题,贴出来分享下。
Write a function which takes a variable number of parameters and returns the maximum value.
|
|
不得使用max和max-key
##解
|
|