我用的eclipse
版本是3.1.1
的英文版。假設(shè)源程序是這樣:
package c08;
publicclass StrSortVector {
private Vector v = new Vector();
Compare compare = new Compare();
class Compare {
publicboolean lessThan(Object l, Object r) {
return ((String) l).toLowerCase().compareTo(
((String) r).toLowerCase()) < 0;
}
publicboolean lessThanOrEqual(Object l, Object r) {
return ((String) l).toLowerCase().compareTo(
((String) r).toLowerCase()) <= 0;
}
}
privatebooleansorted = false;
publicvoid addElement(String s) {
v.addElement(s);
sorted = false;
}
public String elementAt(int index) {
if (!sorted) {
sort();
sorted = true;
}
return (String) v.elementAt(index);
}
public Enumeration elements() {
if (!sorted) {
sort();
sorted = true;
}
returnv.elements();
}
publicvoid sort() {
quickSort(0, v.size() - 1);
System.out.println("size=" + (v.size() - 1));
}
privatevoid quickSort(int left, int right) {
if (right > left) {
Object o1 = elementAt(right);
int i = left - 1;
System.out.println("i=" + i);
int j = right;
System.out.println("j=" + j);
while (true) {
while (compare.lessThan(elementAt(++i), o1))
;
while (j > 0)
if (compare.lessThanOrEqual(elementAt(--j), o1))
break; // out of while
if (i >= j)
break;
swap(i, j);
}
swap(i, right);
quickSort(left, i - 1);
quickSort(i + 1, right);
}
}
privatevoid swap(int loc1, int loc2) {
Object tmp = elementAt(loc1);
v.setElementAt(elementAt(loc2), loc1);
v.setElementAt(tmp, loc2);
}
// Test it:
publicstaticvoid main(String[] args) {
StrSortVector sv = new StrSortVector();
sv.addElement("d");
sv.addElement("A");
sv.addElement("C");
sv.addElement("c");
sv.addElement("b");
sv.addElement("B");
sv.addElement("D");
sv.addElement("a");
Enumeration e = sv.elements();
while (e.hasMoreElements())
e.nextElement();
}
}// /:~
為了容易看,所以先要ctrl+shift+f格式化一下。有紅叉號(hào),懷疑有什么沒導(dǎo)進(jìn)來,于是ctrl+shift+o來import 一下。值得一提的是ctrl+shift+o執(zhí)行的是組織導(dǎo)入( organize import),就是說缺少導(dǎo)入,可以自動(dòng)添加;有無(wú)用導(dǎo)入,可以自動(dòng)刪除。
好了,編譯通過了。
代碼中的方法有點(diǎn)亂是吧。試著來將代碼整理一下,鼠標(biāo)放在代碼上,
首先我想進(jìn)行代碼重構(gòu)。
將下面這段代碼選中:
class Compare {
publicboolean lessThan(Object l, Object r) {
return ((String) l).toLowerCase().compareTo(
((String) r).toLowerCase()) < 0;
}
publicboolean lessThanOrEqual(Object l, Object r) {
return ((String) l).toLowerCase().compareTo(
((String) r).toLowerCase()) <= 0;
}
}
右鍵點(diǎn)擊refactor - -Convert Member Type To Top Level。在彈出的對(duì)話框里輸入抽出的類的名稱Compare,OK即可。
我還想將類Compare中的方法中提取出接口,于是:將要提取的方法選中,右鍵單擊extract Interface。輸入接口名ICompare,在要提取的方法名上打勾,OK.
鼠標(biāo)放在代碼上,右鍵點(diǎn)擊run as Java Application .運(yùn)行報(bào)錯(cuò)。錯(cuò)誤信息如下:Exception in thread "main" java.lang.StackOverflowError
at c08.StrSortVector.sort(StrSortVector.java:35)
at c08.StrSortVector.quickSort(StrSortVector.java:41)
at c08.StrSortVector.elementAt(StrSortVector.java:20)
點(diǎn)擊控制臺(tái)上的(StrSortVector.java:35)鏈接,找到出錯(cuò)的地方。
public Enumeration elements() {
if (!sorted) {
sort();
sorted = true;
}
returnv.elements();
}
這個(gè)方法里的quickSort(0, v.size() - 1);出錯(cuò)了。Ctrl+/將其注釋掉。運(yùn)行通過了,可是沒有結(jié)果。將程序改一下,將結(jié)果打印:main函數(shù)里最后一句e.nextElement();前加Sy然后按alt+/,可以自動(dòng)補(bǔ)全為System然后打 . 最終打出System.out.println(e.nextElement());
運(yùn)行一下,發(fā)現(xiàn)結(jié)果只是把數(shù)據(jù)原樣輸出。這個(gè)類是要實(shí)現(xiàn)排序的。所以alt+←返回歷史紀(jì)錄。把注釋掉內(nèi)容再按一次alt+/打開。
既然quickSort(0, v.size() - 1);這個(gè)方法有錯(cuò)誤,就選中quickSort按住alt鍵轉(zhuǎn)到此方法,在錯(cuò)誤提示里說(StrSortVector.java:41)有錯(cuò),這正好是在quickSort方法中,看來是同一個(gè)錯(cuò)誤,此行Object o1 = elementAt(right);又調(diào)用一個(gè)方法。選中elementAt按住ctrl轉(zhuǎn)到這個(gè)方法中,StrSortVector.java:20
正好在此方法中,看來提示根本都是一個(gè)錯(cuò)誤。20行sort();有錯(cuò),將其注釋掉。運(yùn)行通過,結(jié)果按字母排序完成。
其實(shí)一般喜歡用debug來查找錯(cuò)誤。但當(dāng)把debug關(guān)了,就會(huì)找不到代碼文件原來的位置。此時(shí)可以在代碼上右健點(diǎn)擊Show In - -navigator。就可以定位此文件了。
posted on 2008-03-01 11:42
靜兒 閱讀(2642)
評(píng)論(4) 編輯 收藏 所屬分類:
技術(shù)