Java編程基礎20——異常&IO(File類)

1_異常(異常的概述和分類)

  • A:異常的概述java

    • 異常就是Java程序在運行過程當中出現的錯誤。
  • B:異常的分類程序員

    • 經過API查看Throwable
    • Error面試

      • 服務器宕機,數據庫崩潰等
    • Exception

C:異常的繼承體系算法

* Throwable
    * Error    
    * Exception
        * RuntimeException

2_異常(JVM默認是如何處理異常的)

  • A:JVM默認是如何處理異常的數據庫

    • main函數收到這個問題時,有兩種處理方式:
    • a:本身將該問題處理,而後繼續運行
    • b:本身沒有針對的處理方式,只有交給調用main的jvm來處理
    • jvm有一個默認的異常處理機制,就將該異常進行處理.
    • 並將該異常的名稱,異常的信息.異常出現的位置打印在了控制檯上,同時將程序中止運行
  • B:案例演示windows

    • JVM默認如何處理異常
public class Demo1_Exception {
    public static void main(String[] args) {
//        demo1();
        Demo d = new Demo();
        int x = d.div(10, 0);        //new ArithmeticException(/ by zero)  除數是0,違反算數運算法則
        System.out.println(x);
    }
    private static void demo1() { 
        int[] arr = {11,22,33,44,55};
//        arr = null;                    //NullPointerException            空指針異常
        System.out.println(arr[10]);    //ArrayIndexOutOfBoundsException    數組索引越界異常
    }
}
class Demo{
    public int div(int a,int b) {
        return a / b;
    }
}

3_異常(try...catch的方式處理異常1)

  • A:異常處理的兩種方式數組

    • a:try…catch…finally服務器

      • try catch
      • try catch finally
      • try finally
    • b:throws
  • B:try...catch處理異常的基本格式eclipse

    • try…catch…finally
  • C:案例演示jvm

    • try...catch的方式處理1個異常
public class Demo2_Exception {
    /* try:用來檢測異常
     catch:用來捕獲異常的
     finally:釋放資源
     當經過trycatch將異常處理,程序繼續向下執行*/
    public static void main(String[] args) {
        Demo2 d = new Demo2();
        try {
            int x = d.div(10, 0);
            System.out.println(x);
        }catch(ArithmeticException a) {
            System.out.println("出錯了,除數爲0了");
        }
        System.out.println("----------");
    }
}
class Demo2{
    public int div(int a,int b) {
        return a / b;
    }
}

4_異常(try...catch的方式處理異常2)

  • A:案例演示

    • try...catch的方式處理多個異常
    • JDK7之後處理多個異常的方式及注意事項
public class Demo3_Exception {
//安卓:客戶端開發,如何處理異常?try{}catch(Exception e) {}
//JavaEE:服務端開發,通常都是底層開發,從底層向上拋
    public static void main(String[] args) {
//        demo1();
        int a = 10;
        int b = 0;
        int[] arr = {11,22,33,44,55};
        //JdK7如何處理多個異常
        try {
            System.out.println(a / b);
            System.out.println(arr[10]);
        } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
            System.out.println("出錯了");
        } 
    }

    private static void demo1() {
        int a = 10;
        int b = 0;
        int[] arr = {11,22,33,44,55};
        try {
            System.out.println(a / b);
            System.out.println(arr[10]);
            arr = null;
            System.out.println(arr[0]);
        } catch (ArithmeticException e) {
            System.out.println("除數不能爲零");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("索引越界了");
        } catch (Exception e) {                //Exception e = new NullPointerException();
            System.out.println("出錯了");
        }
        System.out.println("over");
    }
}

5_異常(編譯期異常和運行期異常的區別)

  • A:編譯期異常和運行期異常的區別

    • Java中的異常被分爲兩大類:編譯時異常和運行時異常。
    • 全部的RuntimeException類及其子類的實例被稱爲運行時異常,其餘的異常就是編譯時異常
    • 編譯時異常

      • Java程序必須顯示處理,不然程序就會發生錯誤,沒法經過編譯
    • 運行時異常

      • 無需顯示處理,也能夠和編譯時異常同樣處理
  • B:案例演示

    • 編譯期異常和運行期異常的區別
