福田附近公司做網(wǎng)站建設哪家效益快seo教程下載
今日內(nèi)容
上課同步視頻:CuteN饕餮的個人空間_嗶哩嗶哩_bilibili
同步筆記沐沐霸的博客_CSDN博客-Java2301
零、 復習昨日
一、作業(yè)
二、異常
三、自定義異常
零、 復習昨日
見晨考
一、作業(yè)
package com.qf.homework;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;/*** --- 天道酬勤 ---** @author QiuShiju* @desc*/
public class TestBirthday2 {// 變式擴展,輸入身份證號確定截止今天是否成年/*** 思路:* 1. 如果年份相減小于17,肯定未成年* 2. 如果年份相減大于18,肯定成年* 3. 如果年份相減等于18,還需要判斷月份和日*/public static void main(String[] args) throws ParseException {printInfo("410112200502220104");}/*** 以身份證號輸出個人信息*/public static void printInfo(String idStr) throws ParseException {// 校驗身份證號規(guī)則(長度18位)if (idStr.length( ) != 18) {System.out.println("身份證號有誤!");return;}// 410112202210250103String birthdayStr = idStr.substring(6, 14);// 字符串變?nèi)掌?/span>SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");Date birthday = sdf.parse(birthdayStr);// 將日期轉(zhuǎn)成日歷Calendar calendar = Calendar.getInstance( );calendar.setTime(birthday);// 通過日歷信息獲得,年月日int year = calendar.get(Calendar.YEAR);int month = calendar.get(Calendar.MONTH) + 1;int day = calendar.get(Calendar.DAY_OF_MONTH);// System.out.println(year+"-"+month+"-"+day );// 獲得當前時間Calendar now = Calendar.getInstance( );int nowYear = now.get(Calendar.YEAR);int nowMonth = now.get(Calendar.MONTH) + 1;int nowDay = now.get(Calendar.DAY_OF_MONTH);// System.out.println(nowYear+"-"+nowMonth+"-"+nowDay );boolean flag = false;// 先判斷年份差值if (Math.abs(nowYear - year) > 18) {// System.out.println("成年" );flag = true;} else if (Math.abs(nowYear - year) < 18) {//System.out.println("未成年" );} else {if (month < nowMonth) {//System.out.println("成年" );flag = true;} else if (month > nowMonth) {//System.out.println("未成年" );} else {if (day <= nowDay) {//System.out.println("成年" );flag = true;} else {//System.out.println("未成年" );}}}if (flag) {System.out.println("成年" );} else {System.out.println("未成年" );}}
}
計算是否成年, 方案二: 毫秒值計算
變式題: 輸入身份證號,計算該人在世多少天
二、異常
2.1 介紹
異常,就是程序出現(xiàn)的不正常的情況.
2.2 分類
在java程序設計中,關于異常有一大類,叫做Throwable
其下又有兩個分類: Error,ExceptionError: 程序出現(xiàn)的嚴重問題,且只能拋出(throw),不能試圖捕獲(try catch)
Exception: 是程序出現(xiàn)的問題,可以捕獲可以拋出
ps: 編譯期又叫 受檢查異常,運行時異常又叫不受檢查異?!?/p>
總結(jié)目前見過的異常
ArithmeticException 算術異常
ArrayIndexOutOfBoundsException 數(shù)組下標越界異常
NullPointerException 空指針異常
ClassCastException 類轉(zhuǎn)換異常
StringIndexOutOfBoundsException 字符串下標越界
NumberFormatException 數(shù)字格式化錯誤
ParseException 解析異常
2.3 異常的產(chǎn)生
在代碼內(nèi)部使用throw 異常對象,來產(chǎn)生異常.
public static void main(String[] args) {test();}public static void test() {System.out.println("xxx" );int a = 1;if(a > 0) {// 拋出一個異常對象throw new ArrayIndexOutOfBoundsException( );//throw new ParseException("Unparseable date: ",1);//throw new FileNotFoundException( );//throw new 異常類();}}
2.4 編譯期異常&運行期異常
運行期異常: 代碼執(zhí)行時
可能會出錯 , 程序中出現(xiàn)的運行時異常沒有強制
處理… ,默認采取拋出處理異常
編譯期異常: 代碼編譯時
可能會出錯,程序中出現(xiàn)編譯期異常,就會強制要求處理
…
2.5 異常的處理
異常的處理的只有兩種方案:
- 拋出(throws)
- 試圖捕獲(try catch)
2.5.1 拋出
拋出: 是將異常在方法簽名上聲明拋出.
public void test() throws 異常類名,異常類名2,....{... }
在方法參數(shù)列表后,使用throws 加 異常類名來聲明拋出異常
且允許聲明多個異常類,中間用逗號隔開
// 聲明拋出異常public static void test4() throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");Date date = sdf.parse("20220101");System.out.println("后續(xù)" );}
拋出異常,拋給誰? 誰調(diào)用這個方法,異常就拋出誰,那么這個調(diào)用者就要繼續(xù)再處理異?!?/p>
拋出異常后,有什么影響? 拋出異常后,異常處后續(xù)代碼不再執(zhí)行!!!
總結(jié)
throw | throws | |
---|---|---|
位置 | ||
后面 | ||
作用 |
handle 處理
2.5.2 試圖捕獲
試圖捕獲 try … catch…
try{// 可能會出現(xiàn)異常的代碼
}catch(異常類名 e) {e.xxx();
}
----------
try里面包裹代碼,如果其中代碼出現(xiàn)異常,就會被catch抓住,需要拋出異常和catch后聲明的異常同一類型才可以抓住,否則抓不住! 如果try里面的代碼沒有任何報錯,catch內(nèi)的代碼不執(zhí)行!----------
catch還可以同時聲明多個異常類,特別強調(diào)不是同時抓多個異常對象!!因為根本就不可能產(chǎn)生多個異常對象,因為try內(nèi)部一旦出現(xiàn)異常,try內(nèi)部的后面不執(zhí)行了... ----------
雖然可以同時聲明多個異常類,但是很麻煩,一般可以直接寫一個最大異常Exception
無論try…catch代碼有沒有錯誤,其結(jié)構(gòu)后面的代碼一定會執(zhí)行!!!
// 捕獲異常public static void test5() {SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");try{Date date = sdf.parse("20220101");}catch (ParseException e) {System.out.println("日期解析出錯!" );}System.out.println("后續(xù)會執(zhí)行" );}
2.5.3 finally
try{// ...
}catch(Exception e) {// ...
} finally{// ...
}
或者
try{// ...
} finally{// ...
}
// SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");// try{// Date date = sdf.parse("20220101");// }catch (ParseException e) {// System.out.println("日期解析出錯!" );// } finally {// System.out.println("...最終的" );// }try{System.out.println(1 /0);} finally {System.out.println("...最終的" );}
finally這么設計的作用: 為了確保某些代碼必須能執(zhí)行到! 一般就用于釋放資源!
擴展: 配合return一起實現(xiàn)一些特殊的效果…
2.6 異常的應用
應用1:
設計方法時,如果這個方法會經(jīng)常調(diào)用,或者被多次多層調(diào)用,盡量自行捕獲異常,不要拋出!因為一旦拋出,所有使用者都需要處理該異常!
應用2:
方法重寫時子類拋出的異常范圍 小于等于 父類的異常范圍!
特殊的,父類方法沒有異常,子類重寫時也不能拋出異常!!!
2.7 異常的API
最大的父類Throwable類
// 構(gòu)造方法
Throwable(String message) message就是異常信息// 方法
String getMessage() 返回此 throwable 的詳細消息字符串。
void printStackTrace() 將此 throwable 及其追蹤輸出至標準錯誤流。
public static void test7() {//throw new ArithmeticException("這是算術異常");//System.out.println(1/0 );SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");try {sdf.parse("2222/11/21");} catch (ParseException e) {// 將異常信息打印到控制臺// e.printStackTrace( );String message = e.getMessage( ); // 獲得異常信息System.out.println(message );}}
三、自定義異常
只有當對象是Throwable類(或其子類之一)的實例時,才能通過 Java 虛擬機或者 Java
throw
語句拋出
換句話,自定義異常需要繼承Throwable類
一般繼承的是Throwable的子類,
繼承Error那就是有Error對應的特點,即不能捕獲只能拋出!!
繼承Exception,就是Exception對應的特點,可以拋出可以捕獲!!!
繼承RuntimeException那就是運行時異常的特點,可以不用主動處理!!
繼承非RuntimeException及其子類那就是編譯其異常的特點!
演示: 年齡越界異常
- 建類
- 繼承
- 寫構(gòu)造方法
- 在方法內(nèi)部使用異常(產(chǎn)生異常)
- 測試
四、總結(jié)
關于異常,以后常見的是Exception
Error基本見不到,一旦見到就是嚴重問題必須處理
需要分清楚編譯期異常有哪些,運行時期異常有哪些
分清楚: 捕獲異常,拋出異常有特點
自定義異常,在后續(xù)寫項目時會用到最后,關于異常最簡單的處理方案: 順其自然