1. 程式人生 > >j2se學習中的一些零碎知識點4

j2se學習中的一些零碎知識點4

異常處理機制 數組 使用數組模擬棧 排序算法 二分法查找 string

1、什麽是異常?在程序運行過程中出現的錯誤。異常模擬的是現實世界中“不正常”的事件。

- java中采用“類”去模擬異常。類是可以創建對象的。

- NullPointException e = 0x1234; e是引用類型,e是保存的內存地址指向堆中的“對象”。這個對象是一定是NullPointException類型,這個對象就表示真實存在的異常事件。NullPointException是一類異常。(比如,“搶劫”就是一類異常,“張三被搶劫”是一個異常事件。)

- int a = 10; int b = 0; int c = a/b;以上程序編譯通過了,但是運行時出現了異常,表示發生了某個異常事件。JVM虛擬機向控制臺輸出如下信息:

技術分享

表明程序執行過程中發生了算數異常這個事件,JVM虛擬機為我們創建了一個ArithmeticException類型的對象。並且這個對象中包含了詳細的異常信息,並且JVM將這個對象中的信息打印輸出到控制臺中。

- 異常處理機制的作用?java語言為我們提供了一種完善的異常處理機制,程序發生異常事件之後,為我們輸出詳細的信息,程序員通過這個信息,可以對程序進行一些處理,使程序更加健壯。


2、異常的繼承結構圖

技術分享


3、處理異常的第一種方式:聲明拋出throws,以下程序演示聲明拋出,在方法聲明的位置上使用throws關鍵字向上拋出異常。

技術分享

以上程序編譯不通過:FileNotFoundException異常類繼承自IOException異常類(IOException異常類屬於編譯時異常類,因為是Exception類的直接子類),屬於編譯時異常

技術分享

需要註意的是,java編譯器並不是那麽智能,因為FileInputStream這個構造方法在聲明的位置上使用了throws FileNotFoundException;,所以需要拋出異常或者捕獲異常。

- 修改後的代碼為:

技術分享

- 使用throws處理異常不是真正的處理異常而是推卸責任,誰調用的就會拋給誰。(上拋直到拋給了JVM虛擬機,JVM虛擬機遇到這個異常就會退出程序,之後的代碼並不會執行。)

- 需要註意的是,重寫的方法無法比被重寫的方法拋出更寬泛的異常。

技術分享


4、處理異常的第二種方式:捕捉異常。

- 語法:

try{可能出現異常的代碼;

}catch{ 處理異常的代碼;

}catch{ 處理異常的代碼;}

- 需要註意,catch語句塊可以指定寫多個,但是必須從上到下,從小到大進行捕捉。

- catch語句塊提供的異常參數需要對try塊中可能出現異常的代碼做對應的處理。(catch語句塊中的異常參數可以是要處理異常類的父類)

- try...catch...中最多執行1個catch語句塊,執行結束之後try..catch...就結束。

技術分享


5、關於Throwable接口中的getMessage()和printStackTrace()方法的應用。

- printStackTrace()方法打印異常堆棧信息,一般情況下都會使用這種方式去調試程序。

- getMessage()方法只是printStackTrace()方法打印異常信息的一部分,並不詳細,只是提醒出現的異常信息,不顯示異常出錯代碼的位置。


6、關於finally語句塊:finally語句塊可以直接與try語句塊連用,如try...finally...。也可以和try語句和catch語句塊連用,如try...catch.finally...也可以。(在finally語句塊中的代碼一定會執行。)

- System.exit(0); --> 這個語句表示退出JVM。(只要在執行finally語句塊中退出JVM,則finally語句塊不會執行。)

- 深入finally語句塊:

技術分享

- finally語句塊中是一定會執行的,所以通常在程序中為了保證某資源一定會釋放,所有一般在finally語句塊中釋放資源。


7、自定義異常:有兩種方式,編譯時異常(Exception)和運行時異常(RuntimeException)。

技術分享

手動拋出異常,使用throw關鍵字,後面跟創建的異常類對象。

技術分享

測試程序:(如果用戶提供的用戶名字符串長度小於6個,則捕獲異常信息)

技術分享


8、數組是一種引用類型,數組是一種簡單的數據類型,線性的結構,數組是一個容器(可以用來存儲其他的元素,數組是可以存儲任意數據類型的元素。)

- 數組可以分為:一維數組,二維數組和多維數組。(數組中存儲的元素類型是統一的,每一個元素在內存中所占的空間大小是相同的。)

技術分享

- 數組拿首元素的內存地址作為數組對象的內存地址,a1引用中保存的是一維數組的首元素的內存地址。

- 數組長度不可改變,數組一旦創建長度是不可變的,固定的。

- 數組中每一個元素都是有下標的(有索引),從0開始,任何一個數組都有一個length屬性用來獲取數組中元素的個數。(數組最後一個元素的下標是數組的長度減去1,即a1.length -1。)

- 如何取得第一個元素?a1[0];如何取得最後一個元素?a1[a1.length -1]。(數組中通過元素的下標獲取元素。)

- 數組優點是查找效率高。知道數組的首元素的內存地址,要查找的元素只要知道下標就可以快速的計算出偏移量,通過首元素內存地址加上偏移量快速地計算出要查找元素的內存地址,通過內存地址快速定位該元素,所以數組查找元素的效率比較高。

