day09-常用API異常

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):從給定字符串的開始解析文本以生成日期
  • 示例代碼

    /*** 日期格式轉換*/
    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,

    判斷用戶有沒有成功參與秒殺活動

  • 實現步驟

    1. 判斷下單時間是否在開始到結束的范圍內
    2. 把字符串形式的時間變成毫秒值
  • 代碼實現

    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 遞歸排序【理解】

遞歸調用是用相同的方法去解決更小的問題,直到問題規模小于或等于某個邊界條件時,不再進行遞歸(遞歸的出口),而是直接處理,然后不斷向下執行函數返回結果。

  • 分治法
  1. 當問題小到一定規模時,可以直接求解;一個一個 兩兩比較 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}中,查找某個元素的位置。

  • 實現步驟

    1. 定義兩個變量,表示要查找的范圍。默認min = 0 ,max = 最大索引
    2. 循環查找,但是min <= max
    3. 計算出mid的值
    4. 判斷mid位置的元素是否為要查找的元素,如果是直接返回對應索引
    5. 如果要查找的值在mid的左半邊,那么min值不變,max = mid -1.繼續下次循環查找
    6. 如果要查找的值在mid的右半邊,那么max值不變,min = mid + 1.繼續下次循環查找
    7. 當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等
    1. 構造方法用 private 修飾
    2. 成員用 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的區別。

    throwsthrow
    用在方法聲明后面,跟的是異常類名用在方法體內,跟的是異常對象名
    調用的時候,別人聲明了,我們必須跟著聲明。如果不聲明那么必須處理掉
    表示聲明異常,調用該方法有可能會出現這樣的異常表示手動拋出異常對象,由方法體內的語句處理
  • 示例代碼

    • 模擬數組 空指針異常。
    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("你訪問的數組索引不存在,請回去修改為正確的索引");}}
    }
    
  • 注意

    1. 如果 try 中沒有遇到問題,怎么執行?

      會把try中所有的代碼全部執行完畢,不會執行catch里面的代碼

    2. 如果 try 中遇到了問題,那么 try 下面的代碼還會執行嗎?

      那么直接跳轉到對應的catch語句中,try下面的代碼就不會再執行了
      當catch里面的語句全部執行完畢,表示整個體系全部執行完全,繼續執行下面的代碼

    3. 如果出現的問題沒有被捕獲,那么程序如何運行?

      那么try…catch就相當于沒有寫.那么也就是自己沒有處理.
      默認交給虛擬機處理.

    4. 同時有可能出現多個異常怎么處理?

      出現多個異常,那么就寫多個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歲,

    超出這個范圍是異常數據不能賦值.需要重新錄入,一直錄到正確為止。

  • 實現步驟

    1. 創建學生對象。
    2. 鍵盤錄入姓名和年齡,并賦值給學生對象。
    3. 如果是非法數據就再次錄入。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. 定義異常類
    2. 寫繼承關系
    3. 提供空參構造
    4. 提供帶參構造
  • 代碼實現

    異常類

    /*** 自定義異常*/
    //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);}
    }
    

每日總結

  1. 日期

    1. Date 構造方法、setTime getTime
    2. SimpleDateFormat
      1. String ->Date
      2. Date ->String
  2. 數組的高級操作

    1. 二分法(理解)
    2. 冒泡排序(理解)
    3. Arrays 數組工具類
  3. 遞歸思想

    1. 方法自己調用自己
    2. 前提:必須要有出口,沒有出口就會內存溢出。
    3. 先一層一層進去,觸底反彈,一層一層計算!
  4. 異常

    1. 概念:

    2. 異常分類:

      1. 在這里插入圖片描述

      2. 異常處理

        1. 聲明異常 throws
        2. 主動拋出異常 throw
        3. 處理異常 try{}catch(){}
        4. finally - 最終保底處理方案

能力目標

