java 批量处理 示例_Java异常处理教程(包含示例和最佳实践)
java 批量處理 示例
 異常是可能在程序執(zhí)行期間發(fā)生的錯誤事件,它會破壞其正常流程。 Java提供了一種健壯且面向?qū)ο蟮姆绞絹硖幚懋惓G闆r,稱為Java異常處理 。 我們將在本教程中研究以下主題。 
Java異常處理概述
我們不喜歡異常,但是我們總是要處理它們,好消息是Java異常處理框架非常健壯,易于理解和使用。 異常可能源于各種情況,例如用戶輸入的錯誤數(shù)據(jù),硬件故障,網(wǎng)絡(luò)連接故障,數(shù)據(jù)庫服務(wù)器關(guān)閉等。在本節(jié)中,我們將學習如何在Java中處理異常。
Java是一種面向?qū)ο蟮木幊陶Z言,只要在執(zhí)行語句時發(fā)生錯誤,就會創(chuàng)建一個異常對象 ,然后程序的正常流程將停止, JRE會嘗試尋找可以處理引發(fā)異常的人。 異常對象包含許多調(diào)試信息,例如方法層次結(jié)構(gòu),發(fā)生異常的行號,異常類型等。當方法中發(fā)生異常時,將調(diào)用創(chuàng)建異常對象并將其移交給運行時環(huán)境的過程。 “拋出異常” 。
運行時一旦接收到異常對象,它將嘗試查找該異常的處理程序。 異常處理程序是可以處理異常對象的代碼塊。 查找異常處理程序的邏輯很簡單–在發(fā)生錯誤的方法中開始搜索,如果找不到合適的處理程序,則轉(zhuǎn)到調(diào)用者方法,依此類推。 因此,如果方法調(diào)用堆棧為A-> B-> C且方法C中引發(fā)了異常,則對適當處理程序的搜索將從C-> B-> A轉(zhuǎn)移。 如果找到合適的異常處理程序,則將異常對象傳遞給該處理程序以對其進行處理。 據(jù)說處理程序正在“捕獲異常” 。 如果找不到合適的異常處理程序,則程序?qū)⒔K止有關(guān)異常的打印信息。
請注意,Java異常處理是僅用于處理運行時錯誤的框架,異常處理框架不處理編譯時錯誤。
我們在Java程序中使用特定的關(guān)鍵字來創(chuàng)建異常處理程序塊,接下來我們將研究這些關(guān)鍵字。
異常處理關(guān)鍵字
Java提供了用于異常處理目的的特定關(guān)鍵字,我們將首先照顧它們,然后編寫一個簡單的程序,展示如何使用它們進行異常處理。
讓我們看一個簡單的程序,顯示Java中的異常處理。
package com.journaldev.exceptions;import java.io.FileNotFoundException; import java.io.IOException;public class ExceptionHandling {public static void main(String[] args) throws FileNotFoundException, IOException {try{testException(-5);testException(-10);}catch(FileNotFoundException e){e.printStackTrace();}catch(IOException e){e.printStackTrace();}finally{System.out.println("Releasing resources"); }testException(15);}public static void testException(int i) throws FileNotFoundException, IOException{if(i < 0){FileNotFoundException myException = new FileNotFoundException("Negative Integer "+i);throw myException;}else if(i > 10){throw new IOException("Only supported for index 0 to 10");}}}上面程序的輸出是:
java.io.FileNotFoundException: Negative Integer -5at com.journaldev.exceptions.ExceptionHandling.testException(ExceptionHandling.java:24)at com.journaldev.exceptions.ExceptionHandling.main(ExceptionHandling.java:10) Releasing resources Exception in thread "main" java.io.IOException: Only supported for index 0 to 10at com.journaldev.exceptions.ExceptionHandling.testException(ExceptionHandling.java:27)at com.journaldev.exceptions.ExceptionHandling.main(ExceptionHandling.java:19)請注意,testException()方法使用throw關(guān)鍵字引發(fā)異常,方法簽名使用throws關(guān)鍵字告知調(diào)用方它可能引發(fā)的異常類型。 在main()方法中,我正在使用main()方法中的try-catch塊來處理異常,當我不處理它時,我將通過main方法中的throws子句將其傳播到運行時。 請注意, testException(-10)永遠不會因為異常而執(zhí)行,然后在try-catch塊執(zhí)行后再執(zhí)行finally塊。 printStackTrace()是Exception類中的一種有用方法,用于調(diào)試目的。
- 沒有try語句,我們不能有catch或finally子句。
- 一個try語句應(yīng)該具有catch塊或finally塊,它可以同時具有兩個塊。
- 我們不能在try-catch-finally塊之間編寫任何代碼。
- 一個try語句可以包含多個catch塊。
- try-catch塊可以類似于if-else語句進行嵌套。
- 我們只有一個帶有try-catch語句的finally塊。
異常層次
如前所述,當引發(fā)任何異常時,將創(chuàng)建一個異常對象 。 Java異常是分層的, 繼承用于對不同類型的異常進行分類。 Throwable是Java異常層次結(jié)構(gòu)的父類,它具有兩個子對象–錯誤和異常。 異常進一步分為檢查異常和運行時異常。
有用的異常方法
異常及其所有子類均未提供任何特定方法,并且所有方法均在基類Throwable中定義。 創(chuàng)建異常類是為了指定不同類型的異常情況,以便我們可以輕松識別根本原因并根據(jù)異常類型進行處理。 Throwable類實現(xiàn)Serializable接口以實現(xiàn)互操作性。
Throwable類的一些有用方法是;
Java 7自動資源管理和捕獲塊改進
如果您在單個try塊中捕獲了很多異常,則您會注意到catch塊代碼看起來非常丑陋,并且主要由用于記錄錯誤的冗余代碼組成,請記住,Java 7的功能之一是改進了catch塊,我們可以在單個catch塊中捕獲多個異常。 具有此功能的catch塊如下所示:
catch(IOException | SQLException | Exception ex){logger.error(ex);throw new MyException(ex.getMessage()); }存在一些約束,例如異常對象是最終對象,我們無法在catch塊內(nèi)對其進行修改,請在Java 7 Catch Block Improvements上閱讀完整的分析。
在大多數(shù)情況下,我們使用finally塊只是為了關(guān)閉資源,有時我們忘記關(guān)閉它們并在資源耗盡時獲取運行時異常。 這些異常很難調(diào)試,我們可能需要調(diào)查使用該類型資源的每個位置,以確保將其關(guān)閉。 因此,java 7的改進之一是try-with-resources,我們可以在try語句本身中創(chuàng)建資源,并在try-catch塊內(nèi)使用它。 當執(zhí)行從try-catch塊執(zhí)行時,運行時環(huán)境會自動關(guān)閉這些資源。 具有這種改進的try-catch塊示例為:
try (MyResource mr = new MyResource()) {System.out.println("MyResource created in try-with-resources");} catch (Exception e) {e.printStackTrace();}在Java 7自動資源管理中閱讀有關(guān)此功能的詳細說明。
創(chuàng)建自定義異常類
Java提供了許多異常類供我們使用,但有時我們可能需要創(chuàng)建自己的自定義異常類,以通過適當?shù)南⒁约拔覀円胍赃M行跟蹤的任何自定義字段(例如錯誤代碼)來通知調(diào)用者有關(guān)特定類型的異常的信息。 。 例如,假設(shè)我們編寫了一種僅處理文本文件的方法,因此當某些其他類型的文件作為輸入發(fā)送時,我們可以為調(diào)用者提供適當?shù)腻e誤代碼。
這是自定義異常類的示例,并顯示了其用法。
MyException.java
package com.journaldev.exceptions;public class MyException extends Exception {private static final long serialVersionUID = 4664456874499611218L;private String errorCode="Unknown_Exception";public MyException(String message, String errorCode){super(message);this.errorCode=errorCode;}public String getErrorCode(){return this.errorCode;}}CustomExceptionExample.java
package com.journaldev.exceptions;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream;public class CustomExceptionExample {public static void main(String[] args) throws MyException {try {processFile("file.txt");} catch (MyException e) {processErrorCodes(e);}}private static void processErrorCodes(MyException e) throws MyException {switch(e.getErrorCode()){case "BAD_FILE_TYPE":System.out.println("Bad File Type, notify user");throw e;case "FILE_NOT_FOUND_EXCEPTION":System.out.println("File Not Found, notify user");throw e;case "FILE_CLOSE_EXCEPTION":System.out.println("File Close failed, just log it.");break;default:System.out.println("Unknown exception occured, lets log it for further debugging."+e.getMessage());e.printStackTrace();}}private static void processFile(String file) throws MyException { InputStream fis = null;try {fis = new FileInputStream(file);} catch (FileNotFoundException e) {throw new MyException(e.getMessage(),"FILE_NOT_FOUND_EXCEPTION");}finally{try {if(fis !=null)fis.close();} catch (IOException e) {throw new MyException(e.getMessage(),"FILE_CLOSE_EXCEPTION");}}}}請注意,我們可以有一個單獨的方法來處理從不同方法中獲取的不同類型的錯誤代碼,其中一些被消耗掉是因為我們可能不想為此通知用戶,或者其中一些我們將返回以通知用戶有關(guān)錯誤代碼。問題。
在這里,我擴展了Exception,以便每當產(chǎn)生此異常時,都必須在方法中對其進行處理或?qū)⑵浞祷亟o調(diào)用程序,如果我們擴展RuntimeException,則無需在throws子句中指定它。 這是一個設(shè)計決策,但是我始終喜歡檢查異常,因為我知道調(diào)用任何方法并采取適當?shù)拇胧﹣硖幚硭鼈儠r可以得到哪些異常。
異常處理最佳實踐
在調(diào)試時,我們將必須仔細查看堆棧跟蹤,以識別異常的實際位置。 如果我們更改實現(xiàn)邏輯以如下所述檢查這些異常;
private static void processFile(String file) throws MyException {if(file == null) throw new MyException("File name can't be null", "NULL_FILE_NAME"); //further processing }然后,異常堆棧跟蹤將如下所示,以清晰的消息清楚地顯示異常發(fā)生的位置。
com.journaldev.exceptions.MyException: File name can't be nullat com.journaldev.exceptions.CustomExceptionExample.processFile(CustomExceptionExample.java:37)at com.journaldev.exceptions.CustomExceptionExample.main(CustomExceptionExample.java:12) 這就是Java中異常處理的全部,希望您喜歡它并從中學到一些東西。 
翻譯自: https://www.javacodegeeks.com/2013/07/java-exception-handling-tutorial-with-examples-and-best-practices.html
java 批量處理 示例
總結(jié)
以上是生活随笔為你收集整理的java 批量处理 示例_Java异常处理教程(包含示例和最佳实践)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 如何用云电脑玩如何玩云电脑
- 下一篇: Java的@Serial批注
