java 語(yǔ)言定義了一些異常類在java.lang 標(biāo)準(zhǔn)包中。
所有的異常類是從 java.lang.Exception 類繼承的子類。
Exception 類是Throwable 類的子類。除了Exception類外,Throwable還有一個(gè)子類Error 。
Java 程序通常不捕獲錯(cuò)誤。錯(cuò)誤一般發(fā)生在嚴(yán)重故障時(shí),它們?cè)贘ava程序處理的范疇之外。
Error 用來(lái)指示運(yùn)行時(shí)環(huán)境發(fā)生的錯(cuò)誤。
例如,JVM 內(nèi)存溢出。一般地,程序不會(huì)從錯(cuò)誤中恢復(fù)。
異常類有兩個(gè)主要的子類:IOException 類和 RuntimeException 類。

在 Java 內(nèi)置類中,有大部分常用檢查性和非檢查性異常。
通常,Java的異常(包括Exception和Error)分為可查的異常(checked exceptions)和不可查的異常(uncheckedexceptions)。
可查異常(編譯器要求必須處置的異常):正確的程序在運(yùn)行中,很容易出現(xiàn)的、情理可容的異常狀況。可查異常雖然是異常狀況,但在一定程度上它的發(fā)生是可以預(yù)計(jì)的,而且一旦發(fā)生這種異常狀況,就必須采取某種方式進(jìn)行處理。
除了RuntimeException及其子類以外,其他的Exception類及其子類都屬于可查異常。這種異常的特點(diǎn)是Java編譯器會(huì)檢查它,也就是說(shuō),當(dāng)程序中可能出現(xiàn)這類異常,要么用try-catch語(yǔ)句捕獲它,要么用throws子句聲明拋出它,否則編譯不會(huì)通過。
不可查異常(編譯器不要求強(qiáng)制處置的異常):包括運(yùn)行時(shí)異常(RuntimeException與其子類)和錯(cuò)誤(Error)。
Exception 這種異常分兩大類運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常(編譯異常)。程序中應(yīng)當(dāng)盡可能去處理這些異常。
運(yùn)行時(shí)異常:都是RuntimeException類及其子類異常,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標(biāo)越界異常)等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯(cuò)誤引起的,程序應(yīng)該從邏輯角度盡可能避免這類異常的發(fā)生。
運(yùn)行時(shí)異常的特點(diǎn)是Java編譯器不會(huì)檢查它,也就是說(shuō),當(dāng)程序中可能出現(xiàn)這類異常,即使沒有用try-catch語(yǔ)句捕獲它,也沒有用throws子句聲明拋出它,也會(huì)編譯通過。
非運(yùn)行時(shí)異常 (編譯異常):是RuntimeException以外的異常,類型上都屬于Exception類及其子類。從程序語(yǔ)法角度講是必須進(jìn)行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。
在 Java 應(yīng)用程序中,異常處理機(jī)制為:拋出異常,捕捉異常。
捕獲異常:在方法拋出異常之后,運(yùn)行時(shí)系統(tǒng)將轉(zhuǎn)為尋找合適的異常處理器(exception handler)。
捕獲異常:try、catch 和 finally
try 塊:用于捕獲異常。其后可接零個(gè)或多個(gè)catch塊,如果沒有catch塊,則必須跟一個(gè)finally塊。
catch 塊:用于處理try捕獲到的異常。
finally 塊:無(wú)論是否捕獲或處理異常,finally塊里的語(yǔ)句都會(huì)被執(zhí)行。當(dāng)在try塊或catch塊中遇到return語(yǔ)句時(shí),finally語(yǔ)句塊將在方法返回之前被執(zhí)行。
如何釋放物理資源?
Close
當(dāng)程序執(zhí)行try塊,catch塊時(shí)遇到return語(yǔ)句或者throw語(yǔ)句,這兩個(gè)語(yǔ)句都會(huì)導(dǎo)致該方法立即結(jié)束,所以系統(tǒng)并不會(huì)立即執(zhí)行這兩個(gè)語(yǔ)句,而是去尋找該異常處理流程中的finally塊,如果沒有finally塊,程序立即執(zhí)行return語(yǔ)句或者throw語(yǔ)句,方法終止。如果有 finally塊,系統(tǒng)立即開始執(zhí)行finally塊,只有當(dāng)finally塊執(zhí)行完成后,系統(tǒng)才會(huì)再次跳回來(lái)執(zhí)行try塊、catch塊里的 return或throw語(yǔ)句,如果finally塊里也使用了return或throw等導(dǎo)致方法終止的語(yǔ)句,則finally塊已經(jīng)終止了方法,不用 再跳回去執(zhí)行try塊、catch塊里的任何代碼了。
在以下4種特殊情況下,finally塊不會(huì)被執(zhí)行:
1)在finally語(yǔ)句塊中發(fā)生了異常。
2)在前面的代碼中用了System.exit()退出程序。
3)程序所在的線程死亡。
4)關(guān)閉CPU。
使用 try 和 catch 關(guān)鍵字可以捕獲異常。try/catch 代碼塊放在異常可能發(fā)生的地方。
try/catch代碼塊中的代碼稱為保護(hù)代碼,使用 try/catch 的語(yǔ)法如下:
try
{
//程序代碼
}catch(ExceptionName e1)
{
//Catch 塊
}
Catch 語(yǔ)句包含要捕獲異常類型的聲明。當(dāng)保護(hù)代碼塊中發(fā)生一個(gè)異常時(shí),try 后面的 catch 塊就會(huì)被檢查。
如果發(fā)生的異常包含在 catch 塊中,異常會(huì)被傳遞到該 catch 塊,這和傳遞一個(gè)參數(shù)到方法是一樣。
一個(gè) try 代碼塊后面跟隨多個(gè)catch 代碼塊的情況就叫多重捕獲。
多重捕獲塊的語(yǔ)法如下所示:
try{
//程序代碼
}catch(異常類型1 異常的變量名1){
// 程序代碼
}catch(異常類型2 異常的變量名2){
// 程序代碼
}catch(異常類型2 異常的變量名2){
// 程序代碼
}
上面的代碼段包含了 3 個(gè) catch塊。
可以在 try 語(yǔ)句后面添加任意數(shù)量的catch 塊。
如果保護(hù)代碼中發(fā)生異常,異常被拋給第一個(gè) catch 塊。
如果拋出異常的數(shù)據(jù)類型與 ExceptionType1 匹配,它在這里就會(huì)被捕獲。
如果不匹配,它會(huì)被傳遞給第二個(gè) catch 塊。
如此,直到異常被捕獲或者通過所有的 catch 塊。
如果一個(gè)方法沒有捕獲一個(gè)檢查性異常,那么該方法必須使用 throws 關(guān)鍵字來(lái)聲明。throws 關(guān)鍵字放在方法簽名的尾部。
也可以使用 throw 關(guān)鍵字拋出一個(gè)異常,無(wú)論它是新實(shí)例化的還是剛捕獲到的。
下面方法的聲明拋出一個(gè) RemoteException 異常:
import java.io.*;public class className{ public void deposit(double amount) throws RemoteException  {   // Method implementation   throw new RemoteException();  } //Remainder of class definition}一個(gè)方法可以聲明拋出多個(gè)異常,多個(gè)異常之間用逗號(hào)隔開。
 
finally 關(guān)鍵字用來(lái)創(chuàng)建在try 代碼塊后面執(zhí)行的代碼塊。
無(wú)論是否發(fā)生異常,finally 代碼塊中的代碼總會(huì)被執(zhí)行。
在 finally 代碼塊中,可以運(yùn)行清理類型等收尾善后性質(zhì)的語(yǔ)句。
finally 代碼塊出現(xiàn)在catch 代碼塊最后,語(yǔ)法如下:
try{
  // 程序代碼
}catch(異常類型1 異常的變量名1){
  // 程序代碼
}catch(異常類型2 異常的變量名2){
  // 程序代碼
}finally{
  // 程序代碼
}
7.3拋出異常
1.什么是拋出異常?什么情況下需要拋出異常?拋出異常后如何處理?
拋出異常:當(dāng)一個(gè)方法出現(xiàn)錯(cuò)誤引發(fā)異常時(shí),方法創(chuàng)建異常對(duì)象并交付運(yùn)行時(shí)系統(tǒng),異常對(duì)象中包含了異常類型和異常出現(xiàn)時(shí)的程序狀態(tài)等異常信息。運(yùn)行時(shí)系統(tǒng)負(fù)責(zé)尋找處置異常的代碼并執(zhí)行。
拋出異常:throw、 throws
7.4自定義異常
1.如何自定義異常?自定義的異常如何處理?
編寫自己的異常類時(shí)需要記住下面的幾點(diǎn)。
所有異常都必須是 Throwable 的子類。
如果希望寫一個(gè)檢查性異常類,則需要繼承 Exception 類。
如果你想寫一個(gè)運(yùn)行時(shí)異常類,那么需要繼承 RuntimeException 類。
可以像下面這樣定義自己的異常類:
class MyException extends Exception{
}
只繼承Exception 類來(lái)創(chuàng)建的異常類是檢查性異常類。
一個(gè)異常類和其它任何類一樣,包含有變量和方法。
7.5集合概述
1.什么是集合? Java中常用的集合有哪幾類?集合中用來(lái)存放什么?集合與數(shù)組的區(qū)別?
集合類存放于java.util包中。
集合類存放的都是對(duì)象的引用,而非對(duì)象本身,出于表達(dá)上的便利,我們稱集合中的對(duì)象就是指集合中對(duì)象的引用(reference)。
集合類型主要有3種:set(集)、list(列表)和map(映射)。
 
通俗的說(shuō),集合就是一個(gè)放數(shù)據(jù)的容器,準(zhǔn)確的說(shuō)是放數(shù)據(jù)對(duì)象引用的容器。
一、數(shù)組聲明了它容納的元素的類型,而集合不聲明。
    二、數(shù)組是靜態(tài)的,一個(gè)數(shù)組實(shí)例具有固定的大小,一旦創(chuàng)建了就無(wú)法改變?nèi)萘苛恕6鲜强梢詣?dòng)態(tài)擴(kuò)展容量,可以根據(jù)需要?jiǎng)討B(tài)改變大小,集合提供更多的成員方法,能滿足更多的需求。
    三、數(shù)組不論是效率還是類型檢查都是最好的。
