您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關(guān)java常范的幾種錯誤,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
1、空指針錯誤
在java數(shù)組的使用中,有時候需要對字符串?dāng)?shù)組中的元素進行對比。那么當(dāng)元素不為null時,程序會正常運行;然而,一旦對比的元素為null,那么程序就會出現(xiàn)空指針錯誤。
解決方法:加入保護,當(dāng)元素不為null時在進行判斷。
public static void main(Sring[] args){ String [] sums = "adfafA"; for(int i=0;i<sums.length;i++){ if(sums[]!=null && sums[i].equals(sr)){ System.out.println("找到元素"+sums[i]); break; } } }
2、數(shù)據(jù)的精度范圍與類型轉(zhuǎn)換
在Java中有4種基礎(chǔ)類型數(shù)據(jù):
整型: -1 2 3 4 ……
浮點型:float 1.3f ; double 3.2 3.5d (未標(biāo)明類型,默認最高精度)
字符型:采用Unicode編碼,2字節(jié)
布爾型:true、false
四種基礎(chǔ)類型數(shù)據(jù)的精度范圍各不相同,逐級提升。
如果在使用數(shù)據(jù)類型時,不注意精度范圍,就會出現(xiàn)數(shù)據(jù)溢出,從而發(fā)生計算錯誤。
四種基礎(chǔ)類型中,整型,浮點型和字符型數(shù)據(jù)是可以相互轉(zhuǎn)化的。
轉(zhuǎn)換規(guī)則如下:
①隱形轉(zhuǎn)換:精度小的數(shù)據(jù)值,賦值給精度大的值,可以自動轉(zhuǎn)換。(低級向高級)
②強制轉(zhuǎn)換:范圍大的數(shù)據(jù)值,(高級到低級)
③運算自動提升規(guī)則:運算中,自動轉(zhuǎn)換為精度高的數(shù)據(jù)類型。
3、三種循環(huán)的使用
①for 循環(huán):是一種有限次數(shù)的循環(huán),在循環(huán)前,規(guī)定好循環(huán)次數(shù)。
for(表達式;表達式;表達式){ 循環(huán)體 }
break語句:執(zhí)行后,立即跳出循環(huán),不在執(zhí)行后面的語句,且結(jié)束所有循環(huán)。
continue 語句:執(zhí)行后,立即跳出當(dāng)前單詞循環(huán),重新判斷條件是否繼續(xù)循。
②While循環(huán)語句:適合未知次數(shù)的循環(huán)。
while(條件表達式){ 語句 };
③do-While循環(huán):也是未知次數(shù)的循環(huán)。單至少要先執(zhí)行一次do,在判斷。如果while成立,繼續(xù)循環(huán),反之,結(jié)束循環(huán)。
do { 語句 }while(條件表達式);
4、多次拷貝字符串
測試所不能發(fā)現(xiàn)的一個錯誤是生成不可變(immutable)對象的多份拷貝。不可變對象是不可改變的,因此不需要拷貝它。最常用的不可變對象是String。
如果你必須改變一個String對象的內(nèi)容,你應(yīng)該使用StringBuffer。下面的代碼會正常工作:
String s = new String ("Text here");
但是,這段代碼性能差,而且沒有必要這么復(fù)雜。你還可以用以下的方式來重寫上面的代碼:
String temp = "Text here"; String s = new String (temp);
但是這段代碼包含額外的String,并非完全必要。更好的代碼為:
String s = "Text here";
5、沒有克隆(clone)返回的對象
封裝(encapsulation)是面向?qū)ο缶幊痰闹匾拍睢2恍业氖?,Java為不小心打破封裝提供了方便——Java允許返回私有數(shù)據(jù)的引用(reference)。下面的代碼揭示了這一點:
import java.awt.Dimension; /***Example class.The x and y values should never*be negative.*/ public class Example{ private Dimension d = new Dimension (0, 0); public Example (){ } /*** Set height and width. Both height and width must be nonnegative * or an exception is thrown.*/ public synchronized void setValues (int height,int width) throws IllegalArgumentException{ if (height <0 || width <0) throw new IllegalArgumentException(); d.height = height; d.width = width; } public synchronized Dimension getValues(){ // Ooops! Breaks encapsulation return d; } }
Example類保證了它所存儲的height和width值永遠非負數(shù),試圖使用setValues()方法來設(shè)置負值會觸發(fā)異常。不幸的是,由于getValues()返回d的引用,而不是d的拷貝,你可以編寫如下的破壞性代碼:
Example ex = new Example(); Dimension d = ex.getValues(); d.height = -5; d.width = -10;
現(xiàn)在,Example對象擁有負值了!如果getValues() 的調(diào)用者永遠也不設(shè)置返回的Dimension對象的width 和height值,那么僅憑測試是不可能檢測到這類的錯誤。
不幸的是,隨著時間的推移,客戶代碼可能會改變返回的Dimension對象的值,這個時候,追尋錯誤的根源是件枯燥且費時的事情,尤其是在多線程環(huán)境中。
更好的方式是讓getValues()返回拷貝:
public synchronized Dimension getValues(){ return new Dimension (d.x, d.y); }
6、拷貝錯誤的數(shù)據(jù)
有時候程序員知道必須返回一個拷貝,但是卻不小心拷貝了錯誤的數(shù)據(jù)。由于僅僅做了部分的數(shù)據(jù)拷貝工作,下面的代碼與程序員的意圖有偏差:
import java.awt.Dimension; /*** Example class. The height and width values should never * be negative. */ public class Example{ static final public int TOTAL_VALUES = 10; private Dimension[] d = new Dimension[TOTAL_VALUES]; public Example (){ } /*** Set height and width. Both height and width must be nonnegative * or an exception will be thrown. */ public synchronized void setValues (int index, int height, int width) throws IllegalArgumentException{ if (height <0 || width <0) throw new IllegalArgumentException(); if (d[index] == null) d[index] = new Dimension(); d[index].height = height; d[index].width = width; } public synchronized Dimension[] getValues() throws CloneNotSupportedException{ return (Dimension[])d.clone(); } }
這兒的問題在于getValues()方法僅僅克隆了數(shù)組,而沒有克隆數(shù)組中包含的Dimension對象,因此,雖然調(diào)用者無法改變內(nèi)部的數(shù)組使其元素指向不同的Dimension對象,但是調(diào)用者卻可以改變內(nèi)部的數(shù)組元素(也就是Dimension對象)的內(nèi)容。方法getValues()的更好版本為:
public synchronized Dimension[] getValues() throws CloneNotSupportedException{ Dimension[] copy = (Dimension[])d.clone(); for (int i = 0; i // NOTE: Dimension isn’t cloneable. if (d != null) copy[i] = new Dimension (d[i].height, d[i].width); } return copy; }
在克隆原子類型數(shù)據(jù)的多維數(shù)組的時候,也會犯類似的錯誤。原子類型包括int,float等。簡單的克隆int型的一維數(shù)組是正確的,如下所示:
public void store (int[] data) throws CloneNotSupportedException{ this.data = (int[])data.clone(); // OK }
拷貝int型的二維數(shù)組更復(fù)雜些。Java沒有int型的二維數(shù)組,因此一個int型的二維數(shù)組實際上是一個這樣的一維數(shù)組:它的類型為int[]。簡單的克隆int[][]型的數(shù)組會犯與上面例子中g(shù)etValues()方法第一版本同樣的錯誤,因此應(yīng)該避免這么做。下面的例子演示了在克隆int型二維數(shù)組時錯誤的和正確的做法:
public void wrongStore (int[][] data) throws CloneNotSupportedException{ this.data = (int[][])data.clone(); // Not OK! } public void rightStore (int[][] data){ // OK! this.data = (int[][])data.clone(); for (int i = 0; i if (data != null) this.data[i] = (int[])data[i].clone(); } }
關(guān)于java常范的幾種錯誤就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。