1. 程式人生 > >java編程中的異常分析及面向對象的思考總結[圖]

java編程中的異常分析及面向對象的思考總結[圖]

目錄 內部 釋放資源 包括 sta overload 普通 none 命名

java編程中的異常分析及面向對象的思考總結[圖]
1.異常:
程序中出現的不正常現象。
2.異常的由來:
程序在運行的過程中出現了不正常的情況,程序把它看成對象提取了屬性行為(名字,原因,位置等信息)
形成了各種異常類
3.異常的分類:(throwable)
1.Error(錯誤):運行中出現的嚴重錯誤,不需要我們進行更改。
2.Exception():運行中出現的不嚴重的錯誤,我們可以嘗試去更改.
4.Exception:分類:
第一種分類:系統異常:系統提前定義好的,我們直接使用
自定義異常:需要我們自己定義
第二種分類:編譯異常:在編譯階段拋出異常,處理異常
運行時異常:在運行階段拋出異常,處理異常
public class Demo8 {
public static void main(String[] args) {//4.這裏也沒有處理異常的能力,繼續向上拋,拋給JVM(java虛擬機)
//JVM的處理辦法:就是調用異常對象的打印方法,將異常的名字,位置,原因打印到控制臺
Math math = new Math();
math.div(2, 0);//3.拋給了這裏,這裏也沒有處理異常的能力,繼續向上拋,拋給main
}
}
class Math{
public int div(int a,int b){//2.拋給了這裏,這裏也沒有處理異常的能力,繼續向上拋,拋給調用方法的位置
return a/b;//1.先創建除數為零的異常對象(new ArithmeticException()),這裏沒有處理異常的能力
//將異常向上拋,拋給它所在的方法
}
}

技術分享圖片