1.數(shù)組是大小固定的,一旦創(chuàng)建無(wú)法擴(kuò)容;集合大小不固定,
2.數(shù)組的存放的類型只能是一種,集合存放的類型可以不是一種(不加泛型時(shí)添加的類型是Object);
3.數(shù)組是java語(yǔ)言中內(nèi)置的數(shù)據(jù)類型,是線性排列的,執(zhí)行效率或者類型檢查(不懂),都是最快的.
 ArrayList就是基于數(shù)組創(chuàng)建的容器類.

2.各類集合中元素存與取的特點(diǎn)?如何定義一個(gè)集合?
List 有序,可重復(fù)。Set 無(wú)序,唯一
Map(雙列集合)
    A:Map集合的數(shù)據(jù)結(jié)構(gòu)僅僅針對(duì)鍵有效,與值無(wú)關(guān)。
    B:存儲(chǔ)的是鍵值對(duì)形式的元素,鍵唯一,值可重復(fù)。
 
7.6集合類
1.List接口的實(shí)現(xiàn)方式?如何定義一個(gè)list集合?
6.List集合的特點(diǎn)?7.List集合中常用的方法有哪些?
 
List:、有順序以線性方式存儲(chǔ),可以存放重復(fù)對(duì)象
ArrayList:
底層的數(shù)據(jù)結(jié)構(gòu)是數(shù)組;所以它查詢快,增刪慢!
線程不安全,但是效率高!
Vector:
底層的數(shù)據(jù)結(jié)構(gòu)是數(shù)組;所以它查詢快,增刪慢!
線程安全,但是效率低!
LinkList:
底層的數(shù)據(jù)結(jié)構(gòu)是鏈表,所以它查詢慢,但是增刪快!
線程不安全,但是效率高!
 