隨堂案例寫一下

  1. 二分法查找算法

  2. 冒泡排序

  3. Arrays-API練習

  4. 遞歸法求出10的階乘

  5. 歸并排序(理解)

  6. 日期轉換練習

    1. 把當前日期,以2022年02月02日 12時12分12秒格式,輸出到控制臺.
    2. 把2022年02月02日 12時12分12秒 格式字符串,轉換為Date對象.
    3. 把當前日期,以2022/02/02 12:12:12秒格式,輸出到控制臺.
    4. 把2022/02/02 格式字符串,轉換為Date對象.
  7. 異常年齡小練習

  8. 轉賬異常練習

  9. 步驟:

    • 自定義余額不足異常類
    • 定義用戶類、轉賬工具類(工具類中完成錢的減少和增加操作)
    • 寫demo測試
      • 定義張三 李四 張三給李四轉賬。測試張三余額不足情況。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10695.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10695.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10695.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【大數據】HDFS

文章目錄 [toc]HDFS 1.0NameNode維護文件系統命名空間存儲元數據解決NameNode單點問題 SecondaryNameNode機架感知數據完整性校驗校驗和數據塊檢測程序DataBlockScanner HDFS寫流程HDFS讀流程HDFS與MapReduce本地模式Block大小 HDFS 2.0NameNode HANameNode FederationHDFS Sna…

使用注解的方式進行配置RabbitMQ

引入依賴&#xff1a; <dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit-test</artifactId><scope>test</scope></dependency> 配置application.yml server:port: 8082 spring:rabbitmq…

pyqt5報錯:AttributeError: ‘mywindow‘ object has no attribute ‘setCentralWidget‘

第一種解決方法是&#xff1a;AttributeError: ‘mywindow‘ object has no attribute ‘setCentralWidget‘_attributeerror: mywindow object has no attribute-CSDN博客 第二種解決方法是&#xff08;推薦&#xff09;&#xff1a; 直接把這段代碼復制在 ui轉 py文件的后面…

什么是JVM中的程序計數器

在計算機的體系結構中&#xff1a; 程序計數器&#xff08;Program Counter&#xff09;&#xff0c;通常縮寫為 PC&#xff0c;是計算機體系結構中的一個寄存器&#xff0c;用于存儲下一條指令的地址。程序計數器是控制單元的一部分&#xff0c;它的作用是確保程序能夠按正確…

用 Python 和 AkShare 進行個股數據清洗:簡易多功能方法

標題:用 Python 和 AkShare 進行個股數據清洗:簡易多功能方法 簡介: 本文介紹了如何使用 Python 和 AkShare 庫對個股數據進行清洗和處理。個股數據經常需要進行清洗以用于分析、建模或可視化。我們將介紹一些簡單但功能強大的方法,包括數據加載、缺失值處理、重復值檢測和…

心理應用工具包 psychtoolbox 繪制小球走迷宮

psychtoolbox 是 MATLAB 中的一個工具包&#xff0c;對于科研人員設計實驗范式來說是不二之選&#xff0c;因為它可以操作計算機的底層硬件&#xff0c;精度可以達到幀的級別。 文章目錄 一、實驗目的二、psychtoolbox 的下載安裝三、Psychtoolbox 的基本使用四、完整代碼 一、…

不同數據類型的內部秘密----編程內幕(2)

Q&#xff1a; char類型是如何被當成int處理的&#xff1f; A: 我們可以看看char類型變量在何時才會被當做int處理. #include <stdio.h>int main() {char ch;ch a;printf("%c\n", ch);return 0; } 匯編代碼如下&#xff1a; hellomain:0x100000f60 <0&…

修改了環境變量~/.bashrc后 報錯 命令 “dirname” 可在以下位置找到 * /bin/dirname * /usr/bin/dirname

問題如下&#xff1a; 修改了~/.bashrc后加入了環境變量之后報錯&#xff0c;如下所示 (base) jiedell:~/桌面$ source ~/.bashrc 命令 “dirname” 可在以下位置找到 * /bin/dirname * /usr/bin/dirname 由于 /usr/bin:/bin 不在 PATH 環境變量中&#xff0c;故無法找到該…

在Linux上安裝并啟動Redis

目錄 安裝gcc環境 上傳redis文件方法一&#xff1a;sftp 上傳redis文件方法二&#xff1a;wget 啟動redis-server ctrlc關閉redis-server 參考文章&#xff1a;Linux 安裝 Redis 及踩坑 - 敲代碼的阿磊 - 博客園 (cnblogs.com) 準備&#xff1a;打開VMware Workstation&am…

pair對組創建