import java.io.FileInputStream;
public class Demo4_Exception {
/*
編譯時異常:也叫健壯性異常,不處理編譯通不過。
運行時異常:就是程序員所犯的錯誤,須要回來修改代碼。
*/    
    public static void main(String[] args) {
        try {
            FileInputStream fis = new FileInputStream("xxx.txt");
        } catch (Exception e) {
    
        }
    }
}

6_異常(Throwable的幾個常見方法)

  • A:Throwable的幾個常見方法

    • a:getMessage()

      • 獲取異常信息,返回字符串。
    • b:toString()

      • 獲取異常類名和異常信息,返回字符串。
    • c:printStackTrace()

      • 獲取異常類名和異常信息,以及異常出如今程序中的位置。返回值void。
  • B:案例演示

    • Throwable的幾個常見方法的基本使用
public class Demo5_throwable {
    public static void main(String[] args) {
        try {
            System.out.println(1/0);
        } catch (Exception e) {        //Exception e = new ArithmeticException(" / by zero");
//            System.out.println(e.getMessage());            //獲取異常信息
            System.out.println(e);                        //調用toString方法,打印異常類名和異常信息
            e.printStackTrace();                        //jvm默認就用這種方式處理異常
        }
    }
}

7_異常(throws的方式處理異常)

  • A:throws的方式處理異常

    • 定義功能方法時,須要把出現的問題暴露出來讓調用者去處理。
    • 那麼就經過throws在方法上標識。
  • B:案例演示

    • 舉例分別演示編譯時異常和運行時異常的拋出

public class Demo6_Exception {
//編譯時異常的拋出必須對其進行處理
//運行時異常的拋出能夠處理也能夠不處理

public static void main(String[] args) throws Exception {
        Person p = new Person();
        p.setAge(-17);
        System.out.println(p.getAge());
    }
}

class Person{
    private String name;
    private int age;
    public Person() {
        super();
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) throws RuntimeException {
        if(age > 0 && age <= 150) {
            this.age = age;
        }else {
            throw new RuntimeException("年齡非法");
//            System.out.println("請回火星吧");
        }
    }
}

8_異常(throw的概述以及和throws的區別)

  • A:throw的概述

    • 在功能方法內部出現某種狀況,程序不能繼續運行,須要進行跳轉時,就用throw把異常對象拋出。
  • B:案例演示

    • 分別演示編譯時異常對象和運行時異常對象的拋出
  • C:throws和throw的區別

    • a:throws

      • 用在方法聲明後面,跟的是異常類名
      • 能夠跟多個異常類名,用逗號隔開
      • 表示拋出異常,由該方法的調用者來處理
    • b:throw

      • 用在方法體內,跟的是異常對象名
      • 只能拋出一個異常對象名
      • 表示拋出異常,由方法體內的語句處理

9_異常(finally關鍵字的特色及做用)

  • A:finally的特色

    • 被finally控制的語句體必定會執行
    • 特殊狀況:在執行到finally以前jvm退出了(好比System.exit(0))
  • B:finally的做用

    • 用於釋放資源,在IO流操做和數據庫操做中會見到
  • C:案例演示

    • finally關鍵字的特色及做用
public static void main(String[] args) {
        try {
            System.out.println(10/0);
        } catch (Exception e) {
            System.out.println("除數爲零了");
            System.exit(0);            //退出jvm虛擬機
            return;
        } finally {
            System.out.println("看看我執行了嗎");
        }        
    }

10_異常(finally關鍵字的面試題)

  • A:面試題1

    • final,finally和finalize的區別

      • final能夠修飾類不能被繼承,修飾方法不能被重寫,修飾變量只能賦值一次
      • finally是try語句中的一個語句體,不能單獨使用,用來釋放資源
      • finalize是一個方法,當垃圾回收器肯定不存在該對象的更多引用時,由對象的垃圾回收器調用此方法。
  • B:面試題2

    • 若是catch裏面有return語句,請問finally的代碼還會執行嗎?若是會,請問是在return前仍是return後。
