當前位置:
首頁 > 知識 > java學習:你知道嗎?Java常見的幾大代碼

java學習:你知道嗎?Java常見的幾大代碼



java學習:你知道嗎?Java常見的幾大代碼



1、在靜態方法中訪問非靜態的成員變數(例如在main方法中)


有很多剛剛接觸Java的程序遠都會有一問題,就是在main方法中訪問成員變數。Main方法一般都被標示為「靜態的」,意思就是我們不需要實例化這個類來調用main方法。例如,java虛擬機能夠以這樣的形式來調用MyApplication類:


MyApplication.main(命令行參數);

這裡並沒有實例化MyApplication類,或者這裡沒有訪問任何的成員變數。例如下面的程序就會產生一個編譯器的錯誤。


public class StaticDemo


{


public String my_member_vaiable = "somedata";


public static void main (String args[])


{


// Access a non-satic member from static method


my_member_variable);


}


}

如果你要訪問一個靜態方法中的成員變數(比如main方法),你就需要實例化一個對象。下面這段代碼示例了如何正確的訪問一個非靜態的成員變數。其方法就是首先實例化一個對象。


public class NonStaticDemo


{


public String my_member_variable = "somedata";


public static void main (String args[])


{


NonStaticDemo demo = new NonStaticDemo();


// Access member variable of demo


demo.my_member_variable);


}

}


2、在重載的時候錯誤的鍵入方法名重載允許程序員用新的代碼去覆蓋方法的實現


重載是一個便利的特性,很多面對對象的程序員都在大量的使用它。如果你使用AWT1.1的時間處理模型,你通常會覆蓋listener方法去實現定製的功能。一個在重載方法的時候很容易犯的錯誤就是錯誤的鍵入要重載的方法名。如果你錯誤的輸入了方法名,你就不是在重載這個方法了。相反的,你是在重新定義一個方法,只不過這個方法的參數和返回類型和你要重載的方法相同罷了。


public class MyWindowListener extends WindowAdapter {


// This should be WindowClosed


public void WindowClose(WindowEvent e) {


// Exit when user closes window


System.exit(0);


}


}

這個方法不會通過編譯,很容易就能捕捉找它。在過去我曾經注意過一個方法,並且相信它是被調用的,花了很多時間去找這個錯誤。這個錯誤的表現就是你的方法不會被調用,你以為你的方法已經被跳過了。一種可行的解決方法就是增加一條列印輸出語句。在日誌文件中記錄下信息。或者是使用跟蹤調試程序(例如VJ++或者是Borland JBuilder)來一行一行的調試。如果你的方法還不能被調用,那很可能就是你的方法名鍵入錯誤了。


3、比較和分配(「=」強於「==」)


當我們使用==運算符的時候,我們實際上是在比較兩個對象的引用,來看看他們是不是指向的同一個對象。舉個例子,我們不能使用==運算符來比較兩個字元串是否相等。我們應該使用。equals方法來比較兩個對象,這個方法是所有類共有的,它繼承自java.lang.Object。


下面是比較兩個字元串相等的正確的方法:


// Bad way


if( (abc + def) == "abcdef" )


{


……


}


// Good way

if ( (abc + def)。equals("abcdef") )


{


……


}


4、混淆值傳遞和引用傳遞


這是一個不太容易發現的錯誤。因為,當你看代碼的時候,你會十分確定這是一個引用傳遞,而它實際上卻是一個值傳遞。Java這兩者都會使用,所以你要理解你什麼時候需要值傳遞,什麼時候需要引用傳遞。當你要傳遞一個簡單的數據類型到一個函數中,比如,char、int、float或者double,你是在傳遞一個值。這個意味著這種數據類型的被複制了一個拷貝,是這個拷貝被傳遞到了函數中。如果這個函數去修改這個值,僅僅是這個值的拷貝被修改了。這個函數結束以後,將會返回到控制調用函數去,這時候那個「真正的」值沒有收到影響,沒有任何改變被存儲。


如果你想修改一個簡單的數據類型,可以將這個數據類型定位一個返回值或者將它封裝到一個對象中。


當你要傳遞一個java對象到一個函數中,比如,數組、向量或者是一個字元串,此時你傳遞的就是一個對象的引用。這裡的字元串也是一個對象,而不是一個簡單數據類型。這就意味著你要傳遞一個對象到一個函數,你就要傳遞這個對象的引用,而不能去複製它。任何對這個對象的成員變數的改變都會持久化,這種改變的好壞要取決於你是否是刻意而為之。