5.異常的特點:
當程序出現多個異常的時候,程序會打印異常信息並中斷程序,所以當同時出現多個異常的時候,只能執行第一個.
6.常見的異常
public class Demo2 {
public static void main(String[] args) {
int[] arr = new int[]{4,5,6};
//數組下標越界異常 ArrayIndexOutOfBoundsException
//System.out.println(arr[7]);
arr = null;
//空指針異常 NullPointerException
System.out.println(arr[0]);
}
}
7.對異常的處理
檢測異常,捕獲異常,讓異常不影響下面代碼的執行.
* try{
* 可能出現異常的代碼
* }catch(Exception e){//捕獲異常 e就是要捕獲的異常
* 對出現異常的代碼的處理過程
* }
*
* 繼續執行下面正常的代碼
public class Demo3 {
public static void main(String[] args) {
Math math = new Math();
try {
int value = math.div(4, 0);//3.拋到這裏 new ArithmeticException()
//只要try內部的代碼發生了異常,catch會立刻捕獲異常,所以這裏的代碼不會執行.
//只有try裏面的代碼沒有發生異常,這裏的代碼才會執行.
System.out.println("value:"+value);
} catch (Exception e) {//4.捕獲異常: e = new ArithmeticException()
//e.printStackTrace();//可以打印異常的位置,原因,名字等信息
System.out.println(e.getMessage());//異常的原因
//System.out.println(e.toString());//異常的名字,原因
System.out.println("處理異常的代碼");
}
System.out.println("go on");
}
}
class Math{
public int div(int a,int b)//2.拋到這裏 new ArithmeticException()
{
return a/b;//1.產生並拋出 new ArithmeticException()
}
}
8.多異常的處理
* try{
* 可能出現異常的代碼
* }catch(異常一 e){//捕獲異常 e就是要捕獲的異常
* 對出現異常的代碼的處理過程
* }catch(異常二 e){//捕獲異常 e就是要捕獲的異常
* 對出現異常的代碼的處理過程
* }catch(Exception e){//捕獲異常 e就是要捕獲的異常
* 對出現異常的代碼的處理過程
* }
*
* 繼續執行下面正常的代碼
public static void main(String[] args) {
Math1 math1 = new Math1();
try {
math1.div(3, 0);
} catch (ArithmeticException e) {
e.printStackTrace();
}catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}catch (Exception e) {//註意:一定要將包含Exception的異常捕獲放後面,不然後面的異常執行不到了父類異常所有異常都能接收
e.printStackTrace();
}
System.out.println("go on");
}
}
class Math1{
int[] arr = {3,5};
public int div(int a, int b){
System.out.println(arr[1]);
return a/b;
}
}
* try{
* 可能出現異常的代碼
* }catch(Exception e){//捕獲異常 e就是要捕獲的異常
* 對出現異常的代碼的處理過程
* }finally{
* 必須執行的代碼:作用:用於資源的釋放:比如:多線程中的鎖對象,流的關閉,數據庫的關閉等
* }
*
*
*
* 繼續執行下面正常的代碼
*
* try{
* 獲取資源
* }finally{
* 釋放資源.
* 必須執行的代碼:作用:用於資源的釋放:比如:多線程中的鎖對象,流的關閉,數據庫的關閉等
* }
public class Demo5 {
public static void main(String[] args) {
Math2 math2 = new Math2();
try {
math2.div(22, 0);
} catch (ArithmeticException e) {
e.printStackTrace();
//return;//讓當前的方法結束,finally裏面的代碼還是可以執行
System.exit(0);//退出程序,finally裏面的代碼不會再執行
} finally {
//必須執行的代碼
System.out.println("finally");
}
System.out.println("go on");
}
}
class Math2{
public int div(int a,int b)//2.拋到這裏 new ArithmeticException()
{
int[] arr = {3,4};
System.out.println(arr[1]);
return a/b;//1.產生並拋出 new ArithmeticException()
}
}
9.自定義異常
自定義異常:自己定義的異常類,由於Exception裏面有異常的基本功能,一般我們都寫Exception的子類
*
* 為什麽要有自定義異常?
* 答:系統沒有定義的異常需要我們自己定義,我們解決的是系統沒有解決的問題.
*
* 比如:訂單異常 用戶信息異常 除數為負數
*
* 異常的分類:
* 編譯異常:在編譯階段拋出,處理的異常---除RuntimeException以外的所有異常
* 所有相關的工作都要由我們自己完成
* 運行時異常:在運行階段拋出,處理的異常--RuntimeException異常
* 所有的工作我們都可以不管
*
* 異常處理的方式:
* 1.異常的聲明
* 異常聲明後,調用者去處理,調用者不處理,繼續聲明直到交給JVM
* 2.trycatch
* 實現的是真正的對異常的處理
*
*
* 讓誰去處理異常比較合適?
* 誰調用可能出現異常的方法,誰負責處理異常
*/
//自定義一個負數異常類:
class FuShuException extends Exception{
public FuShuException() {
}
public FuShuException(String message) {
super(message);
}
}
public class Demo6 {
public static void main(String[] args)
{
Math3 math3 = new Math3();
//1.trycatch 2.繼續聲明
try {
math3.div(3, -2);
} catch (FuShuException e) {
e.printStackTrace();
}
}
}
class Math3{
//聲明異常,告訴別人我有可能發生異常
public int div(int a,int b) throws FuShuException
{
/*
*throw是拋出的意思
*throws是聲明異常的意思
*/
if (b<0) {
throw new FuShuException("除數為負數了");//手動生成並拋出除數為負數異常
}
return a/b;
}
}
JAVA面向對象:
1. 萬物皆對象
2. 面向對象和面向過程的區別:
面向過程主要是描述一件事情或者是一個過程的執行
面向對象編程主要是用語言描述將現實世界中存在的事物,或者規律。無限接近機器識別的語言。
3.對象:
對象包括 屬性 和 特征
4.類:類是所有對象的抽象概念或者集合(物以類聚),對象稱為類的具體實例。
類是抽象的,對象是具體
5.面向對象的三大特征:
封裝 , 繼承 , 多態
6.封裝:隱藏內部實現細節,對外提供公共的訪問方法;
好處:代碼設計者角度,安全性,防止代碼被修改破壞;
調用者角度,忽略實現細節,只關註功能怎麽用。
設計:成員變量盡量私有化(private),對外提供公有方法
繼承:從當前類中派生出一個新類,這個新類可以獲得已有類的全部(非private)屬性和方 法,並可以添加自己的屬性和方法。即子類繼承父類。
多態:對象的多種形態,以繼承為基礎
對象的多態:向上轉型 和向下轉型
方法的多態:方法的重載方法的覆寫
7.package 包
對所有class進行分類,以便方便管理
命名規則:小寫字母,一般都是四級目錄:com.公司名.項目名.模塊名稱
8.構造方法:什麽是構造方法?構造方法是一個類在初始化的形態,類本身自帶特征。
jvm在構建一個類的時候,會構建一個默認的構造方法。
構造方法的特點:
公有的、和類名相同、沒有返回值
構造方法的用處在哪裏?
初始化成員變量。
構造方法越多,代表在這個類初始化的時候,形態越多,功能約強大。
構造方法的重載概念(overload)
構造方法的重載,參數類型不同,參數個數不同,參數次序不同 都能構成重載。僅僅限於本類。
9.類的成員方法:
方法的概念:方法是一個類接收外部信息的其中的渠道。
方法在一個類中專門解決業務邏輯的。
public 返回值 方法名(參數列表){
// return 返回值;
}
10.方法參數的傳遞:傳值或者傳遞引用
方法的參數傳遞只能傳遞兩種類型:
如果要是傳值,就是一個具體的值
如果要傳遞引用,那麽傳遞的該對象的地址
11.static 用來修飾靜態的方法,代碼塊或者變量,可以直接使用類名調用,不需要new對象調用
static 修飾的變量在內存中只有一個地址
使用場景:只有在工具類中才可以使用,節省內存空間
12.static 用來修飾靜態的方法、靜態的代碼模塊、靜態變量
如果使用static所修飾的方法或者變量,可以使用類名直接調用,
不需要new對象來調用.
static 修飾的變量在內存中只有唯一的一個地址,
使用場景:只有在工具類中才可以使用,該方法被頻繁的調用,確實節省內存空間
13.類的繼承 extends
類與類的關系有哪些?
第一種是關聯(has-a)關系(聚合)、第二種是繼承(is-a)關系
如果是關聯關系,那麽就是類調用類的關系。
所有的對象都是繼承Object類,java是單根繼承的特點
單根繼承的好處是什麽?不好的地方?
子類可以調用父類的方法,減少代碼的冗余度。
在父類的角度考慮問題,繼承可以延伸父類的功能(擴大功能)
如果子類繼承父類,子類可以調用父類的公有方法,不能調用父類的私有方法
子類調用父類的時候,父類的構造方法會被調用
14.super關鍵字只能存在子類中,主要在子類的方法中調用父類的方法,包括構造方法,一般寫在程序的第一行
super可以在子類的構造方法中調用父類的構造方法super();
重寫(override)子類覆蓋父類的同名方法,好處在於擴充子類的方法功能。
裏氏替換原則,如果B類和C類有相同的屬性和方法,就應該把相同的屬性和方法提取到A類中,讓B類和C類繼承A類
15.final關鍵字
表示最終的。如果用final 所修飾的變量,稱為常量(不能被改變或者賦值)。
如果final修飾一個方法,那麽該方法在子類中不能被重寫。
如果final 修飾一個類,那麽這個類不能被繼承。
16.抽象類 abstract 關鍵字
public abstract class 類名{
}
抽象類和普通類的區別是什麽?抽象類是不能被實例化的,也就是不能使用new 關鍵字,普通類是可以實例化的
如果一個類有抽象方法,那麽這個類必然是抽象類,反之抽象類不一定有抽象方法。追風箏的人讀後感