7.7集合工具類
1.集合的工具類有哪些?
1. 類Collections 是集合框架的工具類,其中的方法都是靜態(tài)方法。 2. 調(diào)用某個(gè)方法直接利用類名調(diào)用即可,如Collections.sort(list1);。
 
8、用來(lái)排序的集合工具類是什么?如何使用其中的方法?
java.util.Arrays類
 
提供了各種對(duì)象的排序:char[],byte[],long[],int[]和Object[],注Arrays.sort方法排序返回的結(jié)果是升序Ascending的排列順序。你可以定制排序順序。這個(gè)排序和TreeSet的紅黑樹排序方式不同,Set不允許有重復(fù)數(shù)據(jù)存在,因此,當(dāng)有重復(fù)數(shù)據(jù)時(shí),可以使用這個(gè)工具類進(jìn)行排序。Arrays提供的排序算法是歸并排序算法(當(dāng)元素?cái)?shù)量小于=7時(shí)采用的是插入排序),空間復(fù)雜度O(n)。
 
.java.util.Collections類
 
該工具類提供了大量方法對(duì)集合元素進(jìn)行排序、查詢和修改等操作,還提供了將集合對(duì)象設(shè)置為不可變、對(duì)集合對(duì)象實(shí)現(xiàn)同步控制等方法。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注