使用異常處理程序錯(cuò)誤_第1頁
已閱讀1頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、使用異常處理程序錯(cuò)誤,第十五講,2,回顧,什么是常量?Java中,常量的定義規(guī)則有哪些?什么是面向接口編程,它的好處是什么?,3,預(yù)習(xí)檢查,什么是異常?Java中,如何進(jìn)行異常處理?請(qǐng)說明throw 與 throws的區(qū)別與聯(lián)系?,4,本章任務(wù),升級(jí)Hello,完成如下功能:根據(jù)課程代碼輸出課程名稱輸出各學(xué)期平均課時(shí)等信息使用log4j記錄異常日志,5,掌握J(rèn)ava的異常處理機(jī)制運(yùn)用 try 、catch 、 final

2、ly 處理異常運(yùn)用 throw 拋出異常運(yùn)用 throws 聲明異常掌握log4j的用法,能夠記錄異常日志,本章目標(biāo),6,生活中的異常,正常情況下,小王每日開車去上班,耗時(shí)大約30分鐘,但是,異常情況遲早要發(fā)生!,一路暢通,,堵車!,撞車!,7,程序中的異常,public class Hello {public static void main(String[] args) {System.out.print("請(qǐng)輸

3、入課程代號(hào)(1至3之間的數(shù)字):");Scanner in = new Scanner(System.in);int courseCode = in.nextInt(); // 從鍵盤輸入整數(shù)switch (courseCode) {case 1:System.out.println("C#編程"); break;case 2:System.out.println("Java編程&

4、quot;); break;case 3:System.out.println("SQL基礎(chǔ)"); }}},輸入:2輸出:Java編程,輸入:B程序中斷運(yùn)行!,正常情況:,異常情況:,8,什么是異常,異常就是在程序的運(yùn)行過程中所發(fā)生的不正常的事件,它會(huì)中斷正在運(yùn)行的程序,繞行或者等待,請(qǐng)求交警解決,異常!,面對(duì)異常該怎么辦呢?通常情況下,我們會(huì)這樣處理:,程序運(yùn)行,程序中斷運(yùn)行,,堵車!,撞車!,生活

5、中,我們會(huì)根據(jù)不同的異常進(jìn)行相應(yīng)的處理,而不會(huì)就此中斷我們的生活,9,什么是異常處理,Java語言使用異常處理機(jī)制為程序提供了錯(cuò)誤處理的能力,程序中預(yù)先想好了 對(duì)付異常的處理辦法,異常!,程序運(yùn)行,處理完畢,程序繼續(xù)運(yùn)行,對(duì)異常進(jìn)行處理,10,Java中如何進(jìn)行異常處理,Java的異常處理是通過5個(gè)關(guān)鍵字來實(shí)現(xiàn)的:try、catch、 finally、throw、throws,捕獲異常,catch,try,finally,執(zhí)行可能產(chǎn)生