有一點要注意,如果字元串沒有包含任何方法改變它的值的時候,你最好將它作為值來傳遞。


5、寫一個空的異常處理

我知道一個空的異常處理就像忽略錯誤一樣很誘人。但是如果真的發生了錯誤,你不會得到一個錯誤信息的輸出,它使得不太可能發現錯誤的原因。甚至是最簡單的一場處理都是很有用處的。舉個例子,在你的代碼加上try{}catch{},去試著捕捉任何的一場拋出,並列印出錯誤信息。你不用為每個異常都寫出定製的處理(雖然這是一個很好的編程習慣)。但是不要將這個異常處理空著,否則你就不會知道有什麼錯誤發生了。


舉例:


public static void main(String args[])


{


try{


// Your code goes here


}


catch (Exception e)


{


}

}


6、忘記java中索引是從0開始的


如果你有C/C++的編程背景的話,你在使用其他編程語言的時候就不會發現同樣的問題了。


在java中數組的索引是從0開始的,這就是說第一個元素的索引必須是0.困惑了?讓我們看看例子吧


// Create an array of three strings


String[] strArray = new String[3];


// First element"s index is actually 0


strArray[0] = "First string";


// Second element"s index is actually 1


strArray[1] = "Second string";

// Final element"s index is actually 2


strArray[2] = "Third and final string";


在這個例子中,我們定義了一個有著三個字元串的數組,當我們訪問他的元素時候減去了一個。現在,當我們試著去訪問strArray[3],也就是第四個元素的時候,就會有一個ArrayOutOfBoundsException異常被拋出。這個就是最明顯的例子-忘記了0索引規則。


在其他地方0索引規則也能使你陷入麻煩。例如字元串中。假設你要從一個字元串確定的偏移位置處得到一個字元,使用String。charAt(int)函數,你就能看到這個信息。但是在java中,字元串類的索引也是從0開始的,這就是說第一個字元的偏移為之為0,第二個為1.你可能會陷入一些麻煩,如果你不注意這個問題的話,特別是你的應用程序中使用了大量的字元串處理程序,那樣的話你就很可能使用錯誤的字元,同時在運行時拋出一個StringIndexOutOfBoundsException異常,就像ArrayOutOfBoundsException異常一樣。下面的例子證明了這些:


public class StrDemo


{


public static void main (String args[])


{


String abc = "abc";


// This line should throw a StringIndexOutOfBoundsException

}


}


同時應該注意的是,0索引規則不應該只應用在數組或是字元串中,java的其他部分也會用到。但是並不是全部都會用到。Java.util.Date和java.util.Calendar,這兩個類的月份都是從0開始的,但是日期卻通常是從1開始的,下面的程序證明了這一點。


import java.util.Date;


public class ZeroIndexedDate


{


public static void main (String args[])


{


// Get today"s date


Date today = new Date();


// Print return value of getMonth


today.getMonth());


// Get today"s date using a Calendar


Calendar rightNow = Calendar.getInstance();


// print return value of get ( Calendar.MONTH )


rightNow.get (Calendar.MONTH));


}


}


7、防止線程在共享變數中並行存取


在寫一個多線程的應用程序的時候,許多程序員都喜歡抄近路。而這樣會是他們的應用程序或者是小應用程序發生線程衝突。當兩個或者兩個以上的線程訪問同一個數據的時候,就存在一定的概率(概率大小取決於墨菲法則)使得兩個線程同時的訪問或者修改同一個數據。不要愚蠢的認為這樣的情況不會發生在單線程的應用程序中。當訪問同一個數據的時候,你的線程就很可能被掛起,而第二個線程進入時就會覆蓋第一個線程修改的地方。


這樣的問題不是僅僅出現在多線程應用程序或者是小應用程序中的。如果你寫了java api 或者是java bean,你的代碼就很可能不是線程安全的。即使你從來沒有寫過一個使用線程的單獨的應用程序,人們也有可能使用你的程序。為了其他人,不僅僅是你,你就應該採取措施防止線程在共享變數中並行存取。


怎樣來解決這個問題呢,最簡單的就是讓你的變數私有化。同時使用同步存取方法。存取方法允許訪問似有的成員變數,但是僅僅是在一種控制方式中。下面的存取方法就能夠以安全的方式修改計數器的值。


public class MyCounter


{


private int count = 0;//count starts at zero


public synchronized void setCount(int amount)


{


count = amount;


}


public synchronized int getCount()


{


return count;


}


}


8、大寫錯誤


