??xml version="1.0" encoding="utf-8" standalone="yes"?>
正文Q?/font>
1. Z方便按列作外循环Q想把ArrayList构造成一个二l数l,如下Q?/p>
......
ArrayList result=GetResult();
int n=result.size();
String[][] myArray=new String[n][]; //定义二维数组
for (int i=0;i<n;i++) //构造二l数l?br />
{
ArrayList tempArray= (ArrayList)result.get(i);
myArray[i]=(String[])tempArray.toArray();
}
......
E序可以~译通过?/p>
但在q行到myArray[i]=(String[])tempArray.toArray()Ӟ出现java.lang.ClassCastException的错误,很奇怪?/p>
׃一晚上旉Q查了N多资料,ȝ搞定了。现把问题记录下来,以备参考?/p>
2. 此事从头说v。
ArrayListcL展AbstractListq执行List接口。ArrayList支持可随需要而增长的动态数l?/p>
ArrayList有如下的构造函敎ͼ
ArrayList( )
ArrayList(Collection c)
ArrayList(int capacity)
如果调用new ArrayList()构造时Q其默认的capacity(初始定w)?0?/p>
参见ArrayList源码Q其中是q样定义的:
public ArrayList() {
this(10);
}
默认初始化内部数l大ؓ10。ؓ什么是10Q不知道。可能SUN觉得q样比较爽吧?/p>
E序~译后执行ArrayList.toArray()Q把ArrayList转化为数l时Q该数组大小仍ؓcapacityQؓ10Q?/p>
?装入的数据和capacityg{时Q小于capacityQ,比如只装入了5个数据,数组中后面的Qcapacity - sizeQ个对象置为nullQ此时当数组强制cd转换ӞҎ出现一些问题,如java.lang.ClassCastException异常{?/p>
解决办法是:在用ArrayList转化为数l装数据后,使用trimToSize()重新讄数组的真实大?/p>
3. 本例修改后的代码修如下,可顺利运行:
for (int i=0;i<n;i++) //构造二l数l?br />
{
ArrayList tempArray= (ArrayList)result.get(i);
myArray[i]=(String[])tempArray.toArray(new String[0]); //注意此处的写?br />
}
看看下面q些也许明白了Q-
ArrayList.toArray()之一Q?/p>
public Object[] toArray() {
Object[] result = new Object[size];
System.arraycopy(elementData, 0, result, 0, size);
return result;
}
q回ArrayList元素的一个数l,注意q里虽然生成了一个新的数l,但是数组元素和集合中的元素是׃n的,Collection接口中说q个是安全的Q这是不严格的?/p>
下面的例子演CZq个效果?br />
ArrayList al=new ArrayList();
al.add(new StringBuffer("hello"));
Object[] a=al.toArray();
StringBuffer sb=(StringBuffer)a[0];
sb.append("changed"); //改变数组元素同样也改变了原来的ArrayList中的元素
System.out.println(al.get(0));
q里不要用String来代替StringBufferQ因为String是不可变的?/p>
ArrayList.toArray()之二Q?/p>
public Object[] toArray(Object a[]) {
if (a.length < size)
a = (Object[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size);
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
q个Ҏ有可能不需要生成新的数l,注意到如果数la定wq大Q只在size处设|ؓnull?/p>
如果q个数组a_大,׃把数据全放进去,q回的数l也是指向这个数l,Q数l多余的I间存储的是null对象Q;要是不够大,q请一个跟参数同样cd的数l,把值放q去Q然后返回?/font>
4. |上的资料一Q?/p>
public String[] getPlatformIDList()
{
Vector result = new Vector();
try
{
Statement stmt = conn.createStatement();
String sql = "SELECT PlatformID FROM Platform";
rs = stmt.executeQuery(sql);
while(rs.next())
{
result.add(rs.getString(1));
}
if (result.size() > 0)
{
String[] str = (String[]) result.toArray(); // 出现ClassCastException
return str;
}
else
return null;
}
catch(Exception e)
{
System.err.println(e);
return null;
}
finally
{
try
{
rs.close();
conn.close();
}
catch(Exception e2)
{}
}
}
E序q行后,发现不能VectorcȝqtoArray()Ҏ得到的Object[]直接转换成String[]?/p>
扑ֈ用另一个带有参数的 toArray(T[] a)Ҏ才可以?/p>
该语句改ؓQ?/p>
String[] str = (String[]) result.toArray(new String[1]);卛_诉VectorQ我要得到的数组的类型?/p>
回想一下,应该是java中的强制cd转换只是针对单个对象的,惌hQ将整个数组转换成另外一U类型的数组是不行的?/p>
5. |上的资料二Q?/p>
正确使用List.toArray()Q-
在程序中Q往往得到一个ListQ程序要求对应赋值给一个arrayQ可以这样写E序:
Long [] l = new Long[list.size()];
for(int i=0;i<list.size();i++)
l[i] = (Long) list.get(i);
要写q些codeQ似乎比较繁琐,其实List提供了toArray()的方法?br />
但是要用不好,׃有ClassCastExceptiony异常。究竟这个是如何产生的,且看代码Q?/p>
List list = new ArrayList();
list.add(new Long(1));list.add(new Long(2));
list.add(new Long(3));list.add(new Long(4));
Long[] l = (Long[])list.toArray();
for(int i=0; i<l.length; i++)
System.out.println(l[i].longValue());
U色代码会抛java.lang.ClassCastException?/p>
当然Qؓ了读出值来Q你可以q样code:
Object [] a = list.toArray();
for(int i=0;i<a.length;i++)
System.out.println(((Long)a[i]).longValue());
但是让数l丢׃cd信息Q这个不是我们想要得?/p>
toArray()正确使用方式如下Q?/p>
1) Long[] l = new Long[<total size>];
list.toArray(l);
2) Long[] l = (Long []) list.toArray(new Long[0]);
3) Long [] a = new Long[<total size>];
Long [] l = (Long []) list.toArray(a);
6. ȝ补充Q?/p>
java sdk doc 上讲:
public Object[] toArray(Object[] a)
a--the array into which the elements of this list are to be stored, if it is big enough; otherwise, a new array of the same runtime type is allocated for this purpose.
如果q个数组a_大,׃把数据全放进去,q回的数l也是指向这个数l,Q数l多余的I间存储的是null对象Q;要是不够大,q请一个跟参数同样cd的数l,把值放q去Q然后返回?br />
需要注意的是:你要是传入的参数?个大,而list里面?个object,那么其他的四个很可能是null , 使用的时候要特别注意?/p>
7. 完毕?/p>
J.R.Q.
2005.10.27凌晨于广?nbsp;
你可以在你从CVS中签出的源代码中?/span>org.eclipse.birt.report.viewer/birt/WEB-INF/classes/org/eclipse/birt/report/utility文g夹中扑ֈParameterAccessor.java文gQ在q个java文g中找到这行:
public static final String UTF_8_ENCODE = "UTF-8"; //$NON-NLS-1$
这行改?/span>
public static final String UTF_8_ENCODE = "GBK"; //$NON-NLS-1$
然后这个编译好?/span>class文g压羃?/span>viewservlets.jar的同{目录下Q替换原来的文g”Q本Z试了q种ҎQ但没见凑效Q不q上面的解决Ҏ好像是在birt2.1的环境下Q这个没仔细试,也许对birt2.1有效吧?/span>
本h使用birt版本2.3Q解军_法如?
在JSP中调用BIRT报表Ӟ传的参数中有中文字符Q即URL中包含中文字W,q时在BIRT端接收到的参数拼SQL语句后发C文字W被转码Q造成SQL中的条g不正?br />
因ؓ在JSP中调用BIRT是在一个JS脚本中,因此要想办法在JS中先中文{成UTF-8,q且在BIRT获取参数后再UTF-8转换回中文即可?br />
实现代码Q?br />
面JS:
Var mychecktype = “中文”;
sqlWhere+="and t.CHECK_TYPE = '"+escape(encodeURI(mychecktype))+"'";
BIRT脚本Q?br />
sql+=decodeURI(mycondition);
面中写了一个函?/span>a,在另一个函C调用Q页面用的是一?/span>iframe框架Q即通过iframe?/span>src参数来刷?/span>iframe中的面Q每ơ在W一ơ调用函?/span>a时没问题Q但W二ơ点L钮调用函?/span>a时老报“~少函数”的错误?
function a(var1)后来发现函数中返回值变量名和函数名定义为同一个名字,把返回值变量名Ҏ其它名字后问题就解决了,好弱的一个问题啊Q折腾了我半天,气愤Q?/span>
Ҏ return b 好?/span> -_-
q原备䆾会方便点Q但有时也会出现无法q原的问题,不知如何是好Q最后只能想到在命oH口来执行SQL文gQ好像还挺管用,?/p>
体执行命令如下:
先进入cmd命o行;
然后q入mysql命o行;
>mysql -u admin -p
>*****
>use dbname
mysql>source %pass%\mySQLFile.sqlQ这里的%pass%指的是SQL文g所在的路径Q如F:/date/mysqlDB.sql,q里路径量别用?/p>
文吧Q像安装ORACLE一P中文路径可能会出现问题,用英文保险一点^_^Q?/p>
六种异常处理的陋?/font>
你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机Ӟ在下面这D代码中Q你能够q速找出异常处理的六个问题吗?
1 OutputStreamWriter out = ... 2 java.sql.Connection conn = ... 3 try { // ? 4 Statement stat = conn.createStatement(); 5 ResultSet rs = stat.executeQuery( 6 "select uid, name from user"); 7 while (rs.next()) 8 { 9 out.println("IDQ? + rs.getString("uid") // ? 10 "Q姓名:" + rs.getString("name")); 11 } 12 conn.close(); // ? 13 out.close(); 14 } 15 catch(Exception ex) // ? 16 { 17 ex.printStackTrace(); //_? 18 } |
作ؓ一个JavaE序员,你至应该能够找Z个问题。但是,如果你不能找出全部六个问题,Ll阅L文?
本文讨论的不是Java异常处理的一般性原则,因ؓq些原则已经被大多数人熟知。我们要做的是分析各U可UCؓ“反例”Qanti-patternQ的q背优秀~码规范的常见坏习惯Q帮助读者熟悉这些典型的反面例子Q从而能够在实际工作中敏锐地察觉和避免这些问题?
反例之一Q丢弃异?
代码Q?5?18行?
q段代码捕获了异常却不作M处理Q可以算得上Java~程中的杀手。从问题出现的频J程度和害E度来看Q它也许可以和C/C++E序的一个恶名远播的问题相提q论??不检查缓冲区是否已满。如果你看到了这U丢弃(而不是抛出)异常的情况,可以癑ֈ之九十九地肯定代码存在问题(在极数情况下,q段代码有存在的理由Q但最好加上完整的注释Q以免引起别解)?
q段代码的错误在于,异常Q几乎)L意味着某些事情不对劲了Q或者说臛_发生了某些不d的事情,我们不应该对E序发出的求救信号保持沉默和无动于衷。调用一下printStackTrace不?#8220;处理异常”。不错,调用printStackTrace对调试程序有帮助Q但E序调试阶段l束之后QprintStackTrace׃应再在异常处理模块中担负主要责Q了?
丢弃异常的情形非常普遍。打开JDK的ThreadDeathcȝ文Q可以看C面这D说明:“特别圎ͼ虽然出现ThreadDeath是一U?#8216;正常的情?#8217;Q但ThreadDeathcLError而不是Exception的子c,因ؓ许多应用会捕h有的Exception然后丢弃它不再理睬?#8221;q段话的意思是Q虽然ThreadDeath代表的是一U普通的问题Q但鉴于许多应用会试图捕h有异常然后不予以适当的处理,所以JDK把ThreadDeath定义成了Error的子c,因ؓErrorcM表的是一般的应用不应该去捕获的严重问题。可见,丢弃异常q一坏习惯是如此常见Q它甚至已经影响CJava本n的设计?
那么Q应该怎样Ҏ呢?主要有四个选择Q?
1、处理异常。针对该异常采取一些行动,例如修正问题、提醒某个h或进行其他一些处理,要根据具体的情Ş定应该采取的动作。再ơ说明,调用printStackTrace不上已l?#8220;处理好了异常”?
2、重新抛出异常。处理异常的代码在分析异怹后,认ؓ自己不能处理它,重新抛出异常也不׃ؓ一U选择?
3、把该异常{换成另一U异常。大多数情况下,q是指把一个低U的异常转换成应用的异常(其含义更Ҏ被用户了解的异常Q?
4、不要捕获异常?
l论一Q既然捕获了异常Q就要对它进行适当的处理。不要捕获异怹后又把它丢弃Q不予理睬?
反例之二Q不指定具体的异?
代码Q?5行?
许多时候h们会被这样一U?#8220;妙?#8221;x吸引Q用一个catch语句捕获所有的异常。最常见的情形就是用catch(Exception ex)语句。但实际上,在绝大多数情况下Q这U做法不值得提倡。ؓ什么呢Q?
要理解其原因Q我们必d一下catch语句的用途。catch语句表示我们预期会出现某U异常,而且希望能够处理该异常。异常类的作用就是告诉Java~译器我们想要处理的是哪一U异常。由于绝大多数异帔R直接或间接从java.lang.ExceptionzQcatch(Exception ex)q当于说我们想要处理几乎所有的异常?
再来看看前面的代码例子。我们真正想要捕L异常是什么呢Q最明显的一个是SQLExceptionQ这是JDBC操作中常见的异常。另一个可能的异常是IOExceptionQ因为它要操作OutputStreamWriter。显Ӟ在同一个catch块中处理q两U截然不同的异常是不合适的。如果用两个catch块分别捕获SQLException和IOExceptionp好多了。这是_catch语句应当量指定具体的异常类型,而不应该指定늛范围太广的ExceptioncR?
另一斚wQ除了这两个特定的异常,q有其他许多异常也可能出现。例如,如果׃某种原因QexecuteQueryq回了nullQ该怎么办?{案是让它们l箋抛出Q即不必捕获也不必处理。实际上Q我们不能也不应该去捕获可能出现的所有异常,E序的其他地方还有捕获异常的Z??直至最后由JVM处理?
l论二:在catch语句中尽可能指定具体的异常类型,必要时用多个catch。不要试囑֤理所有可能出现的异常?
反例之三Q占用资源不释放
代码Q??14行?
异常改变了程序正常的执行程。这个道理虽然简单,却常常被Z忽视。如果程序用C文g、Socket、JDBCq接之类的资源,即遇到了异常,也要正确释放占用的资源。ؓ此,Java提供了一个简化这cL作的关键词finally?
finally是样好东西:不管是否出现了异常,Finally保证在try/catch/finally块结束之前,执行清理d的代码L有机会执行。遗憄是有些h却不习惯使用finally?
当然Q编写finally块应当多加小心,特别是要注意在finally块之内抛出的异常??q是执行清理d的最后机会,量不要再有难以处理的错误?
l论三:保证所有资源都被正释放。充分运用finally关键词?/font>
反例之四Q不说明异常的详l信?
代码Q??18行?
仔细观察q段代码Q如果@环内部出C异常Q会发生什么事情?我们可以得到_的信息判断@环内部出错的原因吗?不能。我们只能知道当前正在处理的cd生了某种错误Q但却不能获得Q何信息判断导致当前错误的原因?
printStackTrace的堆栈跟t功能显C出E序q行到当前类的执行流E,但只提供了一些最基本的信息,未能说明实际D错误的原因,同时也不易解诅R?
因此Q在出现异常Ӟ最好能够提供一些文字信息,例如当前正在执行的类、方法和其他状态信息,包括以一U更适合阅读的方式整理和l织printStackTrace提供的信息?
l论四:在异常处理模块中提供适量的错误原因信息,l织错误信息使其易于理解和阅诅R?
反例之五Q过于庞大的try?
代码Q??14行?
l常可以看到有h把大量的代码攑օ单个try块,实际上这不是好习惯。这U现象之所以常见,原因在于有些h囄事,不愿花时间分析一大块代码中哪几行代码会抛出异常、异常的具体cd是什么。把大量的语句装入单个巨大的try块就象是出门旅游时把所有日常用品塞入一个大子Q虽然东西是带上了,但要扑և来可不容易?
一些新手常常把大量的代码放入单个try块,然后再在catch语句中声明ExceptionQ而不是分d个可能出现异常的D落q分别捕获其异常。这U做法ؓ分析E序抛出异常的原因带来了困难Q因Z大段代码中有太多的地方可能抛出Exception?
l论五:量减小try块的体积?
反例之六Q输出数据不完整
代码Q??11行?
不完整的数据是JavaE序的隐形杀手。仔l观察这D代码,考虑一下如果@环的中间抛出了异常,会发生什么事情。@环的执行当然是要被打断的Q其ơ,catch块会执行??p些,再也没有其他动作了。已l输出的数据怎么办?使用q些数据的h或设备将收到一份不完整的(因而也是错误的Q数据,却得不到M有关q䆾数据是否完整的提C。对于有些系l来_数据不完整可能比pȝ停止q行带来更大的损失?
较ؓ理想的处|办法是向输备写一些信息,声明数据的不完整性;另一U可能有效的办法是,先缓冲要输出的数据,准备好全部数据之后再一ơ性输出?
l论六:全面考虑可能出现的异总及这些异常对执行程的媄响?
改写后的代码
Ҏ上面的讨论,下面l出改写后的代码。也许有Z说它E微有点?嗦,但是它有了比较完备的异常处理机制?
OutputStreamWriter out = ... java.sql.Connection conn = ... try { Statement stat = conn.createStatement(); ResultSet rs = stat.executeQuery( "select uid, name from user"); while (rs.next()) { out.println("IDQ? + rs.getString("uid") + "Q姓? " + rs.getString("name")); } } catch(SQLException sqlex) { out.println("警告Q数据不完整"); throw new ApplicationException("d数据时出现SQL错误", sqlex); } catch(IOException ioex) { throw new ApplicationException("写入数据时出现IO错误", ioex); } finally { if (conn != null) { try { conn.close(); } catch(SQLException sqlex2) { System.err(this.getClass().getName() + ".mymethod - 不能关闭数据库连? " + sqlex2.toString()); } } if (out != null) { try { out.close(); } catch(IOException ioex2) { System.err(this.getClass().getName() + ".mymethod - 不能关闭输出文g" + ioex2.toString()); } } } |
术异常c:ArithmeticExecption
I指针异常类QNullPointerException
cd强制转换异常QClassCastException
数组负下标异常:NegativeArrayException
数组下标界异常QArrayIndexOutOfBoundsException
q背安全原则异常QSecturityException
文g已结束异常:EOFException
文g未找到异常:FileNotFoundException
字符串{换ؓ数字异常QNumberFormatException
操作数据库异常:SQLException
输入输出异常QIOException
Ҏ未找到异常:NoSuchMethodException
java.lang.AbstractMethodError
抽象Ҏ错误。当应用试图调用抽象Ҏ时抛出?/p>
java.lang.AssertionError
断言错。用来指CZ个断ap|的情c?/p>
java.lang.ClassCircularityError
cd@环依赖错误。在初始化一个类Ӟ若检到cM间@环依赖则抛出该异常?/p>
java.lang.ClassFormatError
cL式错误。当Java虚拟图从一个文件中dJavac,而检到该文件的内容不符合类的有效格式时抛出?/p>
java.lang.Error
错误。是所有错误的基类Q用于标识严重的E序q行问题。这些问题通常描述一些不应被应用E序捕获的反常情c?/p>
java.lang.ExceptionInInitializerError
初始化程序错误。当执行一个类的静态初始化E序的过E中Q发生了异常时抛出。静态初始化E序是指直接包含于类中的static语句Dc?/p>
java.lang.IllegalAccessError
q法讉K错误。当一个应用试图访问、修Ҏ个类的域QFieldQ或者调用其ҎQ但是又q反域或Ҏ的可见性声明,则抛异常?/p>
java.lang.IncompatibleClassChangeError
不兼容的cd化错误。当正在执行的方法所依赖的类定义发生了不兼容的改变时Q抛异常。一般在修改了应用中的某些类的声明定义而没有对整个应用重新~译而直接运行的情况下,Ҏ引发该错误?/p>
java.lang.InstantiationError
实例化错误。当一个应用试N过Java的new操作W构造一个抽象类或者接口时抛出该异?
java.lang.InternalError
内部错误。用于指CJava虚拟机发生了内部错误?/p>
java.lang.LinkageError
链接错误。该错误及其所有子cLC某个类依赖于另外一些类Q在该类~译之后Q被依赖的类改变了其cd义而没有重新编译所有的c,q而引发错误的情况?/p>
java.lang.NoClassDefFoundError
未找到类定义错误。当Java虚拟机或者类装蝲器试囑֮例化某个c,而找不到该类的定义时抛出该错误?/p>
java.lang.NoSuchFieldError
域不存在错误。当应用试图讉K或者修Ҏcȝ某个域,而该cȝ定义中没有该域的定义时抛错误?/p>
java.lang.NoSuchMethodError
Ҏ不存在错误。当应用试图调用某类的某个方法,而该cȝ定义中没有该Ҏ的定义时抛出该错误?/p>
java.lang.OutOfMemoryError
内存不错误。当可用内存不以让Java虚拟机分配给一个对象时抛出该错误?/p>
java.lang.StackOverflowError
堆栈溢出错误。当一个应用递归调用的层ơ太p导致堆栈溢出时抛出该错误?/p>
java.lang.ThreadDeath
U程l束。当调用ThreadcȝstopҎ时抛错误Q用于指C线E结束?/p>
java.lang.UnknownError
未知错误。用于指CJava虚拟机发生了未知严重错误的情c?/p>
java.lang.UnsatisfiedLinkError
未满的链接错误。当Java虚拟机未扑ֈ某个cȝ声明为nativeҎ的本a定义时抛出?/p>
java.lang.UnsupportedClassVersionError
不支持的cȝ本错误。当Java虚拟图从d某个cLӞ但是发现该文件的丅R次版本号不被当前Java虚拟机支持的时候,抛出该错误?/p>
java.lang.VerifyError
验证错误。当验证器检到某个cL件中存在内部不兼Ҏ者安全问题时抛出该错误?/p>
java.lang.VirtualMachineError
虚拟机错误。用于指C拟机被破坏或者l执行操作所需的资源不的情况?/p>
java.lang.ArithmeticException
术条g异常。譬如:整数除零{?/p>
java.lang.ArrayIndexOutOfBoundsException
数组索引界异常。当Ҏl的索引gؓ负数或大于等于数l大时抛出?/p>
java.lang.ArrayStoreException
数组存储异常。当向数l中存放非数l声明类型对象时抛出?/p>
java.lang.ClassCastException
c造型异常。假设有cA和BQA不是B的父cL子类Q,O是A的实例,那么当强制将O构造ؓcB的实例时抛出该异常。该异常l常被称为强制类型{换异常?/p>
java.lang.ClassNotFoundException
找不到类异常。当应用试图Ҏ字符串Ş式的cd构造类Q而在遍历CLASSPAH之后找不到对应名U的class文gӞ抛出该异常?/p>
java.lang.CloneNotSupportedException
不支持克隆异常。当没有实现Cloneable接口或者不支持克隆Ҏ?调用其clone()Ҏ则抛异常?/p>
java.lang.EnumConstantNotPresentException
枚D帔R不存在异常。当应用试图通过名称和枚丄型访问一个枚丑֯象,但该枚D对象q不包含帔RӞ抛出该异常?/p>
java.lang.Exception
根异常。用以描q应用程序希望捕L情况?/p>
java.lang.IllegalAccessException
q法的访问异常。当应用试图通过反射方式创徏某个cȝ实例、访问该cd性、调用该cL法,而当时又无法讉Kcȝ、属性的、方法的或构造方法的定义时抛异常?/p>
java.lang.IllegalMonitorStateException
q法的监控状态异常。当某个U程试图{待一个自己ƈ不拥有的对象QOQ的监控器或者通知其他U程{待该对象(OQ的监控器时Q抛异常?/p>
java.lang.IllegalStateException
q法的状态异常。当在Java环境和应用尚未处于某个方法的合法调用状态,而调用了该方法时Q抛异常?/p>
java.lang.IllegalThreadStateException
q法的线E状态异常。当县城未处于某个Ҏ的合法调用状态,而调用了该方法时Q抛出异常?/p>
java.lang.IndexOutOfBoundsException
索引界异常。当讉K某个序列的烦引值小?或大于等于序列大时Q抛异常?/p>
java.lang.InstantiationException
实例化异常。当试图通过newInstance()Ҏ创徏某个cȝ实例Q而该cL一个抽象类或接口时Q抛异常?/p>
java.lang.InterruptedException
被中止异常。当某个U程处于长时间的{待、休眠或其他暂停状态,而此时其他的U程通过Thread的interruptҎl止该线E时抛出该异常?/p>
java.lang.NegativeArraySizeException
数组大小值异常。当使用负数大小值创建数l时抛出该异常?/p>
java.lang.NoSuchFieldException
属性不存在异常。当讉K某个cȝ不存在的属性时抛出该异常?/p>
java.lang.NoSuchMethodException
Ҏ不存在异常。当讉K某个cȝ不存在的Ҏ时抛异常?/p>
java.lang.NullPointerException
I指针异常。当应用试图在要求用对象的地方使用了nullӞ抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计null对象的长度、用throw语句抛出null{等?/p>
java.lang.NumberFormatException
数字格式异常。当试图一个String转换为指定的数字cdQ而该字符串确不满x字类型要求的格式Ӟ抛出该异常?/p>
java.lang.RuntimeException
q行时异常。是所有Java虚拟机正常操作期间可以被抛出的异常的父类?/p>
java.lang.SecurityException
安全异常。由安全理器抛出,用于指示q反安全情况的异常?/p>
java.lang.StringIndexOutOfBoundsException
字符串烦引越界异常。当使用索引D问某个字W串中的字符Q而该索引值小?或大于等于序列大时Q抛异常?/p>
java.lang.TypeNotPresentException
cd不存在异常。当应用试图以某个类型名U的字符串表达方式访问该cdQ但是根据给定的名称又找不到该类型是抛出该异常。该异常与ClassNotFoundException的区别在于该异常是uncheckedQ不被检查)异常Q而ClassNotFoundException是checkedQ被查)异常?/p>
java.lang.UnsupportedOperationException
不支持的Ҏ异常。指明请求的Ҏ不被支持情况的异常?/p>
异常
javax.servlet.jsp.JspException: Cannot retrieve mapping for action /Login Q?Login是你的action名字Q?nbsp;
可能原因
action没有再struts-config.xml 中定义,或没有找到匹配的actionQ例如在JSP文g中?<html:form action="Login.do".表单提交给Login.do处理Q如果出Cq异常,h看struts-config.xml中的定义部分Q有时可能是打错了字W或者是某些不符合规则,可以使用strutsconsole工具来检查?br />
-----------------------------------------------------------------------------------------------------------------
异常
org.apache.jasper.JasperException: Cannot retrieve definition for form bean null
可能原因
q个异常是因为StrutsҎstruts-config.xml中的mapping没有扑ֈaction期望的form bean。大部分的情况可能是因ؓ在form-bean中设|的name属性和action中设|的name属性不匚w所致。换句话_action和form都应该各自有一个name属性,q且要精匹配,包括大小写。这个错误当没有name属性和action兌时也会发生,如果没有在action中指定name属性,那么没有name属性和action相关联。当然当action制作某些控制Ӟ譬如Ҏ参数D转到相应的jsp面Q而不是处理表单数据,q是׃用name属性,q也是action的用方法之一?br />
-----------------------------------------------------------------------------------------------------------------
异常
No action instance for path /xxxx could be created
可能原因
特别提示Q因为有很多中情况会Dq个错误的发生,所以推荐大家调高你的web服务器的日志/调试U别Q这样可以从更多的信息中看到潜在的、在试图创徏actioncL发生的错误,q个actioncM已经在struts-config.xml中设|了兌Q即d?lt;action>标签Q?/p>
在struts-config.xml中通过action标签的class属性指定的actioncM能被扑ֈ有很多种原因Q例如:定位~译后的.class文gp|。Failure to place compiled .class file for the action in the classpath (在web开发中Qclass的的位置在r WEB-INF/classesQ所以你的action class必须要在q个目录下。例如你的actioncM于WEB-INF/classes/action/Login.class,那么在struts-config.xml中设|action的属性type时就是action.Login).
拼写错误Q这个也时有发生Qƈ且不易找刎ͼ特别注意W一个字母的大小写和包的名称?
-----------------------------------------------------------------------------------------------------------------
异常
javax.servlet.jsp.JspException: No getter method for property username of bean org.apache.struts.taglib.html.BEAN
可能原因
没有位form bean中的某个变量定义getter Ҏ
q个错误主要发生在表单提交的FormBean中,用struts标记<html:text property=”username”>Ӟ在FormBean中必L一个getUsername()Ҏ。注意字?#8220;U”?br />
-----------------------------------------------------------------------------------------------------------------
异常
java.lang.NoClassDefFoundError: org/apache/struts/action/ActionForm
可能原因
q个错误主要发生在在classpath中找不到相应的Java .class文g。如果这个错误发生在web应用E序的运行时Q主要是因ؓ指定的class文g不在web server的classpath中(/WEB-INF/classes ?/WEB-INF/libQ。在上面的错误中Q原因是找不到ActionFormcR?br />
-----------------------------------------------------------------------------------------------------------------
异常
javax.servlet.jsp.JspException: Exception creating bean of class org.apache.struts.action.ActionForm: {1}
可能原因
Instantiating Struts-provided ActionForm class directly instead of instantiating a class derived off ActionForm. This mightoccur implicitly if you specify that a form-bean is this Struts ActionForm class rather than specifying a child of this classfor the form-bean.
Not associating an ActionForm-descended class with an action can also lead to this error.
-----------------------------------------------------------------------------------------------------------------
异常
javax.servlet.jsp.JspException: Cannot find ActionMappings or ActionFormBeans collection
可能原因
不是标识Struts actionServlet?lt;servlet>标记是映射.do扩展名的<sevlet-mapping>标记或者两者都没有在web.xml中声明?/p>
在struts-config.xml中的打字或者拼写错误也可导致这个异常的发生。例如缺一个标记的关闭W号/>。最好用struts console工具查一下?/p>
另外Qload-on-startup必须在web.xml中声明,q要么是一个空标记Q要么指定一个数|q个数值用来表servletq行的优先Q数D大优先低?/p>
q有一个和使用load-on-startup有关的是使用Struts预编译JSP文g时也可能Dq个异常?br />
-----------------------------------------------------------------------------------------------------------------
异常
java.lang.NullPointerException at org.apache.struts.util.RequestUtils.forwardURL(RequestUtils.java:1223)
可能原因
在struts-config.xml中的forward元素~少path属性。例如应该是如下形式Q?br />
<forward name="userhome" path="/user/userhome.jsp"/>
-----------------------------------------------------------------------------------------------------------------
异常
javax.servlet.jsp.JspException: Cannot find bean org.apache.struts.taglib.html.BEAN in any scope
Probable Causes
试图在Struts的form标记外用form的子元素。这常常发生在你?lt;/html:form>后面使用Struts的html标记。另外要注意可能你不l意使用的无M的标讎ͼ?lt;html:form … />Q这样web 服务器解析时当作一个无M的标讎ͼ随后使用的所?lt;html>标记都被认ؓ是在q个标记之外的,如又使用?lt;html:text property=”id”>q有是在用taglib引入HTML标记库时Q你使用的prefix的g是html?br />
-----------------------------------------------------------------------------------------------------------------
异常
javax.servlet.jsp.JspException: Missing message for key xx.xx.xx
Probable Causes
q个key的值对没有在资源文件ApplicationResources.properties中定义。如果你使用eclipse时经常碰到这L情况Q当目重新~译Ӟeclipse会自动将classes目录下的资源文g删除?/p>
资源文gApplicationResources.properties 不在classpath中应资源文件放?WEB-INF/classes 目录下,当然要在struts-config.xml中定?
-----------------------------------------------------------------------------------------------------------------
异常
Cannot find message resources under key org.apache.struts.action.MESSAGE
可能原因
很显Ӟq个错误是发生在使用资源文gӞ而Struts没有扑ֈ资源文g?/p>
Implicitly trying to use message resources that are not available (such as using empty html:options tag instead of specifyingthe options in its body -- this assumes options are specified in ApplicationResources.properties file)
XML parser issues -- too many, too few, incorrect/incompatible versions
-----------------------------------------------------------------------------------------------------------------
异常
Strange and seemingly random characters in HTML and on screen, but not in original JSP or servlet.
可能原因
混和使用Struts的html:form标记和标准的HTML标记不正?/p>
使用的编码样式在本页中不支持?br />
-----------------------------------------------------------------------------------------------------------------
异常
"Document contained no data" in Netscape
No data rendered (completely empty) page in Microsoft Internet Explorer
可能原因
使用一个Action的派生类而没有实现perform()Ҏ或execute()Ҏ。在Struts1.0中实现的是perform()ҎQ在Struts1.1中实现的是execute()ҎQ但Struts1.1向后兼容perform()Ҏ。但你用Struts1.1创徏一个Action的派生类Qƈ且实Cexecute()ҎQ而你在Struts1.0中运行的话,׃得到"Document contained nodata" error message in Netscape or a completely empty (no HTML whatsoever) page rendered in Microsoft Internet Explorer.”的错误信息?/p>
---------------------------------------------------------------------------------------------------------------------------
异常
ServletException: BeanUtils.populate
解决Ҏ
在用Struts上传文g?遇到了javax.servlet.ServletException: BeanUtils.populate异常?br />
我的ActionServletq没有用到BeanUtilsq些工具cR后来仔l检查代码发现是在jsp文g里的form忘了加enctype="multipart/form-data" 了。所以写E序遇到错误或异常应该从多方面考虑问题存在的可能性,惛_pȝ提示信息以外的东ѝ?br />
----------------------------------------------------------------------------------------------------------------------------
1. 定义Action? 如果指定了name, 那么必须要定义一个与它同名的FormBean才能q行form映射.2. 如果定义Action? 提交面时出?"No input attribute for mapping path..." 错误, 则需要在其input属性中定义转向的页?3. 如果插入新的数据时出?"Batch update row count wrong:..." 错误, 则说明XXX.hbm.xml中指定的key的类型ؓ原始cd(int, long),因ؓq种cd会自动分配? 而这个值往往会让pȝ认ؓ已经存在该记? 正确的方法是使用java.lang.Integer或java.lang.Long对象.4. 如果插入数据时出?"argument type mismatch" 错误, 可能是你使用了Date{特D对? 因ؓstruts不能自动从String型{换成Date?所? 你需要在Action中手动把String型{换成Date?5. Hibernate? Query的iterator()比list()Ҏ快很?6. 如果出现 "equal symbol expected" 错误, 说明你的strtus标签中包含另一个标{或者变? 例如:
<html:select property="test" onchange="<%=test%>"/>
或?br />
<html:hidden property="test" value="<bean:write name="t" property="p"/>"/>
q样的情?..
---------------------------------------------------------------------------------------------------------------------------
错误QException in thread "main" org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update原因与解冻I 因ؓHibernate ToolsQ或者Eclipse本n的Database ExplorerQ生?.hbn.xml工具中包含有catalog="***"Q?表示数据库名Uͼq样的属?该属性删除就可以?br />
---------------------------------------------------------------------------------------------------------------------------
错误Qorg.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations)
原因与解冻I
Ҏ1 删除Set方的cascade
Ҏ2 解决兌关系后,再删?br />
Ҏ3 在many-to-one方增加cascade 但g能是none
最后一招:
查一下hashCode equals是否使用了id作ؓ唯一标示的选项了;我用uuid.hex时是没有问题的;但是用了nativeQ就不行了,怎么办?删除啊!
----------------------------------------------------------------------------------------------------------------------------
问题Q今天用Tomcat 5.5.12Q发现原来很好用的系l不能用了,反复试发现面中不能包?taglibQ否则会出现以下提示QHTTP Status 500 -type Exception reportMessage description The server encountered an internal error () that prevented it from fulfilling this request.exceptionorg.apache.jasper.JasperException: /index.jsp(1,1) Unable to read TLD "META-INF/tlds/struts-bean.tld" from JAR file"file:*****/WEB-INF/lib/struts.jar":原因Q更C工程用的lib文g夹下的jarQ发布时也发布了servlet.jar和jsp-api.jar。解冻I把jsp-api.jar删除p册个问题了?----------------------------------------------------------------------------------------------------------------------------
错误Q?java.lang.NullPointerException
原因Q?发现 dao 实例?manage 实例{需要注入的东西没有被注入(俗称I指针异常)解决Q这个时候,你应该查看日志文Ӟ默认是应用服务器?log 文gQ比?Tomcat 是 [Tomcat 安装目录 ]/logs Q你会发现提CZQ可能是Qorg.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sf' defined in ServletContextresource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception isorg.hibernate.HibernateException: could not configure from URL: file:src/hibernate.cfg.xmlorg.hibernate.HibernateException: could not configure from URL: file:src/hibernate.cfg.xml……………………….Caused by: java.io.FileNotFoundException: src\hibernate.cfg.xml可能是:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined inServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception isorg.hibernate.MappingException: Resource: com/mcc/coupon/model/UserRole.hbm.xml not foundorg.hibernate.MappingException: Resource: com/mcc/coupon/model/UserRole.hbm.xml not found然后你就知道原因是因为配|文件的解析Z错误Q这个通过 Web 面是看不出来的。更多的是持久化影射文g出的错误Q导致了没有被解析;当然你需要的功能无法用了?br />
----------------------------------------------------------------------------------------------------------------------------
错误QStandardWrapperValve[action]: Servlet.service() for servlet action threw exception
javax.servlet.jsp.JspException: Cannot retrieve mapping for action /settlementTypeManage
或者: type Status report message Servlet action is not available description The requested resource (Servlet action is not available) is not available.
原因Q???br />
----------------------------------------------------------------------------------------------------------------------------
错误StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exceptionjava.lang.ClassNotFoundException: org.apache.struts.taglib.bean.CookieTei界面错误具体描述Q?br />
org.apache.jasper.JasperException: Failed to load or instantiate TagExtraInfo class: org.apache.struts.taglib.bean.CookieTei
原因与解冻I <Ҏ一>你的“html:”开头的标签没有攑֜一?lt;html:form>?nbsp; <Ҏ?gt;重新启动你的应用服务器,自动没有这个问?br />
创徏型模?
1、FACTORY―追MM不了请吃饭了,麦当劳的鸡翅和肯德基的鸡都是MM爱吃的东西,虽然口味有所不同Q但不管你带MM去麦当劳或肯德基Q只向服务员说“来四个鸡?#8221;p了。麦当劳和肯德基是生鸡翅的Factory
工厂模式Q客L和工厂类分开。消费者Q何时候需要某U品,只需向工厂请求即可。消费者无M改就可以接纳C品。缺Ҏ当品修ҎQ工厂类也要做相应的修改。如Q如何创建及如何向客L提供?
2、BUILDER―MM最爱听的就?#8220;我爱?#8221;q句话了Q见C同地方的MM,要能够用她们的方a跟她说这句话哦,我有一个多U语a译机,上面每种语言都有一个按键,见到MM我只要按对应的键Q它p够用相应的语a说出“我爱?#8221;q句话了Q国外的MM也可以轻松搞掂,q就是我?#8220;我爱?#8221;builder。(q一定比军在伊拉克用的译机好卖)
建造模式:品的内部表象和品的生成q程分割开来,从而一个徏造过E生成具有不同的内部表象的品对象。徏造模式得品内部表象可以独立的变化Q客户不必知道品内部组成的l节。徏造模式可以强制实行一U分步骤q行的徏造过E?
3、FACTORY METHOD―请MM去麦当劳吃汉堡,不同的MM有不同的口味Q要每个都记住是一件烦人的事情Q我一般采用Factory Method模式Q带着MM到服务员那儿Q说“要一个汉?#8221;Q具体要什么样的汉堡呢Q让MM直接跟服务员说就行了?
工厂Ҏ模式Q核心工厂类不再负责所有品的创徏Q而是具体创建的工作交给子类dQ成Z个抽象工厂角Ԍ仅负责给出具体工厂类必须实现的接口,而不接触哪一个品类应当被实例化q种l节?
4、PROTOTYPE―跟MM用QQ聊天Q一定要说些深情的话语了Q我搜集了好多肉ȝ情话Q需要时只要copy出来攑ֈQQ里面p了,q就是我的情话prototype了。(100块钱一份,你要不要Q?
原始模型模式Q通过l出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的Ҏ创徏出更多同cd的对象。原始模型模式允许动态的增加或减品类Q品类不需要非得有M事先定的等U结构,原始模型模式适用于Q何的{l构。缺Ҏ每一个类都必配备一个克隆方法?
5、SINGLETON―俺?个漂亮的老婆Q她们的老公都是我,我就是我们家里的老公SigletonQ她们只要说?#8220;老公”Q都是指的同一个hQ那是?刚才做了个梦啦,哪有q么好的?
单例模式Q单例模式确保某一个类只有一个实例,而且自行实例化ƈ向整个系l提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用?
l构型模?/strong>
6、ADAPTER―在朋友聚会上碰C一个美女SarahQ从香港来的Q可我不会说_语Q她不会说普通话Q只好求助于我的朋友kent了,他作为我和Sarah之间的AdapterQ让我和Sarah可以怺交谈?也不知道他会不会耍我)
适配器(变压器)模式Q把一个类的接口变换成客户端所期待的另一U接口,从而原本因接口原因不匚w而无法一起工作的两个c能够一起工作。适配cd以根据参数返q一个合适的实例l客L?
7、BRIDGE―早上碰到MMQ要说早上好Q晚上碰到MMQ要说晚上好Q碰到MMI了件新服Q要说你的服好漂亮哦,到MM新做的发型,要说你的头发好漂亮哦。不要问?#8220;早上到MM新做了个发型怎么?#8221;q种问题Q自qBRIDGEl合一下不p?
桥梁模式Q将抽象化与实现化脱耦,使得二者可以独立的变化Q也是说将他们之间的强兌变成弱关联,也就是指在一个Y件系l的抽象化和实现化之间用组?聚合关系而不是承关p,从而两者可以独立的变化?
8、COMPOSITE―Mary今天q生日?#8220;我过生日Q你要送我一件礼物?#8221;“嗯,好吧Q去商店Q你自己挑?#8221;“qgT恤挺漂亮Q买Q这条裙子好看,乎ͼq个包也不错Q买?#8221;“喂,C三g了呀Q我只答应送一件礼物的哦?#8221;“什么呀QT恤加裙子加包包,正好配成一套呀Q小姐,ȝ你包h?#8221;“……”QMM都会用Composite模式了,你会了没有?
合成模式Q合成模式将对象l织到树l构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树l构表示出来。合成模式得客L把一个个单独的成分对象和׃们复合而成的合成对象同{看待?
9、DECORATOR―Maryq完轮到Sarlyq生日,q是不要叫她自己挑了Q不然这个月伙食费肯定玩完,拿出我去q在华山上照的照片Q在背面写上“最好的的礼物,是׃的Fita”Q再到街上礼品店C个像框(卖礼品的MM也很漂亮哦)Q再N壁搞术设计的Mike设计了一个漂亮的盒子装v?#8230;…Q我们都是DecoratorQ最l都在修饰我q个人呀Q怎么P看懂了吗Q?
装饰模式Q装饰模式以对客L透明的方式扩展对象的功能Q是l承关系的一个替代方案,提供比承更多的灉|性。动态给一个对象增加功能,q些功能可以再动态的撤消。增加由一些基本功能的排列l合而生的非常大量的功能?
10、FACADE―我有一个专业的Nikon相机Q我喜Ƣ自己手动调光圈、快门,q样照出来的照片才专业,但MM可不懂这些,教了半天也不会。幸好相机有Facade设计模式Q把相机调整到自动Q只要对准目标按快门p了,一切由相机自动调整Q这样MM也可以用q个相机l我拍张照片了?
门面模式Q外部与一个子pȝ的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系l更易于使用。每一个子pȝ只有一个门面类Q而且此门面类只有一个实例,也就是说它是一个单例模式。但整个pȝ可以有多个门面类?
11、FLYWEIGHT―每天跟MM发短信,手指都篏dead了,最q买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上MM的名字就可以发送了Q再不用一个字一个字敲了。共享的句子是FlyweightQMM的名字就是提取出来的外部特征Q根据上下文情况使用?
享元模式QFLYWEIGHT在拳L赛中指最轻量U。n元模式以׃n的方式高效的支持大量的细_度对象。n元模式能做到׃n的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部Q不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能媄响内蕴状态,它们是相互独立的。将可以׃n的状态和不可以共享的状态从常规cM区分开来,不可以׃n的状态从c里剔除出去。客L不可以直接创׃n的对象,而应当用一个工厂对象负责创׃n的对象。n元模式大q度的降低内存中对象的数量?
12、PROXY―跟MM在网上聊天,一开头L“hi,你好”,“你从哪儿来呀Q?#8221;“你多大了Q?#8221;“w高多少呀Q?#8221;q些话,真烦人,写个E序做ؓ我的Proxy吧,凡是接收到这些话都设|好了自动的回答Q接收到其他的话时再通知我回{,怎么P酷吧?
代理模式Q代理模式给某一个对象提供一个代理对象,q由代理对象控制Ҏ对象的引用。代理就是一个h或一个机构代表另一个h或者一个机构采取行动。某些情况下Q客户不x者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客L分L不出代理主题对象与真实主题对象。代理模式可以ƈ不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,q时候代理对象不能够创徏被代理对象,被代理对象必Lpȝ的其他角色代为创建ƈ传入?
行ؓ模式
13、CHAIN OF RESPONSIBLEITY―晚上去上英语课Qؓ了好开溜坐C最后一排,哇,前面坐了好几个漂亮的MM哎,扑ּU条Q写?#8220;Hi,可以做我的女朋友吗?如果不愿意请向前?#8221;Q纸条就一个接一个的传上MQ糟p,传到W一排的MM把纸条传l老师了,听说是个老处奛_Q快?
责Q链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接
h形成一条链。请求在q个链上传递,直到链上的某一个对象决定处理此h。客户ƈ不知道链上的哪一个对象最l处理这个请求,pȝ可以在不影响客户端的情况下动态的重新l织铑֒分配责Q。处理者有两个选择Q承担责L者把责Q推给下家。一个请求可以最l不被Q何接收端对象所接受?
14、COMMAND―俺有一个MM安得特别严,没法见面Q只好借助于她弟弟在我们俩之间传送信息,她对我有什么指C,写一张纸条让她弟弟带l我。这不,她弟弟又传送过来一个COMMANDQؓ了感谢他Q我请他吃了杂酱面Q哪知道他说Q?#8220;我同时给我姐姐三个男朋友送COMMANDQ就C最气Q才h吃面?#8221;Q?
命o模式Q命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命o的责d执行命o的责d割开Q委z不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得h的一方不必知道接收请求的一方的接口Q更不必知道h是怎么被接Ӟ以及操作是否执行Q何时被执行以及是怎么被执行的。系l支持命令的撤消?
15、INTERPRETER―俺有一个《MM真经》,上面有各UMM的攻略,比如说去吃西的步骤、去看电qҎ{等Q跟MMU会Ӟ只要做一个InterpreterQ照着上面的脚本执行就可以了?
解释器模式:l定一个语a后,解释器模式可以定义出其文法的一U表C,q同时提供一个解释器。客L可以使用q个解释器来解释q个语言中的句子。解释器模式描q怎样在有了一个简单的文法后,使用模式设计解释q些语句。在解释器模式里面提到的语言是指M解释器对象能够解释的Ml合.
我们在做一些查询的时候d望能避免数据库引擎做全表扫描Q因为全表扫描时间长Q而且其中大部分扫描对客户端而言是没有意义的。那么在 MySQL 中有那些方式是可以避免全表扫面的呢?除了我们大家很熟悉的通过使用索引列或分区{方式来q行查询的优化之外还有那些呢Q?/span>
前些天看了一个老外写的E序Q在 MySQL 查询中用了很多 Limit 关键字,q就让我很感兴趣了,因ؓ在我印象中, Limit 关键字似乎更多被使用 MySQL 数据库的E序员用来做查询分页Q当然这也是一U很好的查询优化Q,那在q里举个例子Q假设我们需要一个分늚查询 QOracle中一般来说都是用以下 SQL 句子实现Q?/span>
SELECT * FROM
( SELECT a1.*, rownum rownum_
FROM testtable a1
WHERE rownum > 20)
WHERE rownum_ <= 1000
q个语句p查询?/span> testtable 表中?/span> 20 ?/span> 1000 记录Q而且q需要嵌套查询,效率不会太高Q看?/span> MySQL 的实玎ͼ
SELECT * FROM testtable a1 limit 20,980;
q样pq回 testtable 表中?/span> 21 条到Q?/span> 20 Q?/span> 980 Q) 1000 条的记录?/span>
实现语法实单,但如果要说这里两?/span> SQL 语句的效率,那就很难做比较了Q因为在 MySQL ?/span> Limit 选项有多U不同的解释方式Q不同方式下的速度差异是很大的Q因此我们不能从q语句的z程度就说谁的效率高?/span>
不过对程序员来说Q够单就好,因ؓl护成本低,呵呵?/span>
下面讲讲q个 Limit 的语法吧Q?/span>
SELECT ……. --Select 语句的其他参?/span>
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
q里 offset 是偏U量Q这个偏U量的v始地址?/span> 0 Q而不?/span> 1 Q这点很Ҏ搞错的)思义是d起始点的位置Q?/span> row-count 也是很简单的Q就是返回的记录的数量限制?/span>
Eg. SELECT * FROM testtable a limit 10,20 where ….
q样p使结果返?/span> 10 行以后(包括 10 行自w)的符?/span> where 条g?/span> 20 条记录?/span>
那么如果没有U束条gp?/span> 10 ?/span> 29 行的记录?/span>
那这跟避免全表扫描有什么关pdQ?/span> 下面?/span> MySQL 手册?/span> Limit 参数优化扫描的一些说明:
在一些情况中Q当你?/span> LIMIT 选项而不是?/span> HAVING Ӟ MySQL 以不同方式处理查询?/span>
l 如果你用 LIMIT 只选择其中一部分行,?/span> MySQL 一般会做完整的表扫描时Q但在某些情况下会用烦引(?/span> ipart 有关Q?/span>
l 如果你将 LIMIT n ?/span> ORDER BY 同时使用Q在 MySQL 扑ֈ了第一个符合条件的记录后,结束排序而不是排序整个表?/span>
l ?/span> LIMIT n ?/span> DISTINCT 同时使用Ӟ MySQL 在找C个记录后停止查询?/span>
l 某些情况下, GROUP BY 能通过序d?/span> ( 或在键上做排?/span> ) 来解冻Iq然后计摘要直到键值改变。在q种情况下, LIMIT n 不计算M不必要的 GROUP ?/span>
l ?/span> MySQL 完成发送第 n 行到客户端,它将攑ּ余下的查询?/span>
l ?/span> LIMIT 0 选项L快速返回一个空记录。这Ҏ查查询ƈ且得到结果列的列cd是有用的?/span>
l 临时表的大小使用 LIMIT # 计算需要多空间来解决查询?br />
如果需要在查询语句q回的列中包含一列表C条记录在整个l果集中的行P ISO SQL:2003 标准提出的方法是提供 ROW_NUMBER() / RANK() 函数?Oracle 中可以用标准方法(8i版本以上Q,也可以用非标准?ROWNUM Q?MS SQL Server 则在 2005 版本中提供了 ROW_NUMBER() 函数Q但?MySQL 中似乎还没有q样的系l自带功能。虽?LIMIT 可以很方便的对返回的l果集数量和位置q行qoQ但qo出来的记录的行号却没办法?SELECT 到?/span>据说 MySQL 是早想增加q个功能了,但我是还没找到?/span>
解决Ҏ是通过预定义用户变?/span>来实玎ͼ
set @mycnt = 0;
select (@mycnt := @mycnt + 1) as ROWNUM , othercol from tblname order by othercol;
q样查询出来的结果集?ROWNUM ׃存了行编号信息。这个行~号信息的某U用途在于当你需要根据需要对数据按照某种规则排序q取出排序之后的某一行数据,q且希望知道q行数据在之前排序中的位|时q得着了。比如:
set @mycnt = 0;
select * from (
select (@mycnt := @mycnt + 1) as ROWNUM , othercol
from tblname order by othercol
) as A where othercol=OneKeyID;
当然你也可以通过创徏临时表的Ҏ把查询结果写到某个拥?auto_increment 字段的时表中再做查询,但考虑C时表?MySQL master / slave 模式下可能生的问题Q用q样临时用户定义变量的方式来计算查询l果集每一行对应的行号q是更ؓz?-- 除非你愿意在 PHP 或其他语a脚本中对q回的整个结果集再作处理?/span>
Eclipse3.2
MyEclipse5.5.1GA
JDK1.5
创徏一?/span>WEB Service工程XFireQ按照网上的实例开发了一个简单的HelloWorldE序Q发布到TOMCAT一?/span>OK?/span>
客户端用XFire插g开发(比较方便Q,需要先下蝲插gQ步骤如下:
打开Eclipse?/span>Help菜单Q选择”Software Updates”Q然后再选择”Find and Install.”
选择"Search for new features to install"Q然后点?/span>Next
选择"Create New Remote Site"Q?/span> ?/span>name中输?/span>"XFire"Q在eclipse update site中输?/span>
http://dist.codehaus.org/xfire/update/
选择OK
选择Finish?/span>
2、新Z?/span>java project。命名ؓ“Client”Q其他默认,finish?/span>
3?/span>File->New->Other Q选择“XFire”文g夹下?#8220;Code generation from WSDL document”Q打开代码生成向导Q?/span>
WSDL的地址栏填?/span>http://localhost:8080/XFire/services/HelloWorldService?wsdlQ?/span>Output directory栏中Ҏ览按钮,选择我们刚才新徏的项?/span>ClientQ这两项是必填的。可选项中,package一栏可以选已l存在的包名Q如果不填这一,代码生成器会?/span>wsdl目标命名I间的基上创Z个?/span>
完成后,可以看到目中多?/span>XFirecdQ还?/span>package下面的生成的一些类。此时要保证IDE?/span>Tomcat服务器是打开的?/span>
此时Q在调用服务之前Q还有一个重要的步骤Q从XFireProject目的右键菜单里调出Properties配置H口Q选中左面一栏中?/span>XFire,右面会列出所有与XFireq行有关的类库,按列表中所C的Q选中一些类库,q些cd在调用本服务时是必须的?br />
Commons Codec(commons-codec-1.3.jar)
Commons HttpClient(commons-httpclient-3.0.jar)
如果~少q两?/span>JAR文gQ客L在调?/span>WEB 服务时会出错?/span>
?/span>Tomcat5.0下正常发布,客户端也能正常调用。然而在发布?/span>WebSphere5.1(base)上面Ӟ出C一些列问题Q下面是问题单描qͼ只截取了LOG中部分信息)以及解决q程?/span>
[08-5-14 7:02:31:500 GMT] 2a29c7a6 XFireServlet E org.codehaus.xfire.transport.http.XFireServlet TRAS0014I: 下列异常已记?/span> org.springframework.beans.factory.BeanDefinitionStoreException: Error registering bean with name 'xfire.typeMappingRegistry' defined in class path resource [org/codehaus/xfire/spring/xfire.xml]: Class that bean class [org.codehaus.xfire.aegis.type.DefaultTypeMappingRegistry] depends on not found; nested exception is java.lang.NoClassDefFoundError: org/codehaus/xfire/aegis/type/DefaultTypeMappingRegistry
java.lang.NoClassDefFoundError: org/codehaus/xfire/aegis/type/DefaultTypeMappingRegistry
[08-5-14 7:02:31:531 GMT] 2a29c7a6 ServletInstan E SRVE0100E: 未识别出?/span> servlet XFireServlet 抛出?/span> init() 异常Q?/span>javax.servlet.ServletException: Error initializing XFireServlet.
at org.codehaus.xfire.transport.http.XFireServlet.init(XFireServlet.java:52)
[08-5-14 7:02:31:531 GMT] 2a29c7a6 WebGroup E SRVE0020E: Q?/span>Servlet 错误Q-Q?/span>XFireServletQ:无法装入 servletQ?/span>org.springframework.beans.factory.BeanDefinitionStoreException: Error registering bean with name 'xfire.typeMappingRegistry' defined in class path resource [org/codehaus/xfire/spring/xfire.xml]: Class that bean class [org.codehaus.xfire.aegis.type.DefaultTypeMappingRegistry] depends on not found; nested exception is java.lang.NoClassDefFoundError: org/codehaus/xfire/aegis/type/DefaultTypeMappingRegistry
java.lang.NoClassDefFoundError: org/codehaus/xfire/aegis/type/DefaultTypeMappingRegistry
[08-5-14 7:02:31:547 GMT] 2a29c7a6 WebGroup E SRVE0026E: Q?/span>Servlet 错误Q-Q?/span>XFireServletQ:org.springframework.beans.factory.BeanDefinitionStoreException: Error registering bean with name 'xfire.typeMappingRegistry' defined in class path resource [org/codehaus/xfire/spring/xfire.xml]: Class that bean class [org.codehaus.xfire.aegis.type.DefaultTypeMappingRegistry] depends on not found; nested exception is java.lang.NoClassDefFoundError: org/codehaus/xfire/aegis/type/DefaultTypeMappingRegistry
java.lang.NoClassDefFoundError: org/codehaus/xfire/aegis/type/DefaultTypeMappingRegistry
上述问题出现后开始在|上大肆查找资料Q中间替换过WebSphere?/span>lib里面的几个包Q报的错误虽然有所变化Q但仍然不能清除。最后觉得是否与JDK版本有关Q因为在WebSphere启动日志里看?/span>WebSphere用的JDK版本?/span>1.4.1Q而我所开发的XFire工程?/span>JDK1.5,因此军_?/span>XFire工程?/span>JDK包换?/span>1.4然后?/span>1.4版本重新~译Q然后导?/span>WAR包重新在WebSphere中发布?/span>
先将WebSphere下的lib包恢复到原来状态(因ؓ中间替换q几个包Q重新发?/span>1.4版本后,错误依旧Q好吧,开始替?/span>WebSphere下的包:
1?span style="font: 7pt 'Times New Roman'">
先将WebSphere下的lib包中?/span>qname.jar包替换ؓ最新版本?/span>2?span style="font: 7pt 'Times New Roman'">
?/span>WebSphere下的lib包中?/span>jdom.jar替换?/span>jdom-1.0.jar.3?span style="font: 7pt 'Times New Roman'">
?/span>WebSphere下的lib包中?/span>wsdl4j.jar包替换ؓwsdl4j-1.5.1.jar(本来替换?/span>xfire-1.2.6?/span>lib里面?/span>wsdl4j-1.6.1.jarQ但替换完之后服务v不来了,其他版本的没试,在网上看到好像说wsdl4j-1.5.1解决了之前版本的什?/span>BUG.)4?span style="font: 7pt 'Times New Roman'">
?/span>WebSphere下的lib包中dQ?/span>stax-api-1.0.1.jar?/span>jaxen-1.1-beta-9.jar两个包。(q有说需要添?/span>stax-untils-20040917.jar,不过好像不添加也没问题。这些包?/span>xfire-1.2.6?/span>lib里面都有。)重新启动服务器,我们l于可以看到盼望已久?/span>wsdl描述面?/span>
然后测试客LQ注?/span>XFire插g开发客LE序好像必须使用JDK1.5Q低版本好像不支持。(记得在工E属性里?/span>JDK换成1.5后,然后?/span>Java Compiler中选中“Enable project specific settings”Q然后在下面?#8220;Compiler compliance level选中5.0”Q然后点Apply->ok,重新~译一下)Q好Q编写一个测试类Q运行就可以看到我们惌得到?/span>HelloWorld了?/span>
ȝQ注?/span>JDK版本是否冲突。注?/span>WebSphere下的lib中的包是否和目中的包冲H以及包是否全?/span>