- 數組的缺點是隨意的增刪元素效率低。當增加元素的時候,為了保證數組中元素在空間存儲上是有序的,所以被添加元素位置後面的所有元素都要向後移動。刪除元素也是,後面所有的元素都要向前移動,所以所租的增刪元素的效率較低。

- 初始化一維數組另一種方式:動態初始化。(動態初始化一維數組,會先在內存中分配這個數組,並且在數組中每一個元素都采用默認值。)

技術分享

技術分享

J2SE中的println源碼:

技術分享

- 什麽時候使用動態初始化,什麽時候使用靜態初始化?1、無論是動態初始化還是靜態初始化,最終的內存分布都是一樣的。2、如果在創建數組的時候,知道數組中應該存儲什麽數據,這個時候當然采用靜態初始化方式;如果在創建數組的時候,無法預測到數組中存儲什麽數據,只是先開辟空間,則使用動態初始化方式。

- 方法調用的時候,可以這樣傳遞一個數組:

技術分享


9、關於main方法中的參數列表String [] args:String[] args是專門用來接收命令行參數的。例如:java ArrayTest abc def ,JVM在調用ArrayTest類的main方法之前,先把“abc def”這個字符串以“空格”的方式分隔,然後存儲在String數組中。(String類型的數組中元素的個數是args.length。)

- 關於數組的拷貝:System.arraycope(源數組, 源數組的開始下標, 目標數組, 目標數組的開始下標, 拷貝的長度);

- 二維數組的特點:二維數組是一個特殊的一維數組,特殊在於這個一維數組中每一個元素都是一維數組。

- 靜態初始化二維數組:int [] [] a = {{1,2,3},{45,34},{0},{10,23,85,99}},獲取第1個一維數組a[0],獲取第1個一維數組中的第1個元素a[0][0],獲取最後一個一維數組中的最後一個元素a[a.length-1][a[a.length -1].length-1]。

- 二維數組的動態初始化:

技術分享


10、如何接收用戶的鍵盤輸入:(Scanner為掃描器類)

技術分享


12、使用一維數組模擬棧的數據結構:

技術分享

技術分享

棧操作出現異常類:

技術分享

測試類的代碼:

技術分享

技術分享


13、使用數組實現冒泡排序算法:

技術分享

技術分享


14、使用數組實現選擇排序算法:找出最小值,然後這個最小值和最前面的數據交換位置。


技術分享


15、二分法(折半法)查找:二分法查找是建立在已經排序的基礎之上的,以下程序分析從小到大進行排序。(並且這個數組中沒有重復的元素)

- 數組[1, 3, 5, 9. 11, 13, 56],以上是一個已經排好序的int類型的數組,要求快速找出13這個元素的下標。

技術分享

技術分享

技術分享

- Arrays是SUM提供的一個工具類,(java.util.Arrays)該工具類主要針對的是數組的操作,包括排序、二分法查找等。


16、java.lang.String;是字符串類型,字符串一旦創建將不可再改變。“abc”字符串對象一旦創建,不可以再改變成“abcd”。

- String s = "abc"; s = "def"; 創建一個“abc”字符串對象,該對象的內存地址,讓s變量保存。s是一個引用,s指向"abc"對象。(s是局部變量,s前面沒有final修飾,所以s可以重新指向。)

- 為了提升字符串的訪問效率,在程序中使用“緩存”技術,所以在java中所有使用“雙引號”括起來的字符串都會在“字符串緩存池”中創建一份。字符串常量池在方法區中被存儲。

- 在程序執行過程中,如果程序用到某個字符串,例如"abc",那麽程序會在字符串常量池中搜索該字符串,如果沒有找到則在字符串常量池中新建一個"abc"字符串,如果找到就直接拿過來使用。(字符串常量池是一個緩存區,以此來提高訪問字符串的效率。)

- String s1 = "Hello";String s2 = "Hello";System.out.println(s1 == s2);(打印為“true”,首先在字符串常量池中新建一個“Hello”字符串對象,該對象不可變,然後在字符串常量池中直接拿過來使用)。

- String s3 = new String("abc"); String s4 = new String("abc"); System.out.println(s3 == s4);(這兩個對象使用new關鍵字創建,在堆中開辟空間,這兩個對象的內存地址不相等。)

- 比較兩個字符串是否一致,必須使用String類提供的equals方法。

- 以下程序在執行結束之後,會在字符串常量池中創建3個字符串對象。"aaa"、"bbb"、"aaabbb":

String s5 = "aaa"; String s6 = "bbb"; String s7 = "aaa" + "bbb";


17、分析以下程序創建字符串的區別:

技術分享

- String s1 = "abc";只會在字符串常量池中創建一個"abc"字符串對象。String s2 = new String("hello");會在字符串常量池中創建一個"hello"字符串對象,並且會在堆中在創建字符串對象(常用的是第一種方式,第二種方式比較耗費內存。)


18、String面試題:

技術分享



19、使用String的時候我們應該註意的問題:盡量不要做字符串頻繁的拼接操作。因為字符串一旦創建不可改變,只要頻繁拼接,就會在字符串常量池中創建大量的字符串對象,給垃圾回收帶來問題。

- 關於字符串常用的構造方法:

技術分享

- 關於字符串常用的方法:

技術分享

技術分享

技術分享

技術分享

20、正則表達式:1、正則表達式是一門獨立的學科;2、正則表達式是一種字符模型,專門做字符串格式匹配的;3、正則表達式是通用的。(不詳細介紹)


j2se學習中的一些零碎知識點4