Java解惑讀書筆記2

從網上下的java解惑總共講了61點,我揀一些,自己不知道的或者需要注意的分享出來,以作筆記。

20.程序中的Unicode轉義字符
//\u0022是雙引號的Unicode編碼表示
System.out.println("a\u0022.length() + \u0022b".length());// 2
\u0022表示一個雙引號",可以在編碼時用\u0022代替雙引號,當然不會有人幹這麼二的事情,但我們需要知道\u開頭的4個數字表示unicode編碼的字符,Unicode編碼表示的字符是在[b]編譯期間[/b]就轉換成了普通字符,它與普通轉義字符(如:\")是不一樣的,它們是在程序被解析爲各種符號之後才處理轉義字符序列。

此外,註釋中也是支持Unicode轉義字符的。

23.string的編碼,默認是utf-8或者gbk編碼,在將string和byte[]互相轉化的時候要注意編碼類型,否則容易出現亂碼

String s = "你號";//默認是UTF-8編碼
byte[] bs = s.getBytes("GBK");//去GBK編碼的bytes,
System.out.println(bs.length);//GBK長度爲4,UTF-8爲6
String s1 = new String(bs, "GBK");//如果不用GBK會亂碼,因爲默認的是utf-8
System.out.println(s1);

ISO8859-1是唯一能夠讓該程序按順序打印從0到255的整數的缺少字符集,這也是唯一在字符和字節之間一對一的映射字符集。所以ISO-8859-1不能存儲漢字,這點要注意,如果把某漢字字符串用iso-8859-1編碼後,就亂碼了,也再也還原不出原漢字了。

24.string的replace和replaceAll
舉個例子,將.class的.替換爲\$如何寫?如果是replace,可以這麼寫:
System.out.println(".class".replace(".", "\\$"));

如果是replaceAll.按照上面寫法System.out.println(".class".replaceAll(".", "\\$"));會出錯結果是$$$$$$,爲何?因爲replaceAll的第一個參數是正則表達式,因此要匹配.,需要轉義因爲.在正則表達式裏表示任意字符。第二個參數裏的\和$也需要轉義,因此\的轉義是\\\\,$的是\\$。因爲replaceAll實際調用正則表達式裏的replaceAll:Pattern.compile(regex).matcher(str).replaceAll(repl),這個函數要求需要將\和$轉義,因爲這2個字符有特殊用處,[quote]美元符號可視爲到如上所述已捕獲子序列的引用,反斜線可用於轉義替換字符串中的字面值字符。 [/quote]

所以正確寫法:
System.out.println(".class".replaceAll("\\.", "\\\\\\$"));



26. finally與中斷
不要用return、break、continue或throw來退出finally語句塊,並且千萬不要允許受檢查的異常傳播到finally語句塊之外。也就是說不要在finally塊內終止程序,而是執行完finally塊後,要將控制權移交給try塊,由try最終決定怎樣結束方法的調用。因爲如果在finally裏執行return,則try的ruturn則無效果。

27.捕獲RuntimeException、Exception或Throwable的catch語句是合法,不管try塊裏是否拋出了這三個異常。但如果try塊沒有拋出或不可能拋出檢測性異常,則catch不能捕獲這些異常。重寫或實現時不能擴大異常的範圍,如果是多繼承,則異常取所有父類方法異常的交集或不拋出異常。這樣設計可以編碼異常範圍擴大。

31. 遞歸構造
public class S {
private S instance = new S();
public S() {}
}

如果在程序外面構造該類的實例,則會拋出java.lang.StackOverflowError錯誤。其原因是實例變量的初始化操作將先於構造器的程序體而運行。

32. 構造器中的異常
如果父類構造器拋出了檢測異常,則子類也只能拋出,而不能採用try-catch來捕獲:
33. StackOverflowError
Java虛擬機對棧的深度限制到了某個值,當超過這個值時,VM就拋出StackOverflowError。一般VM都將棧的深度限制爲1024,即當方法調用方法的層次超過1024時就會產生StackOverflowError。
發佈了21 篇原創文章 · 獲贊 0 · 訪問量 3536
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章