public class Demo8_test {
    public static void main(String[] args) {
        Demo3 d = new Demo3();
        System.out.println(d.method());
    }
}
class Demo3 {
    public int method() {
        int x = 10;
        try {
            x = 20;
            System.out.println(1/0);
            return x;
        } catch (Exception e) {
            x = 30;
            return x;
        } finally {
            x = 40;
        }
    }
}

11_異常(自定義異常概述和基本使用)

  • A:爲何須要自定義異常

    • 舉例:人的年齡
  • B:自定義異常概述

    • 繼承自Exception
    • 繼承自RuntimeException
  • C:案例演示

    • 自定義異常的基本使用
class AgeOutOfBoundsException extends RuntimeException {
    public AgeOutOfBoundsException() {
        super();        
    }

    public AgeOutOfBoundsException(String message) {
        super(message);    
    }
}
public void setAge(int age) throws AgeOutOfBoundsException {
        if(age > 0 && age <= 150) {
            this.age = age;
        }else {
            throw new AgeOutOfBoundsException("年齡非法");
        }
    }

12_異常(異常的注意事項及如何使用異常處理)

  • A:異常注意事項

    • a:子類重寫父類方法時,子類的方法必須拋出相同的異常或父類異常的子類。(父親壞了,兒子不能比父親更壞)
    • b:若是父類拋出了多個異常,子類重寫父類時,只能拋出相同的異常或者是他的子集,子類不能拋出父類沒有的異常
    • c:若是被重寫的方法沒有異常拋出,那麼子類的方法絕對不能夠拋出異常,若是子類方法內有異常發生,那麼子類只能try,不能throws
  • B:如何使用異常處理

    • 原則:若是該功能內部能夠將問題處理,用try,若是處理不了,交由調用者處理,這是用throws
    • 區別:

      • 後續程序須要繼續運行就try
      • 後續程序不須要繼續運行就throws
    • 若是JDK沒有提供對應的異常,須要自定義異常。

13_異常(練習)

  • 鍵盤錄入一個int類型的整數,對其求二進制表現形式

    • 若是錄入的整數過大,給予提示,錄入的整數過大請從新錄入一個整數BigInteger
    • 若是錄入的是小數,給予提示,錄入的是小數,請從新錄入一個整數
    • 若是錄入的是其餘字符,給予提示,錄入的是非法字符,請從新錄入一個整數
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
public class Demo10_test {    
/** 分析
     * 1.建立鍵盤錄入對象
     * 2.將鍵盤錄入的結果存儲在String類型的字符串中,存儲int類型中,若是有不符合條件的直接報錯,沒法進行後續判斷
     * 3.是鍵盤錄入的結果轉換成int類型的數據,是正確的仍是錯誤的。
     * 4.正確的直接轉換
     * 5.錯誤的要對應的判斷
     * */ 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入一個整數:");
        while(true) {
            String line = sc.nextLine();                    //將鍵盤錄入的結果存儲在line中
            try {
                int num = Integer.parseInt(line);                //將字符串轉換爲整數
                System.out.println(Integer.toBinaryString(num));//將整數轉換爲二進制
                break;                                            //跳出循環
            } catch (Exception e) {
                try {
                    new BigInteger(line);
                    System.out.println("錄入錯誤,您錄入的是一個過大的整數,請從新輸入:");    
                } catch (Exception e2) {                        //Alt + Shift + z
                    try {
                        new BigDecimal(line);
                        System.out.println("錄入錯誤,您錄入的是一個小數,請從新輸入:");
                    } catch (Exception e3) {
                        System.out.println("錄入錯誤,您錄入的是非法字符,請從新輸入:");
                    }
                }
            }
        }
//        BigInteger big = new BigInteger("123");
    }
}

14_File類(File類的概述和構造方法)

  • A:File類的概述

    • File更應該叫作一個路徑

      • 文件路徑或者文件夾路徑
      • 路徑分爲絕對路徑和相對路徑
      • 絕對路徑是一個固定的路徑,從盤符開始
      • 相對路徑相對於某個位置,在eclipse下是指當前項目下,在dos下
    • 查看API指的是當前路徑
    • 文件和目錄路徑名的抽象表示形式
  • B:構造方法

    • File(String pathname):根據一個路徑獲得File對象
    • File(String parent, String child):根據一個目錄和一個子文件/目錄獲得File對象
    • File(File parent, String child):根據一個父File對象和一個子文件/目錄獲得File對象
  • C:案例演示

    • File類的構造方法
import java.io.File;
public class Demo1_File {
    public static void main(String[] args) {
//        demo1();
//        demo2();
        File parent = new File("C:\\Users\\albert\\Desktop\\JavaGuide-master\\Java相關");
        String child = "ArrayList.md";
        File file = new File(parent, child);
        System.out.println(file.exists());
        System.out.println(parent.exists());
    }

    private static void demo2() {
        String parent = "C:\\Users\\albert\\Desktop\\JavaGuide-master\\Java相關";
        String child = "ArrayList.md";
        File file = new File(parent,child);
        System.out.println(file.exists());
    }

    private static void demo1() {
        File file = new File("C:\\Users\\albert\\Desktop\\JavaGuide-master\\Java相關");
        System.out.println(file.exists());
        
        File file2 = new File("xxx.txt");
        System.out.println(file2.exists());
    }
}

15_File類(File類的建立功能)

  • A:建立功能

    • public boolean createNewFile():建立文件 若是存在這樣的文件,就不建立了
    • public boolean mkdir():建立文件夾 若是存在這樣的文件夾,就不建立了
    • public boolean mkdirs():建立文件夾,若是父文件夾不存在,會幫你建立出來
  • B:案例演示

    • File類的建立功能
    • 注意事項:

      • 若是你建立文件或者文件夾忘了寫盤符路徑,那麼,默認在項目路徑下。
import java.io.File;
import java.io.IOException;
public class Demo2_FileMethod {
    public static void main(String[] args) throws IOException {
//        demo1();
        File dir1 = new File("aaa");
        System.out.println(dir1.mkdir());
        
        File dir2 = new File("bbb.txt");
        System.out.println(dir2.mkdir());
        
        File dir3 = new File("ccc\\ddd");
        System.out.println(dir3.mkdirs());                    //建立多級目錄
    }

    private static void demo1() throws IOException {
        File file = new File("yyy.txt");                    //建立文件
        System.out.println(file.createNewFile());            //若是沒喲就建立,返回true
        
        File file2 = new File("zzz");
        System.out.println(file2.createNewFile());
    }
}

16_File類(File類的重命名和刪除功能)

  • A:重命名和刪除功能

    • public boolean renameTo(File dest):把文件重命名爲指定的文件路徑
    • public boolean delete():刪除文件或者文件夾
  • B:重命名注意事項

    • 若是路徑名相同,就是更名。
    • 若是路徑名不一樣,就是更名並剪切。
  • C:刪除注意事項:

    • Java中的刪除不走回收站。
    • 要刪除一個文件夾,請注意該文件夾內不能包含文件或者文件夾
import java.io.File;
public class Demo3_FileMethod {
    public static void main(String[] args) {
//        demo1();
        File file1 = new File("yyy.txt");
        System.out.println(file1.delete());
        
        File file2 = new File("aaa");
        System.out.println(file2.delete());
        
        File file3 = new File("ccc");            //被刪除的文件必須爲空
        System.out.println(file3.delete());
    }

    private static void demo1() {
        File file1 = new File("ooo.txt");
        File file2 = new File("D:\\xxx.txt");
        System.out.println(file1.renameTo(file2));
    }
}

17_File類(File類的判斷功能)

  • A:判斷功能

    • public boolean isDirectory():判斷是不是目錄
    • public boolean isFile():判斷是不是文件
    • public boolean exists():判斷是否存在
    • public boolean canRead():判斷是否可讀
    • public boolean canWrite():判斷是否可寫
    • public boolean isHidden():判斷是否隱藏
  • B:案例演示

    • File類的判斷功能
