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