欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java?IO流—異常及捕獲異常處理?try…catch…finally

 更新時(shí)間:2021年12月10日 10:23:15   作者:CSDN-Lemon  
這篇文章主要介紹了Java?IO流—異常及捕獲異常處理?try…catch…finally,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、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)文章

最新評(píng)論