6、 異常的代碼,捕獲異常,無論是否發(fā)生異常,代碼總能執(zhí)行,手動(dòng)拋出異常,拋出異常,throw,聲明異常,聲明方法可能要拋出的各種異常,throws,11,try/catch塊7-1,,try,catch,try/catch 塊后的代碼段,public void method(){try { // 代碼段(此處不會(huì)產(chǎn)生異常)} catch (異常類型 ex) { // 對(duì)異常進(jìn)行處理的代碼段}// 代碼

7、段},使用try/catch塊捕獲異常,分為三種情況:,,,第一種情況,,12,try/catch塊7-2,使用示例模擬第一種情況:,public class Exception {public static void main(String[] args) {System.out.print("請(qǐng)輸入課程代號(hào)(1至3之間的數(shù)字):");Scanner in = new Scanner(System.in);

8、try {int courseCode = in.nextInt();switch (courseCode) {case 1: System.out.println("C#編程"); break;case 2: System.out.println("Java編程"); break;case 3:

9、 System.out.println("SQL基礎(chǔ)");}} catch (Exception ex) { System.out.println("輸入不為數(shù)字!");}System.out.println("歡迎提出建議!");}},輸入:2,Java編程歡迎提出建議!,控制臺(tái)輸出,13,try/catch塊7-3,,try,catch,

10、異常類型匹配,,try/catch 塊后的代碼段,進(jìn)入catch塊,public void method(){try { // 代碼段 1 // 產(chǎn)生異常的代碼段 2 // 代碼段 3} catch (異常類型 ex) { // 對(duì)異常進(jìn)行處理的代碼段4}// 代碼段5},使用try/catch塊捕獲異常,分為三種情況:,,,,,第二種情況,產(chǎn)生異常對(duì)象,程序繼續(xù)執(zhí)行,異常是一種

11、特殊的對(duì)象,類型為java.lang.Exception或其子類,,發(fā)生異常,14,try/catch塊7-4,使用示例模擬第二種情況:,public class Exception {public static void main(String[] args) {System.out.print("請(qǐng)輸入課程代號(hào)(1至3之間的數(shù)字):");Scanner in = new Scanner(System.in)

12、;try {int courseCode = in.nextInt();switch (courseCode) {case 1:System.out.println("C#編程");break;case 2:System.out.println("Java編程");break;case 3:System.out.println("SQL基礎(chǔ)

13、");}} catch (Exception ex) { System.out.println("輸入不為數(shù)字!"); ex.printStackTrace();}System.out.println("歡迎提出建議!");}},輸入:B,輸入不為數(shù)字!異常堆棧信息歡迎提出建議!,控制臺(tái)輸出,15,printStackTrace的堆棧跟蹤功

14、能顯示出程序運(yùn)行到當(dāng)前類的執(zhí)行流程,public class Exception { public static void main(String[] args) { System.out.print("請(qǐng)輸入課程代號(hào)(1至3之間的數(shù)字):"); Scanner in = new Scanner(System.in); try { int cours

15、eCode = in.nextInt(); //此處代碼省略 } catch (Exception ex) { System.out.println("輸入不為數(shù)字!"); ex.printStackTrace(); } System.out.println("歡迎提出建議!");

16、 }},try/catch塊7-5,16,try/catch塊7-6,,try,catch,異常類型不匹配,try/catch 塊后的代碼段,程序中斷運(yùn)行,發(fā)生異常,public void method(){try { // 代碼段 1 // 產(chǎn)生異常的代碼段 2 // 代碼段 3} catch (異常類型 ex) { // 對(duì)異常進(jìn)行處理的代碼段4}// 代碼段5},使用try/c

17、atch塊捕獲異常,分為三種情況:,,,第三種情況,產(chǎn)生異常對(duì)象,,,17,try/catch塊7-7,使用示例模擬第三種情況:,public class Exception2 {public static void main(String[] args) {System.out.print("請(qǐng)輸入課程代號(hào)(1至3之間的數(shù)字):");Scanner in = new Scanner(System.in);t

18、ry {int courseCode = in.nextInt();switch (courseCode) {case 1: System.out.println("C#編程"); break;case 2: System.out.println("Java編程"); break;case 3:

19、 System.out.println("SQL基礎(chǔ)");}} catch (NullPointerException ex) { System.out.println("輸入不為數(shù)字!");}System.out.println("歡迎提出建議!");}},輸入:B,程序中斷運(yùn)行,,18,try/catch/finally 2-1,在try/ca

20、tch塊后加入finally塊,可以確保無論是否發(fā)生異常,finally塊中的代碼總能被執(zhí)行,try 塊,finally 塊,catch 塊,,,無異常,有異常,,19,try/catch/finally 2-2,public class Exception3 {public static void main(String[] args) {System.out.print("請(qǐng)輸入課程代號(hào)(1至3之間的數(shù)字):"

21、;);Scanner in = new Scanner(System.in);try {int courseCode = in.nextInt();switch (courseCode) {case 1: System.out.println("C#編程"); break;case 2: System.out.println("Java編

22、程"); break;case 3: System.out.println("SQL基礎(chǔ)");}} catch (Exception ex) { System.out.println("輸入不為數(shù)字!");} finally { System.out.println("歡迎提出建議!");

23、}}},輸入:2,Java編程歡迎提出建議!,控制臺(tái)輸出,輸入:B,輸入不為數(shù)字!歡迎提出建議!,第一種情況:無異常,第二種情況:有異常,20,小結(jié) 1,編寫一個(gè)類ExceptionTest1,在main方法中使用try、catch、finally:在try塊中,編寫被0除的代碼在catch塊中,捕獲被0除所產(chǎn)生的異常,并且打印異常信息在finally塊中,打印一條語句,21,public void method(){

24、try { // 代碼段 // 產(chǎn)生異常(異常類型2)} catch (異常類型1 ex) { // 對(duì)異常進(jìn)行處理的代碼段} catch (異常類型2 ex) { // 對(duì)異常進(jìn)行處理的代碼段} catch (異常類型3 ex) { // 對(duì)異常進(jìn)行處理的代碼段}// 代碼段},多重catch塊 2-1,一段代碼可能會(huì)引發(fā)多種類型的異常當(dāng)引發(fā)異常時(shí),會(huì)按順序來查看每個(gè)

25、catch 語句,并執(zhí)行第一個(gè)與異常類型匹配的catch語句執(zhí)行其中的一條 catch 語句之后,其后的 catch 語句將被忽略,,try,與異常類型1不匹配,try/catch 塊后的代碼段,發(fā)生異常,,,產(chǎn)生異常對(duì)象,catch,與異常類型2匹配,catch,catch,,程序繼續(xù)執(zhí)行,,,,,進(jìn)入catch塊,22,多重catch塊 2-2,public class Exception4 {public static voi

26、d main(String[] args) {Scanner in = new Scanner(System.in);try{System.out.print(“請(qǐng)輸入S1的總學(xué)時(shí):");int totalTime = in.nextInt(); //總學(xué)時(shí)System.out.print(“請(qǐng)輸入S1的課程數(shù)目:");int totalCourse = in.nextInt();

27、 //課程數(shù)目System.out.println(“S1各課程的平均學(xué)時(shí)為:" + totalTime / totalCourse);} catch (InputMismatchException e1) {System.out.println("輸入不為數(shù)字!");} catch (ArithmeticExcepti

28、on e2) {System.out.println("課程數(shù)目不能為零!");} catch (Exception e) {System.out.println("發(fā)生錯(cuò)誤:"+e.getMessage());}}},輸入:270 H,在安排catch語句的順序時(shí),首先應(yīng)該捕獲最特殊的異常, 然后再逐漸一般化,即先子類后父類,輸出:輸入不為數(shù)字!,進(jìn)入第一個(gè)catch塊,輸入:

29、270 0,輸出:課程數(shù)目不能為零!,進(jìn)入第二個(gè)catch塊,23,拋出異常,如果在當(dāng)前環(huán)境無法解決一個(gè)異常,就要將其拋出,把異常交給調(diào)用者處理,public class Teacher { private String id; // 教員編號(hào),長度應(yīng)為7 public void setId(String pId){ // 判斷教員編號(hào)的長度是否為7 if (pId.length() == 7) {

30、id = pId; } else {throw new IllegalArgumentException("參數(shù)長度應(yīng)為7!"); } }},拋出異常:在不使用try、catch語句或throws的前提下,只可以拋出運(yùn)行時(shí)異常對(duì)象RuntimeException或其子類對(duì)象,如:NullPointerException、IllegalArgumentException等,public class A

31、ccpTeacherTest { public static void main(String[] args) { AccpTeacher teacher = new AccpTeacher(); try {teacher.setId("088"); } catch (IllegalArgumentException ex) {System.out.println(ex.getMessage());

32、 } }},捕獲異常,參數(shù)長度應(yīng)為7!,控制臺(tái)輸出,24,聲明異常,public class Teacher { private String id;// 教員編號(hào),長度應(yīng)為7 public void setId(String pId) throws IllegalArgumentException{ // 判斷教員編號(hào)的長度是否為7 if (pId.length() == 7) {id = pId;

33、 } else {throw new IllegalArgumentException("參數(shù)長度應(yīng)為7!"); } }},public class TeacherTest { public static void main(String[] args) {AccpTeacher teacher = new AccpTeacher();try {teacher.setId("0

34、88");} catch (IllegalArgumentException ex) {System.out.println(ex.getMessage());} }},由調(diào)用者捕獲異常,聲明該方法可能會(huì)產(chǎn)生異常,25,小結(jié) 2,編寫類ExceptionTest2:定義兩個(gè)方法:go()和main() 在go方法中聲明要拋出異常,在該方法體內(nèi),拋出一個(gè)Exception對(duì)象在main()方法中,調(diào)用go方

35、法,使用try/catch捕獲go方法中拋出的異常,26,使用log4j記錄日志信息,public class TeacherTest { public static void main(String[] args) {Teacher teacher = new Teacher(); try {teacher.setId("088"); } catch (IllegalArgumentExceptio

36、n ex) {System.out.println(ex.getMessage()); } }},控制臺(tái)輸出,參數(shù)長度應(yīng)為7!,如果想把錯(cuò)誤信息保存到文件中,該如何處理?,使用log4j可以解決這個(gè)問題,log4j是一個(gè)流行的日志記錄工具,這是使用log4j后,存儲(chǔ)在文本文件中的日志信息,27,什么是日志,日志:用來記錄一些重要的操作信息有價(jià)值的日志數(shù)據(jù)能夠幫助用戶提前發(fā)現(xiàn)和避免災(zāi)難,并且找到事件發(fā)生的原因,public

37、 class TeacherTest { public static void main(String[] args) {Teacher teacher = new Teacher(); try { teacher.setId("088"); } catch (IllegalArgumentException ex) { System.out.println(ex.getMess

38、age()); } }},在控制臺(tái)輸出日志信息,提示用戶出現(xiàn)錯(cuò)誤的原因,28,如何使用log4j記錄日志,項(xiàng)目 ? 屬性 :彈出項(xiàng)目的屬性窗口,第一步:在工程中加入log4j所使用的jar文件,Java構(gòu)建路徑?庫?添加外部JAR:彈出選擇JAR的窗口,通過選擇JAR的窗口,找到log4j-1.2.x.jar,并確認(rèn),回到項(xiàng)目的屬性窗口,點(diǎn)擊確定,1,2,3,4,演示:在工程中加入log4j所使用的jar文件,29

39、,如何使用log4j記錄日志,第二步:創(chuàng)建log4j.properties文件,選擇欲使用log4j的項(xiàng)目?右鍵點(diǎn)擊src ?新建?其他 :彈出選擇向?qū)Т翱?在選擇向?qū)Т翱谥?,選擇常規(guī)? 文件? 下一步:彈出新建文件的窗口,在新建文件窗口中,輸入文件名log4j.properties ? 完成:創(chuàng)建工作結(jié)束,1,2,3,30,如何使用log4j記錄日志,第三步:使用log4j記錄日志信息,import org.apache.log4j.

40、Logger;public class TeacherLog4j { public static void main(String[] args) {Teacher teacher = new Teacher(); Logger logger = Logger.getLogger(AccpTeacherLog4j.class.getName()); try {logger.debug("設(shè)置教員的編號(hào)。&q

41、uot;);teacher.setId("088"); } catch (IllegalArgumentException ex) {logger.info(ex.getMessage()); } }},獲取日志記錄器,這個(gè)記錄器將負(fù)責(zé)控制日志信息,使用Logger對(duì)象的debug、info方法輸出日志信息,31,如何使用log4j記錄日志,第四步:編寫log4j.properties文件,配置日志

42、信息,### 把日志信息輸出到控制臺(tái) ###log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPat

43、tern=%d{yyyy-MM-dd HH:mm:ss} %m%n### 把日志信息輸出到文件:accp.log ###log4j.appender.file=org.apache.log4j.FileAppenderlog4j.appender.file.File=accp.loglog4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender

44、.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l %m%n### 設(shè)置優(yōu)先級(jí)別、以及輸出源 ###log4j.rootLogger=debug, stdout, file,日志信息將寫到文件中,指定日志輸出的文件名,指定輸出格式:顯示日期和log信息,設(shè)置優(yōu)先級(jí)別為debug、日志被輸出到多個(gè)輸出源,日志信息將寫到控制臺(tái),,,指定日志信息輸出目標(biāo),指定輸出格

45、式:顯示日期,日志發(fā)生位置和日志信息,輸出源名稱,優(yōu)先級(jí)從高到低分別是ERROR、WARN、INFO、DEBUG 在此處,如果優(yōu)先級(jí)別設(shè)為info,那么使用debug方法打印的日志信息將不被輸出,32,如何使用log4j記錄日志,運(yùn)行效果展示,控制臺(tái)輸出效果,包含日期與日志信息,文件輸出效果,包含日期、日志發(fā)生位置、與日志信息,1,2,33,總結(jié),請(qǐng)給出下列Java代碼的運(yùn)行結(jié)果,public class Test {publi

46、c static void main(String[] args) {new Test().test();}public void test() {try {int[] arr = new int[3];arr[3] = 2;System.out.println("try");} catch (ArrayIndexOutOfBoundsException e) { System.ou

47、t.println("catch 1");} catch (Exception e) { System.out.println("catch 2");} finally { System.out.println("finally");}}},修改log4j.properties文件,設(shè)置優(yōu)先級(jí)為info,在控制臺(tái)以及accp.log文件中將

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論