?? java
字號:
1. Java編譯運行問題
2. Object操作容易出現NullPointException錯誤
3. 多余處理語句
4. 參數傳遞問題
5. 例外處理
6. 數據庫操作的問題
7. index越界
8. 其它
9. 有待討論的問題
1.Java編譯運行問題
Java程序文件首先得編繹成字節碼的class文件, 然后通過JVM來運行。 Java之所以具有平臺無關性, 是因為Sun幾乎為大部分的操作系統提供了JVM(Java虛擬機), 這樣我們只要用統一的API而不用關心底層系統。
在使用Java的初期, 遇到最多的問題恐怕就是java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError,這主要是classpath設置不對的問題, 類似于C/C++里面的動態鏈接庫, 如果你的source里面使用了其它package的API, 這樣你在編繹和運行的時候都得將它設置到classpath里面去, 設置的時候可以指向一個目錄, 一般為含有所需要的classes的目錄, 或者指向一個jar或zip文件, 它們則是classes的打包的文件。如:
set classpath=C:\jdk1.3.1\lib\tools.jar;D:\Develop\CSC\class
在windows command下面運行
set classpath
可以查看當前已經設置的classpath, 如果想追加設置運行:
set classpath=%classpath%;c:\bea\wlserver6.1\lib\weblogic.jar;
如果用命令行來進行編繹運行的話, 得要將jdk的path設置一下。 如:
set path=C:\jdk1.3.1\bin;%path%
當然如果你不嫌麻煩可以指定全路徑:
C:\jdk1.3.1\bin\javac yourOwn.java
C:\jdk1.3.1\bin\java yourOwn
Classpath也可以在編繹運行的時候進行指定。 如:
javac ?Cclasspath %MY_CLASSPATH% yourOwn.java
java ?Cclasspath %MY_CLASSPATH% yourOwn
一般來說, JVM運行的時候有缺省load的classes, 可以運行java ?Cverbose進行查看, 一般是%JDK_HOME%\jre\lib下面的i18n.jar與rt.jar等, 如果將你的jar文件放到這個目錄下面的ext目錄下面去, 則不用指定它, JVM會自動load這些jar的。
另外需要注意的是, 運行Class的時候是用這個類的Class全名,即包含它的Package名, 如有一個類聲明如下:
package cn.com.sunjapan.util
public class StringUtil {
public static void main(String[] args) {
System.out.println(“Hello World”);
}
}
你運行的時候得要用
java cn.com.sunjapan.util.StringUtil
而不能用java StringUtil否則會出java.lang.NoClassDefFoundError。
2.Object操作容易出現NullPointException錯誤
這種錯誤恐怕是編程初期最容易犯的錯誤。 Java是面向對象的語言, 操作幾乎都是在對象之間進行的, 一個類的實例如果是空(null)的話則不能調用這個實例的方法, 否則就會出java.lang.NullPointException錯誤。 最常見的String的操作, 如:
String str = null;
if (str.equals(“Hello”)) {
System.out.println(“str is Hello”);
}
常用的避免方法就是在使用一個Object之前要判斷一下是否為null, 除非你確定它肯定是不為null的。 接上例修改如下:
String str = null;
if (str !=null && str.equals(“Hello”)) {
System.out.println(“str is Hello”);
}
對于String的這種equals或equalsIgnoreCase的操作常常還可以用下面的方法進行安全操作:
String str = null;
if (“Hello”.equals(str)) {
System.out.println(“str is Hello”);
}
用一個確定的不為null的String去與未知的String進行比較。
3.多余處理語句
這種問題當然不只是java才有的, 任何程序都有可能出現多余的垃圾, 盡管它的最終結果是正確的, 我們在寫程序的時候要盡可能避免這種不必要的處理。
常見的情況有以下幾種:
3.1多余的實例構造
聲明了一個對象的實例, 有的人喜歡同時new一下,即給它分配了空間, 而在后面并沒用到分配的空間, 而是進行了其它的操作,例:
ArrayList resultList = new ArrayList();
try {
resultList = SomeModule.getResultList();
} catch (Exception e) {
return null;
}
…
resultList在聲明的時候同時給它分配了空間, 但在下面卻用它指向了另外返回的地址。 雖然在寫Java程序的時候我們不用考慮內存的分配等令人頭疼的問題, Java有自己的一套內存管理機制, 但Java在對象的構造的時候開銷是很大的, 所以諸如此類的浪費效率的處理還是得要注意避免。
3.2循環多余
我們經常會從一個數組或Collection中通過循環來找出一個符合條件的元素進行操作, 而在執行完之后往往會忘記跳出循環體。 例:
String[] week = new String[]{“Sun”, “Mon”, “Tue”, “Wen”, “Thu”, “Fri”, “Sat”};
for (int i = 0; i < week.length; i++) {
if (week.equals(“Tue”)) {
System.out.println(“Tue is found”);
}
}
如果上面這段程序只是找出week中是否有Tue的話,則在找到之后應該跳出循環體, 正確的寫法如下:
for (int i = 0; i < week.length; i++) {
if (week.equals(“Tue”)) {
System.out.println(“Tue is found”);
break; (或有可能 return)
}
}
…
循環處理的原則就是在處理完畢的地方跳出。
3.3 重復語句
建議如果有兩個或兩個以上的地方需要用到相同的程序塊代碼, 就要考慮到使用函數, 如果一個功能塊比較獨立, 有可能在其它被調用, 這個時候也盡可能的使用方法獨立開來。
還有種情況就是在條件分支語句里面, 各個分支都需要執行某個相同的語句, 這個時候就需要提到分支的外面去執行,下面給出幾個例子:
Ø 使用方法
public void someMethod1() {
…
String str = “This is a sample”;
// 對str進行一定的處理, 返回一個新的str
if (str != null) {
str = …;
}
…
}
public void someMethod2() {
…
String str = “This is a sample”;
// 對str進行一定的處理, 返回一個新的str
if (str != null) {
str = …;
}
…
}
藍色字體部分的功能就可以使用一個獨立的方法完成, 這樣在兩個地方中調用同一個方法就可以了。 在后期的維護等方面都有幫助, 不用到處去找。改寫如下:
public void someMethod1() {
…
String str = “This is a sample”;
str = getSomeStr(str);
…
}
public void someMethod2() {
…
String str = “This is a sample”;
str = getSomeStr(str);
…
}
/**
* 對str進行一定的處理, 返回一個新的str
*/
private String getSomeStr(String str) {
if (str != null) {
str = …;
}
return str;
}
Ø 語句合并
…
if (expression1) {
…
someStatement;
} else if (expression2) {
…
someStatement;
} else {
…
someStatement;
}
…
或
switch (flag) {
case result1:
…
someStatement;
break;
case result2:
…
someStatement;
break;
default:
…
someStatement;
break;
藍色字體部分為在每個條件分支都會執行到的部分, 這樣就大不必寫在每個分支里面, 而是調到條件語句外面統一調用, 改寫如下:
…
if (expression1) {
…
} else if (expression2) {
…
} else {
…
}
someStatement;
…
或
switch (flag) {
case result1:
…
break;
case result2:
…
break;
default:
…
break;
}
someStatement;
4. 參數傳遞問題
4.1 一般對象傳遞
調用一個方法需要傳遞參數的時候, 如果參數為一個對象, 則缺省的是按照地址進行傳遞的, 類似于C/C++里面的指針, Java稱之為”句柄”。 例:
public class TestPassParam {
public SomeClass param = new SomeClass();
public void processParam(SomeClass newParam) {
System.out.println(newParam == param);
}
public static void main(String[] args) {
TestClassParam testClassParam = new TestClassParam();
TestClassParam.processParam(testClassParam.param);
}
}
結果應該返回true; 因為它們指向同一個句柄, 即地址相同。 如果參數是基本數據類型, 則是按照值傳遞, Java沒有象C那樣的引用傳遞。
看下例:
private SomeActionFORM processActionFORM(SomeActionFORM myFORM) {
SomeActionFORM otherFORM = myFORM;
otherFORM…..
…;
return otherFORM;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -