Java?IO流—異常及捕獲異常處理?try…catch…finally
一、Java IO流
1、概念
- 在Java中,把不同的輸入源 / 輸出源(如:鍵盤(pán)、文件、網(wǎng)絡(luò)鏈接等)抽象的表述為“流”(stream)
- 通過(guò) ”流“ 的形式允許Java程序使用相同的方式訪問(wèn)不同的輸入 / 輸出源
- Java 把所有傳統(tǒng)的”流“放在了 java . io 包下
2、IO流的分類(按流向劃分)
- 輸入流:只能從中讀取數(shù)據(jù),不能寫(xiě)入
- 輸出流:只能寫(xiě)入數(shù)據(jù),不能讀取數(shù)據(jù)
3、IO流的分類(按操作單元?jiǎng)澐郑?/h3>
- 字節(jié)流:操作單元是8位的字節(jié),主要是 InputStream 和 OutputStream 作為基類
- 字符流:操作單元是16位的字符,主要是 Reader 和 Writer 作為基類
4、IO流的分類(流的角色劃分)
- 節(jié)點(diǎn)流:可以向一個(gè)特定的 IO 設(shè)備(如磁盤(pán)等)讀 / 寫(xiě)數(shù)據(jù)的流,也稱為:低級(jí)流
- 處理流:用于對(duì)一個(gè)已存在的流進(jìn)行連接和封裝,通過(guò)封裝后的流來(lái)實(shí)現(xiàn)數(shù)據(jù)的讀/寫(xiě)功能,也稱為高級(jí)流
二、Java 異常
1、概述
- Java在運(yùn)行程序過(guò)程中出現(xiàn)的錯(cuò)誤
2、常見(jiàn)的異常
- 空指針異常類:
NullPointerException
- 類型強(qiáng)制轉(zhuǎn)換異常:
ClassCastException
- 數(shù)組下標(biāo)越界異常:
ArrayIndexOutOfBoundsException
- 算術(shù)異常類:
ArithmeticExecption
- 數(shù)組負(fù)下標(biāo)異常:
NegativeArrayException
3、異常的分類
三、異常處理方案
1、try…catch…finally
格式:
try { 可能出現(xiàn)問(wèn)題的代碼; }catch(異常名 變量) { 針對(duì)問(wèn)題的處理; }finally { 釋放資源; }
代碼:
package yichang01; public class ExceptionDemo { public static void main(String[] args){ System.out.println("start"); int[] arr = {1,2,3,4,5}; try { System.out.println(arr[5]); }catch (Exception e){ System.out.println("發(fā)生了異常:"+e.getMessage()); e.printStackTrace();//打印異常的棧 }finally {//有沒(méi)有異常都會(huì)執(zhí)行 finally 里的代碼 System.out.println("釋放資源,必須執(zhí)行的代碼塊"); } //System.out.println(arr[5]);//數(shù)組下標(biāo)越界 System.out.println("end"); } }
變形格式:
try { 可能出現(xiàn)問(wèn)題的代碼; }catch(異常名 變量) { 針對(duì)問(wèn)題的處理; }
package yichang01; public class ExceptionDemo { public static void main(String[] args) { System.out.println("start"); int a = 10; int b = 0; try { System.out.println(a / b); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } System.out.println("end"); } }
注意:
try
里面的代碼越少越好catch
里面必須有內(nèi)容,哪怕給出一個(gè)簡(jiǎn)單的提示
四、try…catch 處理方式
1、一個(gè)異常的情況與多個(gè)異常的情況
package yichang01; public class ExceptionDemo { public static void main(String[] args) { //method1();//一個(gè)異常的情況 //method2();//兩個(gè)異常、分別處理的情況 //method3();//兩個(gè)異常、一塊處理的情況 method4(); } private static void method4() { int a = 10; int b = 0; int[] arr = {1, 2, 3}; try { Object o = 123; String s = (String) o; //ClassCastException System.out.println(arr[3]); //IndexOutOfBoundException System.out.println(a / b); //ArithmeticException System.out.println("這里出現(xiàn)了一個(gè)異常,你不太清楚是誰(shuí),該怎么辦呢?"); } catch (ArithmeticException e) { System.out.println("除數(shù)不能為0"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("你訪問(wèn)了不該的訪問(wèn)的索引"); } catch (Exception e) { System.out.println("出問(wèn)題了"); } System.out.println("over"); } private static void method3() { int a = 10; int b = 0; int[] arr = {1, 2, 3, 4, 5}; try { System.out.println(a / b); System.out.println(arr[5]); } catch (ArithmeticException e) { System.out.println("除數(shù)不能為0"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("索引越界"); } System.out.println("end"); } private static void method2() { int a = 10; int b = 0; try { System.out.println(a / b); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } System.out.println("end1"); int[] arr = {1, 2, 3, 4}; try { System.out.println(arr[4]); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } System.out.println("end2"); } private static void method1() { int a = 10; int b = 0; try { System.out.println(a / b); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } System.out.println("end"); } }
五、Throwable中的方法
1、getMessage()
獲取異常信息,返回字符串。
2、toString()
獲取異常類名和異常信息,返回字符串。
3、printStackTrace()
獲取異常類名和異常信息,以及異常出現(xiàn)在程序中的位置。返回值void。
4、printStackTrace(PrintStream s)
通常用該方法將異常內(nèi)容保存在日志文件中,以便查閱。
package yichang01; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class ExceptionDemo { public static void main(String[] args) { String s = "2019-06-17"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { Date d = sdf.parse(s); System.out.println(d); } catch (ParseException e) { System.out.println(e.getMessage()); System.out.println(e.toString()); e.printStackTrace(); } System.out.println("end"); } }
六、throws
1、概述
定義功能方法時(shí),需要把出現(xiàn)的問(wèn)題暴露出來(lái),讓調(diào)用者去處理
package yichang02; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class ExceptionDemo { public static void main(String[] args) throws ParseException { System.out.println("start"); method1(); System.out.println("end11"); //method2(); System.out.println("end22"); } private static void method2() throws ArithmeticException {//運(yùn)行期異常拋出 int a = 10; int b = 0; System.out.println(a / b); } private static void method1() throws ParseException {//編譯期異常拋出 String s = "2014-11-20"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date d = sdf.parse(s); System.out.println(d); } }
七、throw
1、概述
在功能方法內(nèi)部出現(xiàn)某種情況,程序不能繼續(xù)運(yùn)行,需要進(jìn)行跳轉(zhuǎn)時(shí),用 throw 把異常對(duì)象拋出
package yichang02; public class ExceptionDemo { public static void main(String[] args) { Student s = new Student(); s.setAge(-30); } } class Student { private int age; public int getAge() { return age; } public void setAge(int age) { if (age > 1) { this.age = age; } else { try { throw new Exception("年齡不能小于1");//throw:方法內(nèi)部,一般出現(xiàn)了邏輯錯(cuò)誤,手動(dòng)拋出的自定義異常 } catch (Exception e) { e.printStackTrace(); } this.age = 1; } } }
八、throws和throw的區(qū)別
throws
- 用在方法聲明后,跟的是異常類名
- 可以跟多個(gè)異常類名,用逗號(hào)隔開(kāi)
- 表示拋出異常,由該方法的調(diào)用者來(lái)處理
- throws 表示出現(xiàn)異常的一種可能性,并不一定會(huì)發(fā)生這些異常
throw
- 用在方法體內(nèi),跟的是異常對(duì)象名
- 只能拋出一個(gè)異常對(duì)象名
- 拋出異常,由方法體內(nèi)的語(yǔ)句處理
- throw 則是拋出了異常,執(zhí)行 throw 則一定拋出了某種異常
package yichang02; class ExceptionDemo { public static void main(String[] args) { //method1(); try { method2(); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } } private static void method2() throws Exception { int a = 10; int b = 0; if (b == 0) { throw new Exception(); } else { System.out.println(a / b); } } private static void method1() { int a = 10; int b = 0; if (b == 0) { throw new ArithmeticException(); } else { System.out.println(a / b); } } }
九、try…catch…finally…
1、格式
try...catch...finally try...catch try...catch...catch... try...catch...catch...finally try...finally
2、注意
被finally控制的語(yǔ)句體一定會(huì)執(zhí)行
用于釋放資源,在IO流操作和數(shù)據(jù)庫(kù)操作中會(huì)見(jiàn)到
3、代碼
package yichang02; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; class ExceptionDemo { public static void main(String[] args) { String s = "2019-6-17 12:12:12"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date d = null; try { d = sdf.parse(s); } catch (ParseException e) { e.printStackTrace(); System.exit(0); } finally { System.out.println("這是必然執(zhí)行的代碼"); } System.out.println(d); } }
package yichang02; class ExceptionDemo { public static void main(String[] args) { System.out.println(getInt()); } public static int getInt() { int a = 10; try { System.out.println(a / 0); a = 20; return a; } catch (Exception e) { System.out.println("catch"); a = 30; return a; } finally {//釋放資源,會(huì)執(zhí)行的代碼 System.out.println("finally"); a = 40; return a; } // return a; } }
十、final , finally 和 finalize的區(qū)別
1、final
:最終的意思,可以修飾類,成員變量,成員方法
- 修飾類,類不能被繼承
- 修飾變量,變量是常量
- 修飾方法,方法不能被重寫(xiě)
2、finally
:是異常處理的一部分,用于釋放資源。
- 一般來(lái)說(shuō),代碼肯定會(huì)執(zhí)行,特殊情況:在執(zhí)行到finally之前jvm退出了
3、finalize
:是Object類的一個(gè)方法,用于垃圾回收
十一、異常注意事項(xiàng)
- 子類重寫(xiě)父類方法時(shí),子類的方法必須拋出相同的異?;蚋割惍惓5淖宇?。(父親壞了,兒子不能比父親更壞)
- 如果父類拋出了多個(gè)異常,子類重寫(xiě)父類時(shí),只能拋出相同的異?;蛘呤撬淖蛹?,子類不能拋出父類沒(méi)有的異常
- 如果被重寫(xiě)的方法沒(méi)有異常拋出,那么子類的方法絕對(duì)不可以拋出異常,如果子類方法內(nèi)有異常發(fā)生,那么子類只能try,不能throws
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java實(shí)現(xiàn)的統(tǒng)計(jì)字符算法示例
這篇文章主要介紹了java實(shí)現(xiàn)的統(tǒng)計(jì)字符算法,涉及java針對(duì)字符的遍歷、判斷、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10mybatis教程之resultmap_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了mybatis教程之resultmap,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09Java利用布隆過(guò)濾器實(shí)現(xiàn)快速檢查元素是否存在
布隆過(guò)濾器是一個(gè)很長(zhǎng)的二進(jìn)制向量和一系列隨機(jī)映射函數(shù)。布隆過(guò)濾器可以用于檢索一個(gè)元素是否在一個(gè)集合中。本文就來(lái)詳細(xì)說(shuō)說(shuō)實(shí)現(xiàn)的方法,需要的可以參考一下2022-10-10Java?8?的異步編程利器?CompletableFuture的實(shí)例詳解
這篇文章主要介紹了Java?8?的異步編程利器?CompletableFuture?詳解,本文通過(guò)一個(gè)例子給大家介紹下Java?8??CompletableFuture異步編程的相關(guān)知識(shí),需要的朋友可以參考下2022-03-03spring-kafka使消費(fèi)者動(dòng)態(tài)訂閱新增的topic問(wèn)題
這篇文章主要介紹了spring-kafka使消費(fèi)者動(dòng)態(tài)訂閱新增的topic問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12Springboot使用Security實(shí)現(xiàn)OAuth2授權(quán)驗(yàn)證完整過(guò)程
安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會(huì)發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會(huì)出現(xiàn)問(wèn)題,這篇文章主要介紹了SpringBoot使用Security實(shí)現(xiàn)OAuth2授權(quán)驗(yàn)證完整過(guò)程2022-12-12