心得體會,定義一個抽象類的用途在哪裏?抽象的概念是不需要實際去做的,但是在實際應用中有兩種場景用途:
1、父類某一個功能或者方法,需要子類強行去重寫的,那麽該方法必須是抽象的,這個類必須是抽象類。
2、父類對於某一個方法,無法預知子類會怎麽實現,那麽該方法必須是抽象的。
抽象類在繼承的關系圖中起到什麽作用?
承上啟下的作用。
17.接口 interface
接口的概念:
接口是一種標準,所有實現該接口的子類都要實現這個標準。
接口也是一種契約,所有實現該接口的子類都要實現該契約的條款。
接口也是一種身份特征,所有的子類都具有該身份特征。
接口裏面的所有方法都是抽象的、公有的。
接口裏所有的成員變量都是常量。
接口可以繼承嗎?接口是可以繼承接口的。
18.多態
什麽是多態?一個事物在不同的條件下,所表現的多種形態。
在開發中使用多態的場景,主要是使用在方法的參數傳遞上,可以傳遞接口、也可以傳遞抽象類
instanceof 來判斷兩個類之間是否有關系
對象的向上和向下轉型:
向上轉型:統一標準 A父類 cdef子類都可以按照父類的標準執行,向下轉型的意義:使用子類獨有的方法。

java編程中的異常分析及面向對象的思考總結[圖]