1.時間日期類
1.1 Date類(應用)
-
計算機中時間原點
1970年1月1日 00:00:00
-
時間換算單位
1秒 = 1000毫秒
-
Date類概述
Date 代表了一個特定的時間,精確到毫秒
-
Date類構造方法
方法名 說明 public Date() 分配一個 Date對象,并初始化,以便它代表它被分配的時間,精確到毫秒 public Date(long date) 分配一個 Date對象,并將其初始化為表示從標準基準時間起指定的毫秒數 -
示例代碼
public class DateDemo01 {public static void main(String[] args) {//public Date():分配一個 Date對象,并初始化,以便它代表它被分配的時間,精確到毫秒Date d1 = new Date();System.out.println(d1);//public Date(long date):分配一個 Date對象,并將其初始化為表示從標準基準時間起指定的毫秒數long date = 1000*60*60;Date d2 = new Date(date);System.out.println(d2);} }
1.2 Date類常用方法(應用)
-
常用方法
方法名 說明 public long getTime() 獲取的是日期對象從1970年1月1日 00:00:00到現在的毫秒值 public void setTime(long time) 設置時間,給的是毫秒值 -
示例代碼
public class DateDemo02 {public static void main(String[] args) {//創建日期對象Date d = new Date();//public long getTime():獲取的是日期對象從1970年1月1日 00:00:00到現在的毫秒值 // System.out.println(d.getTime()); // System.out.println(d.getTime() * 1.0 / 1000 / 60 / 60 / 24 / 365 + "年");//public void setTime(long time):設置時間,給的是毫秒值 // long time = 1000*60*60;long time = System.currentTimeMillis();d.setTime(time);System.out.println(d);} }
1.3 SimpleDateFormat類(應用)
-
SimpleDateFormat類概述
? SimpleDateFormat是一個具體的類,用于以區域設置敏感的方式格式化和解析日期。
? 我們重點學習日期格式化和解析
-
SimpleDateFormat類構造方法
方法名 說明 public SimpleDateFormat() 構造一個SimpleDateFormat,使用默認模式和日期格式 public SimpleDateFormat(String pattern) 構造一個SimpleDateFormat使用給定的模式和默認的日期格式 -
SimpleDateFormat類的常用方法
- 格式化(從Date到String)
- public final String format(Date date):將日期格式化成日期/時間字符串
- 解析(從String到Date)
- public Date parse(String source):從給定字符串的開始解析文本以生成日期
- 格式化(從Date到String)
-
示例代碼
/*** 日期格式轉換*/ public class Demo2 {public static void main(String[] args) throws ParseException {//定義日期格式轉換類 yyyy-MM-dd HH:mm:ssSimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date = new Date();//Date -> StringString format = sdf.format(date);System.out.println(format);//2022-04-20 09:51:48日期字符串,轉換為DateString datestr = "2022-04-20 09:51:48";//String -> DateDate parse = sdf.parse(datestr);System.out.println(parse);//y 年 M 月 d 日 H 小時 m分 s秒//日期之間的連接符可隨便定義-- 有一定的意義SimpleDateFormat sdf1 = new SimpleDateFormat("yy年MM-dd****HH1mm:ss");Date d1 = new Date();String format1 = sdf1.format(d1);System.out.println(format1);} }
tips:一個格式串只能轉換一種格式的日期,不然報異常。
1.4 時間日期類練習 (應用)
-
需求
秒殺開始時間是2020年11月11日 00:00:00,
結束時間是2020年11月11日 00:10:00,
用戶小賈下單時間是2020年11月11日 00:03:47,
用戶小皮下單時間是2020年11月11日 00:10:11,
判斷用戶有沒有成功參與秒殺活動
-
實現步驟
- 判斷下單時間是否在開始到結束的范圍內
- 把字符串形式的時間變成毫秒值
-
代碼實現
public class DateDemo5 {public static void main(String[] args) throws ParseException {//開始時間:2020年11月11日 0:0:0//結束時間:2020年11月11日 0:10:0//小賈2020年11月11日 0:03:47//小皮2020年11月11日 0:10:11//1.判斷兩位同學的下單時間是否在范圍之內就可以了。//2.要把每一個時間都換算成毫秒值。String start = "2020年11月11日 0:0:0";String end = "2020年11月11日 0:10:0";String jia = "2020年11月11日 0:03:47";String pi = "2020年11月11日 0:10:11";SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");long startTime = sdf.parse(start).getTime();long endTime = sdf.parse(end).getTime();// System.out.println(startTime); // System.out.println(endTime);long jiaTime = sdf.parse(jia).getTime();long piTime = sdf.parse(pi).getTime();if(jiaTime >= startTime && jiaTime <= endTime){System.out.println("小賈同學參加上了秒殺活動");}else{System.out.println("小賈同學沒有參加上秒殺活動");}System.out.println("------------------------");if(piTime >= startTime && piTime <= endTime){System.out.println("小皮同學參加上了秒殺活動");}else{System.out.println("小皮同學沒有參加上秒殺活動");}}}
2.遞歸
2.1 遞歸【應用】
-
遞歸的介紹
- 以編程的角度來看,遞歸指的是方法定義中調用方法本身的現象。
- 把一個復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解。
- 遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算。
-
遞歸的基本使用
-
1- 100之間的和。
/*** 1- 100之間的和。*/ public class Demo1 {public static void main(String[] args) {int s = getSum(5);System.out.println(s);}//1-100 1+2 2+3 把計算規模降低到最小。用小規模解決大規模問題private static int getSum(int i) { // 1-100 // 100 + 99 i=100 + 100-1 // +98 i=199 + 98 // +97 // +96if(i==1){return 1;//程序出口}else {//1+2+3+4+5return i+getSum(i-1);//遞歸會一層一層的進去,到底后(出口),在返回來一層一層計算}} }
-
遞歸的注意事項
- 遞歸一定要有出口。否則內存溢出。
- 遞歸雖然有出口,但是遞歸的次數也不宜過多。否則內存溢出。
2.2 遞歸求階乘【應用】
-
案例需求
? 用遞歸求5的階乘,并把結果在控制臺輸出。
5!=5*4*3*2*1 6!=6*5*4*3*2*1
-
代碼實現
/*** 用遞歸求5的階乘,并把結果在控制臺輸出。*/ public class Demo2 {public static void main(String[] args) {int r = jc(5);System.out.println(r);}private static int jc(int i) { // 1*2 // 1*2*3 // 1*2*3*4 // 1*2*3*4*5//出口if(i==1){return 1;//底}else {return i*jc(i-1);//先進入到底,在反過來計算}} }
-
內存圖
2.2 遞歸排序【理解】
遞歸調用是用相同的方法去解決更小的問題,直到問題規模小于或等于某個邊界條件時,不再進行遞歸(遞歸的出口),而是直接處理,然后不斷向下執行函數返回結果。
- 分治法
- 當問題小到一定規模時,可以直接求解;一個一個 兩兩比較 44比較 88比較形成一個新的數字。
2. 當問題規模較大時,可以分解為若干個相互獨立的子問題,這些子問題與原問題具有相同的特征。若不能直接解決,則可分別遞歸求解;
3. 原問題的解是子問題的解的組合。
/*** 歸并排序** @param array* @return*/
public static int[] MergeSort(int[] array) {if (array.length < 2) return array;//分治 對折小于兩個,只有一個元素無法對折。int mid = array.length / 2;//去取中間數的索引int[] left = Arrays.copyOfRange(array, 0, mid);int[] right = Arrays.copyOfRange(array, mid, array.length);return merge(MergeSort(left), MergeSort(right));
}
/*** 歸并排序——將兩段排序好的數組結合成一個排序數組** @param left* @param right* @return*/
public static int[] merge(int[] left, int[] right) {int[] result = new int[left.length + right.length];for (int index = 0, i = 0, j = 0; index < result.length; index++) {//比較 賦值if (i >= left.length)result[index] = right[j++];else if (j >= right.length)result[index] = left[i++];else if (left[i] > right[j])result[index] = right[j++];elseresult[index] = left[i++];}return result;
}
[十大經典排序算法最強總結(含JAVA代碼實現) - 郭耀華 - 博客園 (cnblogs.com)](https://www.cnblogs.com/guoyaohua/p/8600214.html#:~:text=十大經典排序算法最強總結(含JAVA代碼實現) 1 、排序算法說明 2 、冒泡排序(Bubble Sort) 3 、選擇排序(Selection,、計數排序(Counting Sort) 10 、桶排序(Bucket Sort) More items… )
3.數組的高級操作
3.1 二分查找 (理解)
-
二分查找概述
查找指定元素在數組中的位置時,以前的方式是通過遍歷,逐個獲取每個元素,看是否是要查找的元素,這種方式當數組元素較多時,查找的效率很低。
二分查找也叫折半查找,每次可以去掉一半的查找范圍,從而提高查找的效率。
-
前提
數組{1,2,3,4,5,6,7,8,9,10},必須是順序數組。
-
需求
在數組{1,2,3,4,5,6,7,8,9,10}中,查找某個元素的位置。
-
實現步驟
- 定義兩個變量,表示要查找的范圍。默認min = 0 ,max = 最大索引
- 循環查找,但是min <= max
- 計算出mid的值
- 判斷mid位置的元素是否為要查找的元素,如果是直接返回對應索引
- 如果要查找的值在mid的左半邊,那么min值不變,max = mid -1.繼續下次循環查找
- 如果要查找的值在mid的右半邊,那么max值不變,min = mid + 1.繼續下次循環查找
- 當min > max 時,表示要查找的元素在數組中不存在,返回-1.
-
代碼實現
public class MyBinarySearchDemo {public static void main(String[] args) {int [] arr = {1,2,3,4,5,6,7,8,9,10};int number = 11;//1,我現在要干嘛? --- 二分查找//2.我干這件事情需要什么? --- 數組 元素//3,我干完了,要不要把結果返回調用者 --- 把索引返回給調用者int index = binarySearchForIndex(arr,number);System.out.println(index);}private static int binarySearchForIndex(int[] arr, int number) {//1,定義查找的范圍int min = 0;int max = arr.length - 1;//2.循環查找 min <= maxwhile(min <= max){//3.計算出中間位置 midint mid = (min + max) >> 1;//mid指向的元素 > numberif(arr[mid] > number){//表示要查找的元素在左邊.max = mid -1;}else if(arr[mid] < number){//mid指向的元素 < number//表示要查找的元素在右邊.min = mid + 1;}else{//mid指向的元素 == numberreturn mid;}}//如果min大于了max就表示元素不存在,返回-1.return -1;}}
-
注意事項
有一個前提條件,數組內的元素一定要按照大小順序排列,如果沒有大小順序,是不能使用二分查找法的。
3.2 冒泡排序 (理解)
-
冒泡排序概述
一種排序的方式,對要進行排序的數據中相鄰的數據進行兩兩比較,將較大的數據放在后面,依次對所有的數據進行操作,直至所有數據按要求完成排序
如果有n個數據進行排序,總共需要比較n-1次
每一次比較完畢,下一次的比較就會少一個數據參與
-
代碼實現
public class MyBubbleSortDemo2 {public static void main(String[] args) {int[] arr = {3, 5, 2, 1, 4};//1 2 3 4 5bubbleSort(arr);}private static void bubbleSort(int[] arr) {//外層循環控制的是次數 比數組的長度少一次.for (int i = 0; i < arr.length -1; i++) {//內存循環就是實際循環比較的//-1 是為了讓數組不要越界//-i 每一輪結束之后,我們就會少比一個數字.for (int j = 0; j < arr.length - 1 - i; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}printArr(arr);}private static void printArr(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}}
3.3 Arrays (應用)
-
Arrays的常用方法
方法名 說明 public static String toString(int[] a) 返回指定數組的內容的字符串表示形式 public static void sort(int[] a) 按照數字順序排列指定的數組 public static int binarySearch(int[] a, int key) 利用二分查找返回指定元素的索引 public static int[] copyOfRange(int[] original,int form,int to) 將指定數組的指定范圍復制到新數組中。 -
示例代碼
public class MyArraysDemo {public static void main(String[] args) {//| public static String toString(int[] a) | 返回指定數組的內容的字符串表示形式 | // int[] arr = {3,2,1}; // String s = Arrays.toString(arr); // System.out.println(s);//| public static void sort(int[] a) | 按照數字順序排列指定的數組 | // int[] arr = {3,2,1,4,6,5}; // Arrays.sort(arr); // System.out.println(Arrays.toString(arr)); //| public static int binarySearch(int[] a, int key) | 利用二分查找返回指定元素的索引 | // int[] arr = {3,2,1,4,6,5};//無序的不能 // int[] arr = {1,2,3,4,5,6,7};//有序 // int i = Arrays.binarySearch(arr, 8);//-7查的值大于數列最大值,返回長度+1的負數 // int i = Arrays.binarySearch(arr, 4);//3 // int i = Arrays.binarySearch(arr, -2);//-1查找的值小于列的最小值, 返回-1//返回為負數,就是找不到! // System.out.println("index="+i);//| public static int[] copyOfRange(int[] original,int form,int to) | 將指定數組的指定范圍復制到新數組中。 |int[] arr = {1,2,3,4,5,6,7};int[] ints = Arrays.copyOfRange(arr, 2, 4);//從2索引開始,到4 [2,4)System.out.println(Arrays.toString(ints));} }}
-
工具類設計思想
- 我們已經學過的工具類
- Objects Arrays Math等
- 構造方法用 private 修飾
- 成員用 public static 修飾
4.異常
異常概述
異常處理方式
自定義異常
4.1 異常(記憶)
-
異常的概述
? 異常就是程序出現了不正常的情況
/*** 演示異常*/ public class EDemo1 {public static void main(String[] args) throws ParseException {//寫代碼不報錯,運行報錯!!!// 運行時異常// String s = null; // System.out.println(s.length());//java.lang.NullPointerException// int[] arr = {1,2,3}; // System.out.println(arr[4]);//java.lang.ArrayIndexOutOfBoundsException// BigDecimal b1 = new BigDecimal("10.0"); // BigDecimal b2 = new BigDecimal("3.0"); // BigDecimal divide = b1.divide(b2);//java.lang.ArithmeticException // System.out.println(divide);//必須要處理的錯誤,處理了以后才能執行// 編譯時異常SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String s = "2020-02-12";Date parse = sdf.parse(s);//這個問題只有處理掉才能執行System.out.println(parse);} }
-
異常的體系結構
4.2 編譯時異常和運行時異常的區別(記憶)
-
編譯時異常
- 都是Exception類及其子類
- 必須顯示處理,否則程序就會發生錯誤,無法通過編譯
-
運行時異常
- 都是RuntimeException類及其子類
- 無需顯示處理,也可以和編譯時異常一樣處理
-
圖示
4.3 JVM默認處理異常的方式(理解)
- 如果程序出現了問題,我們沒有做任何處理,最終JVM 會做默認的處理,處理方式有如下兩個步驟:
- 把異常的名稱,錯誤原因及異常出現的位置等信息輸出在了控制臺
- 程序停止執行
4.4 查看異常信息 (理解)
控制臺在打印異常信息時,會打印異常類名,異常出現的原因,異常出現的位置
我們調bug時,可以根據提示,找到異常出現的位置,分析原因,修改異常代碼2
4.5 throws方式處理異常(應用)
- 概念:
聲明異常。
自己不做處理,讓程序編譯時不報錯,把異常交給調用者處理。
- 格式:
public void 方法() throws 異常類名 {}
-
示例代碼
- 運行時異常(一般不用)
- 編譯時異常
/*** 演示異常 throws* 如果出現問題,再次交給jvm處理。。。,默認機制。*/
public class EDemo2 {public static void main(String[] args) throws ParseException{//必須要處理的錯誤,處理了以后才能執行// 編譯時異常SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String s = "2020/02/12";Date parse = sdf.parse(s);System.out.println(parse);}
}
-
注意事項
- 這個throws格式是跟在方法的括號后面的
- 編譯時異常必須要進行處理,兩種處理方案:try…catch …或者 throws,如果采用 throws 這種方案,在方法上進行顯示聲明,將來誰調用這個方法誰處理。
- 運行時異常因為在運行時才會發生,所以在方法后面可以不寫,運行時出現異常默認交給jvm處理。
4.6 throw拋出異常 (應用)
主動拋出異常。通知別人,我有可能有問題。
-
格式
throw new 異常();
-
注意
這個格式是在方法內的,表示當前代碼手動拋出一個異常,下面的代碼不用再執行了。
-
throws和throw的區別。
throws throw 用在方法聲明后面,跟的是異常類名 用在方法體內,跟的是異常對象名 調用的時候,別人聲明了,我們必須跟著聲明。如果不聲明那么必須處理掉 表示聲明異常,調用該方法有可能會出現這樣的異常 表示手動拋出異常對象,由方法體內的語句處理 -
示例代碼
- 模擬數組 空指針異常。
public class ExceptionDemo8 {public static void main(String[] args) {//int [] arr = {1,2,3,4,5};int [] arr = null;printArr(arr);//就會 接收到一個異常.//我們還需要自己處理一下異常.}private static void printArr(int[] arr) {if(arr == null){//調用者知道成功打印了嗎?//System.out.println("參數不能為null");throw new NullPointerException(); //當參數為null的時候//手動創建了一個異常對象,拋給了調用者,產生了一個異常}else{for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}}}
4.7 try-catch方式處理異常(應用)
-
定義格式
try {可能出現異常的代碼; } catch(異常類名 變量名) {異常的處理代碼; }
-
執行流程
- 程序從 try 里面的代碼開始執行
- 出現異常,就會跳轉到對應的 catch 里面去執行
- 執行完畢之后,程序還可以繼續往下執行
-
示例代碼
public class ExceptionDemo01 {public static void main(String[] args) {System.out.println("開始");method();System.out.println("結束");}public static void method() {try {int[] arr = {1, 2, 3};System.out.println(arr[3]);System.out.println("這里能夠訪問到嗎");} catch (ArrayIndexOutOfBoundsException e) {System.out.println("你訪問的數組索引不存在,請回去修改為正確的索引");}} }
-
注意
-
如果 try 中沒有遇到問題,怎么執行?
會把try中所有的代碼全部執行完畢,不會執行catch里面的代碼
-
如果 try 中遇到了問題,那么 try 下面的代碼還會執行嗎?
那么直接跳轉到對應的catch語句中,try下面的代碼就不會再執行了
當catch里面的語句全部執行完畢,表示整個體系全部執行完全,繼續執行下面的代碼 -
如果出現的問題沒有被捕獲,那么程序如何運行?
那么try…catch就相當于沒有寫.那么也就是自己沒有處理.
默認交給虛擬機處理. -
同時有可能出現多個異常怎么處理?
出現多個異常,那么就寫多個catch就可以了.
注意點:如果多個異常之間存在子父類關系.那么父類一定要寫在下面? 如果不知道子父類關系,根據IDEA提示調整。
-
4.8 try-catch-finally
finally{代碼塊}
不管有沒有異常都會執行finally里面的代碼。
語法
try{}finally{}
try{}catch(異常類 參數名){}finally{}
格式一:
try {System.out.println(1);//可能出現異常的代碼int arr[] = new int[5];System.out.println(arr[6]);
}finally {System.out.println("宇航員安全!");
}格式二:
try {System.out.println(1);//可能出現異常的代碼int arr[] = new int[5];System.out.println(arr[6]);
}catch (ArithmeticException ex){System.out.println("可以控制的異常ArithmeticException");
}finally {System.out.println("宇航員安全!");
}
4.9 Throwable成員方法(應用)
-
常用方法
方法名返回此 throwable 的詳細消息字符串 說明 public String getMessage() 返回此 throwable 的詳細消息字符串 public String toString() 返回此可拋出的簡短描述 public String getCause() 返回此 throwable 的異常原因。 public void printStackTrace() 把異常的錯誤信息輸出在控制臺 -
示例代碼
public class ExceptionDemo02 {public static void main(String[] args) {System.out.println("開始");method();System.out.println("結束");}public static void method() {try {int[] arr = {1, 2, 3};System.out.println(arr[3]); //new ArrayIndexOutOfBoundsException();System.out.println("這里能夠訪問到嗎");} catch (ArrayIndexOutOfBoundsException e) { //new ArrayIndexOutOfBoundsException(); // e.printStackTrace();//public String getMessage():返回此 throwable 的詳細消息字符串 // System.out.println(e.getMessage());//Index 3 out of bounds for length 3//public String toString():返回此可拋出的簡短描述 // System.out.println(e.toString());//java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3//public void printStackTrace():把異常的錯誤信息輸出在控制臺e.printStackTrace(); // java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 // at com.gaohe_02.ExceptionDemo02.method(ExceptionDemo02.java:18) // at com.gaohe_02.ExceptionDemo02.main(ExceptionDemo02.java:11)}} }
try{}catch(){}
try{}catch(){}catch(){}
try{}catch(){}catch(){}finally{}
try{}finally{}
4.10 異常的練習 (應用)
-
需求
鍵盤錄入學生的姓名和年齡,其中年齡為18 - 25歲,
超出這個范圍是異常數據不能賦值.需要重新錄入,一直錄到正確為止。
-
實現步驟
- 創建學生對象。
- 鍵盤錄入姓名和年齡,并賦值給學生對象。
- 如果是非法數據就再次錄入。while
-
代碼實現
學生類
public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {if(age >= 18 && age <= 25){this.age = age;}else{//當年齡不合法時,產生一個異常throw new RuntimeException("年齡超出了范圍");}}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';} }
測試類
public class ExceptionDemo12 {public static void main(String[] args) {// 鍵盤錄入學生的姓名和年齡,其中年齡為 18 - 25歲,// 超出這個范圍是異常數據不能賦值.需要重新錄入,一直錄到正確為止。Student s = new Student();Scanner sc = new Scanner(System.in);System.out.println("請輸入姓名");String name = sc.nextLine();s.setName(name);while(true){System.out.println("請輸入年齡");String ageStr = sc.nextLine();try {int age = Integer.parseInt(ageStr);s.setAge(age);break;} catch (NumberFormatException e) {System.out.println("請輸入一個整數");continue;} catch (AgeOutOfBoundsException e) {System.out.println(e.toString());System.out.println("請輸入一個符合范圍的年齡");continue;}/*if(age >= 18 && age <=25){s.setAge(age);break;}else{System.out.println("請輸入符合要求的年齡");continue;}*/}System.out.println(s);} }
4.11 自定義異常(應用)
-
自定義異常概述
當Java中提供的異常不能滿足我們的需求時,我們可以自定義異常
-
實現步驟
- 定義異常類
- 寫繼承關系
- 提供空參構造
- 提供帶參構造
-
代碼實現
異常類
/*** 自定義異常*/ //1. 繼承RuntimeException public class AgeOutOfBoundsException extends RuntimeException { // 2. 重寫構造器public AgeOutOfBoundsException() {}public AgeOutOfBoundsException(String message) {super(message);} }
學生類
public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {if(age >= 18 && age <= 25){this.age = age;}else{//如果Java中提供的異常不能滿足我們的需求,我們可以使用自定義的異常throw new AgeOutOfBoundsException("年齡超出了范圍");}}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';} }
測試類
/*** 鍵盤錄入學生的姓名和年齡,其中年齡為18 - 25歲,** 超出這個范圍是異常數據不能賦值.需要重新錄入,一直錄到正確為止。*/ public class Demo1 {public static void main(String[] args) {//定義一個學生對象Student s = new Student();//定義一個鍵盤錄入對象Scanner sc = new Scanner(System.in);//System.out.println("請輸入一個姓名:");String name = sc.nextLine();s.setName(name);while (true){try {System.out.println("請輸入一個年齡:");String age_ = sc.nextLine();int age = Integer.parseInt(age_);s.setAge(age);break;//出口} catch (NumberFormatException e) {System.out.println("年齡輸入格式不對 case:"+e.getMessage());} // catch (RuntimeException e){ // System.out.println(e.getMessage()); // }catch (AgeOutOfBoundsException e){System.out.println(e.getMessage());}}System.out.println(s);} }
每日總結
-
日期
- Date 構造方法、setTime getTime
- SimpleDateFormat
- String ->Date
- Date ->String
-
數組的高級操作
- 二分法(理解)
- 冒泡排序(理解)
- Arrays 數組工具類
-
遞歸思想
- 方法自己調用自己
- 前提:必須要有出口,沒有出口就會內存溢出。
- 先一層一層進去,觸底反彈,一層一層計算!
-
異常
-
概念:
-
異常分類:
-
-
異常處理
- 聲明異常 throws
- 主動拋出異常 throw
- 處理異常 try{}catch(){}
- finally - 最終保底處理方案
-
-
能力目標
隨堂案例寫一下
-
二分法查找算法
-
冒泡排序
-
Arrays-API練習
-
遞歸法求出10的階乘
-
歸并排序(理解)
-
日期轉換練習
- 把當前日期,以2022年02月02日 12時12分12秒格式,輸出到控制臺.
- 把2022年02月02日 12時12分12秒 格式字符串,轉換為Date對象.
- 把當前日期,以2022/02/02 12:12:12秒格式,輸出到控制臺.
- 把2022/02/02 格式字符串,轉換為Date對象.
-
異常年齡小練習
-
轉賬異常練習
-
步驟:
- 自定義余額不足異常類
- 定義用戶類、轉賬工具類(工具類中完成錢的減少和增加操作)
- 寫demo測試
- 定義張三 李四 張三給李四轉賬。測試張三余額不足情況。