import java.io.File;
public class Demo4_FileMethod {
    public static void main(String[] args) {
//        demo1();
        File file = new File("zzz");
        file.setReadable(false);                //windows認爲全部的文件都是可讀的
        System.out.println(file.canRead());
        
        file.setWritable(true);
        System.out.println(file.canWrite());    //windows系統能夠設置爲不可寫
        
        File file2 = new File("lalala.txt");
        System.out.println(file2.isHidden());    //判斷是不是隱藏文件
    }

    private static void demo1() {
        File dir1 = new File("ccc");
        System.out.println(dir1.isDirectory());        //判斷是不是文件夾
        
        File dir2 = new File("zzz");
        System.out.println(dir2.isDirectory());
        
        System.out.println(dir1.isFile());            //判斷是不是文件
        System.out.println(dir2.isFile());
    }
}

18_File類(File類的獲取功能)

  • A:獲取功能

    • public String getAbsolutePath():獲取絕對路徑
    • public String getPath():獲取路徑
    • public String getName():獲取名稱
    • public long length():獲取長度。字節數
    • public long lastModified():獲取最後一次的修改時間,毫秒值
    • public String[] list():獲取指定目錄下的全部文件或者文件夾的名稱數組
    • public File[] listFiles():獲取指定目錄下的全部文件或者文件夾的File數組
  • B:案例演示

    • File類的獲取功能
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo5_FileMethod {
    public static void main(String[] args) {
//        demo1();
        File dir = new File("E:\\Javawork\\JavaSE_File");
        String[] arr = dir.list();                    //僅爲了獲取文件名
        for (String string : arr) {
            System.out.println(string);
        }
        
        File[] subFiles = dir.listFiles();
        for (File file : subFiles) {                //獲取文件對象
            System.out.println(file);
        }
    }

    private static void demo1() {
        File file1 = new File("ccc.txt");
        File file2 = new File("E:\\Javawork\\JavaSE_File\\ccc.txt");
//        System.out.println(file1.getAbsolutePath());        //獲取絕對路徑
//        System.out.println(file2.getAbsolutePath());
        
//        System.out.println(file1.getPath());                //獲取構造方法中傳入的路徑
//        System.out.println(file2.getPath());
        
//        System.out.println(file1.getName());
//        System.out.println(file2.getName());                //獲取文件或文件夾的名稱
        
//        System.out.println(file1.length());
//        System.out.println(file2.length());
        
        Date d = new Date(file1.lastModified());            //文件的最後修改時間
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        System.out.println(sdf.format(d));
        System.out.println(file2.lastModified());
    }
}

19_File類(輸出指定目錄下指定後綴的文件名)

  • A:案例演示

    • 需求:判斷E盤目錄下是否有後綴名爲.jpg的文件,若是有,就輸出該文件名稱
import java.io.File;
public class Demo6_test {
    /** A:案例演示
    * 需求:判斷E盤目錄下是否有後綴名爲.jpg的文件,若是有,就輸出該文件名稱*/
    public static void main(String[] args) {
        File dir = new File("E:\\");
        /*String[] arr = dir.list();                //獲取E盤下全部文件及文件夾
        for (String string : arr) {
            if(string.endsWith(".jpg")) {
                System.out.println(string);
            }
        }*/
        
        File[] subFiles = dir.listFiles();        //獲取E盤下全部的文件和文件夾對象
        for (File subFile : subFiles) {
            if(subFile.isFile() && subFile.getName().endsWith(".jpg")) {
                System.out.println(subFile);
            }
        }
    }
}

20_File類(文件名稱過濾器的概述及使用)

  • A:文件名稱過濾器的概述

    • public String[] list(FilenameFilter filter)
    • public File[] listFiles(FileFilter filter)
  • B:文件名稱過濾器的使用

    • 需求:判斷E盤目錄下是否有後綴名爲.jpg的文件,若是有,就輸出該文件名稱
  • C:源碼分析

    • 帶文件名稱過濾器的list()方法的源碼
File dir = new File("E:\\");
        String[] arr = dir.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
//                System.out.println(dir);
//                System.out.println(name);
                File file = new File(dir, name);
                return file.isFile() && file.getName().endsWith(".jpg");
            }
        });
        for (String string : arr) {
            System.out.println(string);
        }
相關文章
相關標籤/搜索