Java?IO流—異常及捕獲異常處理?try…catch…finally
一、Java IO流
1、概念
- 在Java中,把不同的輸入源 / 輸出源(如:鍵盤、文件、網(wǎng)絡鏈接等)抽象的表述為“流”(stream)
- 通過 ”流“ 的形式允許Java程序使用相同的方式訪問不同的輸入 / 輸出源
- Java 把所有傳統(tǒng)的”流“放在了 java . io 包下
2、IO流的分類(按流向劃分)
- 輸入流:只能從中讀取數(shù)據(jù),不能寫入
- 輸出流:只能寫入數(shù)據(jù),不能讀取數(shù)據(jù)
3、IO流的分類(按操作單元劃分)
- 字節(jié)流:操作單元是8位的字節(jié),主要是 InputStream 和 OutputStream 作為基類
- 字符流:操作單元是16位的字符,主要是 Reader 和 Writer 作為基類
4、IO流的分類(流的角色劃分)
- 節(jié)點流:可以向一個特定的 IO 設備(如磁盤等)讀 / 寫數(shù)據(jù)的流,也稱為:低級流
- 處理流:用于對一個已存在的流進行連接和封裝,通過封裝后的流來實現(xiàn)數(shù)據(jù)的讀/寫功能,也稱為高級流
二、Java 異常
1、概述
- Java在運行程序過程中出現(xiàn)的錯誤

2、常見的異常
- 空指針異常類:
NullPointerException - 類型強制轉(zhuǎn)換異常:
ClassCastException - 數(shù)組下標越界異常:
ArrayIndexOutOfBoundsException - 算術異常類:
ArithmeticExecption - 數(shù)組負下標異常:
NegativeArrayException

3、異常的分類


三、異常處理方案
1、try…catch…finally
格式:
try {
可能出現(xiàn)問題的代碼;
}catch(異常名 變量) {
針對問題的處理;
}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 {//有沒有異常都會執(zhí)行 finally 里的代碼
System.out.println("釋放資源,必須執(zhí)行的代碼塊");
}
//System.out.println(arr[5]);//數(shù)組下標越界
System.out.println("end");
}
}

變形格式:
try {
可能出現(xiàn)問題的代碼;
}catch(異常名 變量) {
針對問題的處理;
}
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)容,哪怕給出一個簡單的提示
四、try…catch 處理方式
1、一個異常的情況與多個異常的情況
package yichang01;
public class ExceptionDemo {
public static void main(String[] args) {
//method1();//一個異常的情況
//method2();//兩個異常、分別處理的情況
//method3();//兩個異常、一塊處理的情況
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)了一個異常,你不太清楚是誰,該怎么辦呢?");
} catch (ArithmeticException e) {
System.out.println("除數(shù)不能為0");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("你訪問了不該的訪問的索引");
} catch (Exception e) {
System.out.println("出問題了");
}
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、概述
定義功能方法時,需要把出現(xiàn)的問題暴露出來,讓調(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 {//運行期異常拋出
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ù)運行,需要進行跳轉(zhuǎn)時,用 throw 把異常對象拋出
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)了邏輯錯誤,手動拋出的自定義異常
} catch (Exception e) {
e.printStackTrace();
}
this.age = 1;
}
}
}
八、throws和throw的區(qū)別
throws
- 用在方法聲明后,跟的是異常類名
- 可以跟多個異常類名,用逗號隔開
- 表示拋出異常,由該方法的調(diào)用者來處理
- throws 表示出現(xiàn)異常的一種可能性,并不一定會發(fā)生這些異常
throw
- 用在方法體內(nèi),跟的是異常對象名
- 只能拋出一個異常對象名
- 拋出異常,由方法體內(nèi)的語句處理
- 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控制的語句體一定會執(zhí)行
用于釋放資源,在IO流操作和數(shù)據(jù)庫操作中會見到
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 {//釋放資源,會執(zhí)行的代碼
System.out.println("finally");
a = 40;
return a;
}
// return a;
}
}
十、final , finally 和 finalize的區(qū)別
1、final:最終的意思,可以修飾類,成員變量,成員方法
- 修飾類,類不能被繼承
- 修飾變量,變量是常量
- 修飾方法,方法不能被重寫
2、finally:是異常處理的一部分,用于釋放資源。
- 一般來說,代碼肯定會執(zhí)行,特殊情況:在執(zhí)行到finally之前jvm退出了
3、finalize:是Object類的一個方法,用于垃圾回收
十一、異常注意事項
- 子類重寫父類方法時,子類的方法必須拋出相同的異常或父類異常的子類。(父親壞了,兒子不能比父親更壞)
- 如果父類拋出了多個異常,子類重寫父類時,只能拋出相同的異?;蛘呤撬淖蛹?,子類不能拋出父類沒有的異常
- 如果被重寫的方法沒有異常拋出,那么子類的方法絕對不可以拋出異常,如果子類方法內(nèi)有異常發(fā)生,那么子類只能try,不能throws
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
mybatis教程之resultmap_動力節(jié)點Java學院整理
這篇文章主要介紹了mybatis教程之resultmap,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
Java?8?的異步編程利器?CompletableFuture的實例詳解
這篇文章主要介紹了Java?8?的異步編程利器?CompletableFuture?詳解,本文通過一個例子給大家介紹下Java?8??CompletableFuture異步編程的相關知識,需要的朋友可以參考下2022-03-03
spring-kafka使消費者動態(tài)訂閱新增的topic問題
這篇文章主要介紹了spring-kafka使消費者動態(tài)訂閱新增的topic問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
Springboot使用Security實現(xiàn)OAuth2授權驗證完整過程
安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會出現(xiàn)問題,這篇文章主要介紹了SpringBoot使用Security實現(xiàn)OAuth2授權驗證完整過程2022-12-12

