|
突然抛了一个concurrentModificationException错误,Iterator的一个基本概念没有掌握导致的这个错误,就是在Iterator的实现类。比如Hashtable里面的内部类 private class Enumerator<T> implements Enumeration<T>, Iterator<T> 会在next,或者remove的时候检查当前集合是否会在修改状态,如果是的话,就会抛出 ConcurrentModificationException,而他自己remove则是使用了同步的方法,而且同步了modCount;expectedModCount; 1 public T next() { 2 if (modCount != expectedModCount) 3 throw new ConcurrentModificationException(); 4 return nextElement(); 5 } 6 7 8 public void remove() { 9 if (!iterator) 10 throw new UnsupportedOperationException(); 11 if (lastReturned == null) 12 throw new IllegalStateException("Hashtable Enumerator"); 13 if (modCount != expectedModCount) 14 throw new ConcurrentModificationException(); 15 16 synchronized(Hashtable.this) { 17 Entry[] tab = Hashtable.this.table; 18 int index = (lastReturned.hash & 0x7FFFFFFF) % tab.length; 19 20 for (Entry<K,V> e = tab[index], prev = null; e != null; prev = e, e = e.next) { 22 if (e == lastReturned) { 23 modCount++; 24 expectedModCount++; 25 if (prev == null) 26 tab[index] = e.next; 27 else 28 prev.next = e.next; 29 count--; 30 lastReturned = null; 31 return; 32 } 33 } 34 throw new ConcurrentModificationException(); 35 } 36 } 37 } 而自己在next的同时,修改了这个集合,导致了这个错误的出现 在Map或者Collection的时候,不要用它们的API直接修改集合的内容,如果要修改可以用Iterator的remove()方法,例如: 1 public void setReparation( Reparation reparation ) { 2 for (Iterator it = this.reparations.iterator();it.hasNext();){ //reparations为Collection 3 Reparation repa = (Reparation)it.next(); 4 if (repa.getId() == reparation.getId()){ 5 this.reparations.remove(repa); 6 this.reparations.add(reparation); 7 } 8 } 9 } 如上写会在运行期报ConcurrentModificationException,可以如下修改: 1 public void setReparation( Reparation reparation ) { 2 boolean flag = false; 3 for (Iterator it = this.reparations.iterator();it.hasNext();){ //reparations为Collection 4 Reparation repa = (Reparation)it.next(); 5 if (repa.getId() == reparation.getId()){ 6 it.remove(); 7 flag = true; 8 break; 9 } 10 } 11 if(flag){ 12 this.reparations.add(reparation); 13 } 14 } 原文摘自 alreal
API语法:
File(String pathname)
通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
public static final String separator
public static final char separatorChar
与系统有关的默认名称分隔符。此字段被初始化为包含系统属性 file.separator 值的第一个字符。在 UNIX 系统上,此字段的值为 '/' ;在 Microsoft Windows 系统上,它为 '\\' 。
注意:
路径名字符串与抽象路径名之间的转换与系统有关。将抽象路径名转换为路径名字符串时,每个名称与下一个名称之间用一个默认 分隔符 隔开。默认名称分隔符由系统属性 file.separator 定义,可通过此类的公共静态字段 separator
和 separatorChar
使其可用。将路径名字符串转换为抽象路径名时,可以使用默认名称分隔符或者底层系统支持的任何其他名称分隔符来分隔其中的名称。 例如,我希望的文件绝对路径是E:\dev\workspace\iclass_web/conf/filterconfig.xml(计作myPath),有两种创建File的形式:
1)new File(myPath)不会报错;
2)new File("E:\dev\workspace\iclass_web/conf/filterconfig.xm")报错,应修改为new File("E:\\dev\\workspace\\iclass_web/conf/filterconfig.xml"
我的系统是windows32位,io.File的一个字段FileSystem是一个抽象类,FileSystem被一个Win32FileSystem类继承,从而实现里面的public abstract String normalize(String path);方法。
Win32FileSystem部分源码如下:
1 private final char slash;
2 private final char altSlash;
3 private final char semicolon;
4
5 public Win32FileSystem() {
6 slash = ((String) AccessController.doPrivileged(
7 new GetPropertyAction("file.separator"))).charAt(0);
8 semicolon = ((String) AccessController.doPrivileged(
9 new GetPropertyAction("path.separator"))).charAt(0);
10 altSlash = (this.slash == '\\') ? '/' : '\\';
11 }
12
13 private boolean isSlash(char c) {
14 return (c == '\\') || (c == '/');
15 }
16
17 private boolean isLetter(char c) {
18 return ((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'));
19 }
20
21 private String slashify(String p) {
22 if ((p.length() > 0) && (p.charAt(0) != slash)) return slash + p;
23 else return p;
24 }
25
26 /* Check that the given pathname is normal. If not, invoke the real
27 normalizer on the part of the pathname that requires normalization.
28 This way we iterate through the whole pathname string only once. */
29 public String normalize(String path) {
30 int n = path.length();
31 char slash = this.slash;
32 char altSlash = this.altSlash;
33 char prev = 0;
34 for (int i = 0; i < n; i++) {
35 char c = path.charAt(i);
36 if (c == altSlash)
37 return normalize(path, n, (prev == slash) ? i - 1 : i);
38 if ((c == slash) && (prev == slash) && (i > 1))
39 return normalize(path, n, i - 1);
40 if ((c == ':') && (i > 1))
41 return normalize(path, n, 0);
42 prev = c;
43 }
44 if (prev == slash) return normalize(path, n, n - 1);
45 return path;
46 }
Hibernate中使用COUNT DISTINCT关键字: Hibernate在Hibernate中, 计算某列非重复记录的总数, 使用COUNT + DISTINCT 在MySQL中,可以使用 sql 代码 - select COUNT(DISTINCT(name)) from products
但在Hibernate中却不能用如下格式 - select COUNT(DISTINCT(name)) from ProductDTO
需要把里面的括号去掉, 改成 - select COUNT(DISTINCT name ) from ProductDTO
在MySQL中也可以使用这种样式.
报错现象 Oops: JPAQueryException An unexpected error occured caused by exception JPAQueryException: Error while executing query select t from TurnedIn t, Notification n where n.itemId=t.id and n.type=? and n.receiver.id=? and n.isDeleted=false group by t order by t.createTime desc: org.hibernate.type.SerializationException: could not deserialize ... Caused by: java.io.InvalidClassException: models.member.Member; local class incompatible: stream classdesc serialVersionUID = 8996579512119659486, local class serialVersionUID = -7513555048418418149 异常原因 本地和远程的member序列化后的serialVersionUID不 解决方法 将本地的序列化的类中的版本号(serialVersionUID )改成和远程中一样,在本地的序列化类里的private static final long serialVersionUID = 改成远程的就行了,如果没有的话就加上这句。 关于“org.hibernate.type.SerializationException: could not deserialize”,我查了很多的资料,大概有以下几个原因:
1.该类的序列版本号与从流中读取的类描述符的版本号不匹配(jdk版本更换会造成这个问题) 2.该类包含未知数据类型(hibernate配置文件中未指定数据类型) 3.该类没有可访问的无参数构造方法
pgSql
语法 to_number(text, text)
例子 select to_number(trim(both 'ibs' from classname), '999999') as cn from bbs order by cn /*trim(both 'ibs' from classname)去除classname字段中的'ibs'字符*/
mySql
语法 str*1 / str+1 / -str /*str为varchar的数字,此处不一定是1,只要是数字即可*/
hql
语法 to_number(text, text)
例子 select b from BBS b where b.isDeleted=false order by to_number(trim(both 'ibs' from b.className), '999999')
pgSql数据类型格式化函数
order by isTop desc
默认false在前;按desc,true在前
在push之前有时候会不放心是不是忘记加某些文件,或者是不是多删了个什么东西,这时候希望能够看看上次commit都做了些什么。
一开始想到的是用git diff,但是git diff用于当前修改尚未commit的时候较为方便,一旦commit后,需要指定上次节点的名称(一个hash值),不方便。这种时候用git log更合适,因为commit的内容会以log来记录。
下面记录几个常用的情境以及对应的命令。
仅仅想看最近谁有提交,以及提交的描述
对应命令 git log
显示Sample
commit 6305aa81a265f9316b606d3564521c43f0d6c9a3
Author: XXX
Date: Thu Nov 3 11:38:15 2011 +0800
fill author information in the head of files and format some code
commit 8e8a4a96e134dab8f045937efee35bd710006946
Author: XXX
Date: Thu Nov 3 04:05:34 2011 +0800
user management is mostly complete
details:
add support for account disable/enable
rewrite most related views to suit the above need
provide two decorators for access control (see README)
fixed many errors in Milestone 1
commit 2870cd564371d8ad043d0da426a5770d36412421
Author: XXX
Date: Mon Oct 17 20:19:04 2011 -0400
fix the bug of get_ori_url_from_shorturl().
commit b6cdd881a19ecaff838d5825c3a6b7058fdd498a
Author: XXX
Date: Mon Oct 17 20:17:37 2011 -0400
fix the bug of get_article_from_short_url.
仅仅想看最后一次的提交
对应命令参数 -n 1
显示Sample
commit 6305aa81a265f9316b606d3564521c43f0d6c9a3
Author: XXX
Date: Thu Nov 3 11:38:15 2011 +0800
fill author information in the head of files and format some code
想看到最近一次提交所有更改过的文件
对应命令 git log -n 1 --stat
显示Sample
commit 6305aa81a265f9316b606d3564521c43f0d6c9a3
Author: XXX
Date: Thu Nov 3 11:38:15 2011 +0800
fill author information in the head of files and format some code
Site/accounts/decorators.py | 2 +-
Site/accounts/forms.py | 1 +
Site/accounts/models.py | 1 +
Site/accounts/readme | 3 ++-
Site/accounts/templates/account_activate.html | 1 +
Site/accounts/templates/account_disabled.html | 1 +
…
…
28 files changed, 37 insertions(+), 8 deletions(-)
想看到最近一次提交所有更改的细节
对应命令 git log -n 1 -p
显示Sample
commit 6305aa81a265f9316b606d3564521c43f0d6c9a3
Author: XXX
Date: Thu Nov 3 11:38:15 2011 +0800
fill author information in the head of files and format some code
diff --git a/Site/accounts/decorators.py b/Site/accounts/decorators.py
index 22522bc..a6bb440 100755
--- a/Site/accounts/decorators.py
+++ b/Site/accounts/decorators.py
@@ -1,9 +1,9 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
+# author: Rex Nov. 3, 2011
from functools import wraps
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
-from django.utils.decorators import available_attrs
from Site.accounts.models import UserProfile
def login_required(view_func):
diff --git a/Site/accounts/forms.py b/Site/accounts/forms.py
index 016710b..778d92a 100755
--- a/Site/accounts/forms.py
+++ b/Site/accounts/forms.py
@@ -1,5 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
+# author: Rex Nov. 3, 201
…
…
有了这几条命令,基本上对于想看最近更改的情境就可以应付过去了。最后一条并不很常用,如果有visual的工具可能更直观些。
原文转自git使用点滴
Onunload,onbeforeunload都是在刷新或关闭时调用,可以在<script>脚本中通过window.onunload 来指定或者在<body>里指定。区别在于onbeforeunload在onunload之前执行,它还可以阻止onunload的执行。
Onbeforeunload也是在页面刷新或关闭时调用,Onbeforeunload是正要去服务器读取新的页面时调用,此时还没开始读取;而 onunload则已经从服务器上读到了需要加载的新的页面,在即将替换掉当前页面时调用。Onunload是无法阻止页面的更新和关闭的。而 Onbeforeunload 可以做到。曾经做一个考试系统,涉及到防止用户半途退出考试(有意或者无意),代码如下: <body onbeforeunload=" checkLeave()"> <script> function checkLeave(){ event.returnValue="确定放弃考试?(考试作废,不记录成绩)"; } </script> 这样可以让用户确认是否要退出考场,其实BLOGJAVA在用户编写BLOG时,如果不保存而跳转到其他页面,也会有一个确认的提示(防止误操作),也是用到Onbeforeunload。
另外还可以用来在页面关闭的时候关闭session,代码如下(注:用window.screenLeft > 10000 来区分关闭和刷新操作): <body onbeforeunload=" closeSession()"> <script> function closeSession (){ //关闭(刷新的时候不关闭Session) if(window.screenLeft>10000){ //关闭Session的操作(可以运用AJAX) } } </script> 文章摘自 blogJava
问题描述:firefox下js中动态组装select时指定option的selected属性的失效 有问题的代码如下: 1 // 加载select列表 2 var teaOption ='', ownerSel = $("ownerSel"); 3 for(var i = 0; i < teaList.length; i ++){ 4 var teacher = teaList[i]; 5 if(teacher.isDeleted === false){ 6 var tid = teacher.id, tName = teacher.fullName, newOption; 7 var flag = ((tid === formerOwnerId) ? 'selected="selected"' : ''); 9 teaOption += '<option value="'+tid+'" '+ flag +'>'+ tName +'</option>'; 10 } 11 } 12 ownerSel.html(teaOption); 此时selected属性无效,ff中的select显示的是option列表的最后一个。 原因貌似是这样子: selected这个属性本身是没有错的,你在页面开始加载的前写好,然后浏览器加载的时候就会读取这个dom,然后有selected这个效果。 但是通过js动态组装的select的html代码,在ie下我刚刚试了下可行(我刚刚失败的原因是三目运算符处少加了一个括号);firefox下,在请求加载的同时加载dom元素,但是ff内核可能是为了追求速度,而省略了一些dom的属性的加载,导致了selected这个属性的失效。
解决方法(我用的是mootools):在加载的时候将option元素通过如下解决
1 // 加载select列表 2 var ownerSel = $("ownerSel"); 3 for(var i = 0; i < teaList.length; i ++){ 4 var teacher = teaList[i]; 5 if(teacher.isDeleted === false){ 6 var tid = teacher.id, tName = teacher.fullName, newOption; 7 if(tid === formerOwnerId) 8 newOption = new Element('option', {"value" : tid, "selected" : "selected"}).html(tName); 9 else 10 newOption = new Element('option', {"value" : tid}).html(tName); 11 ownerSel.grab(newOption); // 将新的element插入到select中 12 } 13 }
错误 org.hibernate.HibernateException: ordinal parameter mismatch 。 我的错误是未将hql语句设置参数时的占位符去掉(粗糙流了下- -///)
1 hql += " and bbs.id=? " + bbs.id; 在这之前网上发现的另一种错误也很值得注意:在数据表中用了关键字“call” 作为数据字段,所以产生了这个问题。Hibernate报错如下: org.hibernate.HibernateException: ordinal parameter mismatch at org.hibernate.engine.query.HQLQueryPlan.buildParameterMetadata(HQLQueryPlan.java:225) at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:95) at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:54) at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:71) at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133) at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112) at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1583) ...... 出错的原因是在org.hibernate.engine.query.ParameterParser类中有下列一段代码
1 public static void parse(String sqlString, Recognizer recognizer) throws QueryException{ 2 boolean hasMainOutputParameter = sqlString.indexOf( "call" ) > 0 && 3 sqlString.indexOf( "?" ) < sqlString.indexOf( "call" ) && 4 sqlString.indexOf( "=" ) < sqlString.indexOf( "call" ); 5 ...... 6 } 我们都知道hibernate3可以调用存储过程或函数,但是有一定的限制(具体可以查看hibernate官方手册)。 据我分析这段代码应该是用来分析字符串是否是调用存储过程或函数的语句。 解决方法: 1.不要在表或列中,出现"call"字样 2.用Criteria来代替hql语句
|