目錄
- 1、遞歸的介紹和使用
- 1.1 遞歸的介紹
- 1.2 案例
- `案例一:`
- `案例二:`
- `案例三:`
- `案例四:`
- 1.3 總結
- 2、`異常的介紹和使用`
- 2.1 異常的介紹:
- (1)能夠看懂異常
- (2)異常的體系接口和分類
- (3)總結
- 2.2 異常的處理方式
- `(1)異常的默認處理流程`
- `(2)異常處理方式 try...catch和throw拋出`
- `(3)總結`
- 2.3 自定義異常
- 2.4 練習
1、遞歸的介紹和使用
1.1 遞歸的介紹
package com.itheima.recursion;/*** Title: RecurisonDemo1* Describe: 類的功能* Name: masizhou* Date: 2024/7/11* Copyright: @2022 by masizhou*/public class RecurisonDemo1 {/*** 遞歸介紹:方法直接或間接地調用本身*/public static void main(String[] args) {methodA();}public static void methodA(){methodB();}public static void methodB(){methodC();}public static void methodC(){methodA();}
}
上述方法會發生棧內存溢出異常,如下:
1.2 案例
案例一:
package com.itheima.recursion;public class RecurisonDemo2 {public static void main(String[] args) {/*** 需求:使用遞歸求5的階乘*/int result = jc(5);System.out.println("5的階乘是:" + result);//5的階乘是:120}public static int jc(int num){if (num == 1){return 1;}return jc(num - 1) * num;}
}
棧內存圖分分析:
案例二:
package com.itheima.recursion;public class RecurisonDemo3 {public static void main(String[] args) {/*** 需求:使用遞歸求1~n之和*/int result = sum(100);System.out.println(result);//5050}public static int sum(int num){if (num == 1){return 1;}return num + sum(num - 1);}
}
案例三:
package com.itheima.recursion;public class RecurisonDemo4 {public static void main(String[] args) {/*** 需求:使用遞歸實現斐波那契數列:1 1 2 3 5 8 13 21...*/int result = f(20);System.out.println(result);//6765}public static int f(int num){if (num <= 2){return 1;}return f(num - 1) + f(num - 2);}
}
案例四:
package com.itheima.recursion;public class RecursionDemo5 {public static void main(String[] args) {/*** 需求:猴子吃桃 (n / 2) - 1*/int result = eat(1);System.out.println(result);//1534}public static int eat(int day){if (day == 10){return 1;}// 今天的桃子數 = (明天桃子數+1) * 2return 2 * (eat(day + 1) + 1);}
}
1.3 總結
2、異常的介紹和使用
2.1 異常的介紹:
(1)能夠看懂異常
package com.itheima.expection;public class ExceptionDemo1 {/*** 閱讀異常信息:從下往上* 1、找異常錯誤位置* 2、異常名稱* 3、異常原因*/public static void main(String[] args) {mothed();}public static void mothed(){int[] arr = {1, 2, 3};System.out.println(arr[10]);}
}
上述代碼會拋出異常,異常信息如下:
在閱讀異常時,遵循從下往上的原則:
- 1、找異常錯誤位置
- 2、異常名稱
- 3、異常原因
注:要是遇到不認識的異常怎么辦呢?
答:所有的異常都是類,因此把這個類復制下來,到Java的API文檔去看詳細信息即可。
(2)異常的體系接口和分類
package com.itheima.expection;import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.FileHandler;public class ExceptionDemo2 {public static void main(String[] args) throws ParseException, IOException {/*** - 編譯時異常:編譯階段就出現的異常(語法錯誤不算)。需要在運行之前給出解決方案。* - 運行時異常:編譯過了,運行期間【可能會出現的異常】*/SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd");Date parse = simpleDateFormat.parse("2008年12月12日");//編譯異常,需要給出解決方案FileHandler f = new FileHandler("D:\\a.txt");//編譯異常,需要給出解決方案}
}
(3)總結
2.2 異常的處理方式
(1)異常的默認處理流程
(2)異常處理方式 try...catch和throw拋出
package com.itheima.expection.handle;
public class HandleDemo1 {/*** 異常的處理方式:* 1、try...catch捕獲異常* 好處: 異常對象可以被捕獲,后續的代碼可以繼續執行* 格式:* try{* 可能會出現異常的代碼* } catch(異常名稱 對象名){* 異常的處理方案* }* 執行流程:* 1、執行try{}中的代碼,看是否有異常對象* 2、沒有:catch就不會捕獲,后續代碼繼續執行* 3、有:catch捕獲異常對象,執行catch{}中的處理方案,后續代碼繼續執行* 2、throw 拋出異常*** ----------------------------------------------------------------------------** 問題:正在面臨的異常,是否需要暴露出來* - 不需要暴露:try...catch捕獲* - 需要暴露:拋出異常*/public static void main(String[] args) {//1、try...catch捕獲異常System.out.println("開始");try {System.out.println(10/0); // new ArithmeticException();}catch (ArithmeticException e){System.out.println("捕獲了運算異常");}System.out.println("結束");}
}
(3)總結
2.3 自定義異常
package com.itheima.expection.handle;/*** 自定義運行異常*/public class MyException extends RuntimeException{public MyException() {}public MyException(String message) {super(message);}
}
package com.itheima.expection.handle;import java.util.Scanner;public class HandleDemo2 {/*** 使用自定義異常**/public static void main(String[] args) {try {myFunction();//此方法會拋出自定義的異常} catch (MyException e) {System.out.println(e.getMessage());}}public static void myFunction(){throw new MyException("我的自定義異常");}
}