創建方式1: pair<type,type> p(value1,value2); pair<string, int> p("Tom", 20); cout << "name:" << p.first << "age:" << p.second << endl; 創建方式2: pair<type,type> pmake_pair(v…

mysql權限分類

USAGE --無權限,只有登錄數據庫,只可以使用test或test_*數據庫 ALL --所有權限 select/update/delete/super/slave/reload --指定的權限 with grant option --允許把自己的權限授予其它用戶(此用戶擁有建立賬號的權限) 權限級別&#xff1a; 1、. &#xff0d;&#xff0d;全…

C語法:for循環執行順序

今天下編寫代碼時遇到了如下情況&#xff1a;期望是輸出 i1,j2 i1,j3 i1,j4 i2,j3 int main(void) {int i,j;for(i1;i<3;i){for(j1;j!i&&j<4;j){printf("i%d,j%d\n",i,j);}}return 0; }實際輸出結果&#xff1a; i2,j1 分析上述代碼&#xff1a…

商務分析方法與工具(九):Python的趣味快捷-Pandas處理公司財務數據集思路

Tips&#xff1a;"分享是快樂的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不僅有知識的海洋&#x1f30a;&#xff0c;還有滿滿的正能量加持&#x1f4aa;&#xff0c;快來和我一起分享這份快樂吧&#x1f60a;&#xff01; 喜歡我的博客的話&#xff0c;記得…

LangChain:大模型框架的深度解析與應用探索

在數字化的時代浪潮中&#xff0c;人工智能技術正以前所未有的速度蓬勃發展&#xff0c;而大模型作為其中的翹楚&#xff0c;以生成式對話技術逐漸成為推動行業乃至整個社會進步的核心力量。再往近一點來說&#xff0c;在公司&#xff0c;不少產品都戴上了人工智能的帽子&#…

初識C語言——第十八天

循環while/do while while 語法結構 while(表達式) 循環語句; break:在while循環中&#xff0c;break用于永久的終止循環 continue:在while循環中&#xff0c;continue的作用是跳過本次循環continue后面的代碼 直接去判斷部分&#xff0c;看是否進行下一次循環。 注意事項…

Logstash詳解

Logstash詳解&#xff1a;構建強大日志收集與處理管道的利器 一、引言 在大數據和云計算的時代&#xff0c;日志數據作為企業運營和故障排查的重要依據&#xff0c;其收集、處理和分析能力顯得尤為重要。Logstash&#xff0c;作為一款強大的日志收集、處理和轉發工具&#xf…

[AI OpenAI-doc] 安全最佳實踐

使用我們的免費 Moderation API OpenAI 的 Moderation API 是免費使用的&#xff0c;可以幫助減少您完成中不安全內容的頻率。或者&#xff0c;您可能希望開發自己的內容過濾系統&#xff0c;以適應您的使用情況。 對抗性測試 我們建議對您的應用進行“紅隊測試”&#xff0…

即插即用篇 | YOLOv8引入軸向注意力 Axial Attention | 多維變換器中的軸向注意力

本改進已集成到 YOLOv8-Magic 框架。 我們提出了Axial Transformers,這是一個基于自注意力的自回歸模型,用于圖像和其他組織為高維張量的數據。現有的自回歸模型要么因高維數據的計算資源需求過大而受到限制,要么為了減少資源需求而在分布表達性或實現的便捷性上做出妥協。相…

解決wangEditor使用keep-alive緩存后,調用editor.cmd.do()失敗

前提&#xff1a;wangeditor版本&#xff1a;4.7.11 vue版本&#xff1a;vue2 問題&#xff1a;在使用wangeditor富文本編輯器時&#xff0c;需求需要通過點擊一個按鈕&#xff0c;手動插入定義好的內容&#xff0c;所以使用了 editor.cmd.do(insertHTML, ....) 方法新增…

青少年軟件編程(Python)等級考試試卷(二級)2024年3月

2024.03電子學會青少年軟件編程 Python二級 等級考試試卷 一、單選題 1.期末考試結束了&#xff0c;全班的語文成績都儲存在列表score 中&#xff0c;班主任老師請小明找到全班最高分&#xff0c;小明準備用Python 來完成&#xff0c;以下哪個選項&#xff0c;可以獲取最高分…