這是一個我們最經常犯的錯誤。他是很簡單的,但是有時我們看著一個沒有大寫的變數或者方法卻並不能發現這個錯誤。我自己也常常感到困惑,因為我認為這些方法和變數都是存在的,但是卻發現不了他們沒有大寫。


這裡你不能用銀子彈來檢查它,你只能自己訓練者來減少這種錯誤。這裡有個竅門:


Java api中所用的方法和變數名都應該以小寫字母來開頭。


所有的變數名和方法名的新詞的開頭都要用大寫字母。


如果你以這樣的形式來定義你的變數名和類名,你就是在有意識的使他們走向正確,你就能逐漸的減少這樣的錯誤的數量。這可能需要一段時間,但是在以後有可能會避免更為嚴重的錯誤。


下來就是java程序員最常犯的錯誤了!!!


9、空指針


空指針是java程序員最經常犯的錯誤了。編譯器不會為你檢查出這個錯誤它僅僅在運行時在表現出來,如果你發現不了它,你的用戶將很可能發現它。


當試著訪問一個對象的時候,這個對象的引用就是空的,一個NullPointerException異常就會被拋出。空指針錯誤的原因是多種多樣的,但是一般情況下發生這種錯誤意味著你沒有對一個對象初始化,或者是你沒有檢查一個函數的返回值。


許多函數返回一個空是用來指示一個錯誤的條件被執行。如果你不尖擦返回值的話,你由於不可能知道發生了什麼。既然原因是一個錯誤的條件,一般的測試就不會發現它,這就意味著你的用戶可能在最後的時候替你發現它。如果API函數指明一個空的對象很可能被返回,那在使用對象的引用之前一定要進行檢查。


另外的原因可能是你在初始化對象的時候不規範,或者是它的初始化是有條件的。舉例,檢查下面的代碼,看看你是否能發現這個錯誤。


public static void main(String args[])


{


// Accept up to 3 parameters


String[] list = new String[3];


int index = 0;


while ( (index


{


list[index++] = args[index];


}


// Chexk all the parameters


for (int i = 0; i


{


if (list[i].equals"-help")


{


//……


}


//else……


}


}


上面的代碼(作為認為的例子),顯示了通常的錯誤。在某些情況下,用戶輸入了三個或者更多的參數,上述代碼將會正常運行。但是如果沒有參數被輸入,那麼在運行的時候就會得到一個空指針異常。某些時候你的變數將會被初始化,但是其他時候他們卻不會。一個簡單的解決辦法就是在你的訪問數組元素的時候先檢查它十分為空。



java學習:你知道嗎?Java常見的幾大代碼



總結


以上整理的這些錯誤是Java開發者常犯的一下錯誤,雖說在編碼的時候不可能完全的避免錯誤,但是你應該去避免犯一些重複的錯誤。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 java吧 的精彩文章:

Linux操作系統內存淺析
學習java很難嗎?高效學習Java路線圖分享
剛進公司的第一堂培訓——《程序猿的結構化思維》

TAG:java吧 |

您可能感興趣

是吃雞讓你認識了steam的嗎?那Uplay和Origin你知道嗎?
你知道balance嗎?
關於madness×converse 那些你不知道的小事
你知道launch和shot的區別嗎?
穿Vetements tabi的人從不需要知道Martin Margiela是誰
Aoife,Siobhan,Ciara……你知道這些愛爾蘭名字都怎麼讀,是啥意思么?
你知道Angelababy的名字有什麼含義嗎?
Live as Spanish | 只知道海鮮飯?Tapas才是西班牙美食的精髓!
Dad Shoe你只知道Balenciaga?adidas Twinstrike ADV新配色帶來驚喜!
Dad Shoe你只知道Balenciaga? adidas Twinstrike ADV新配色帶來驚喜!
關於Amazon Go,你還想知道什麼?
龍頭 Nike 的底蘊終於祭出了!不知道能否對抗 Boost 呢?和樂叔相比,我更喜歡這款 Converse!
《Fate/Grand Order》:熱度掉不掉我不知道,梅林是真抽不到!
陳可辛iPhone X 拍片好牛?NoNoNo 看了附件你就知道
get√盤點那些你不知道的iPhone小技巧
你不知道的 nike與Supreme 聯名,那是一個潮字了得
看了angelababy精緻的臉,才知道什麼叫做美的沒有靈魂
iPhone X和三星note8看完才知道買哪個
魅族Pro7:看看iPhoneX,就知道為什麼會失敗
PhoneX和三星Note8真機實際對比,看完才知道買哪個