1. 程式人生 > >java之集合總結,異常(try...catch...finally,丟擲throws)

java之集合總結,異常(try...catch...finally,丟擲throws)

一. 集合總結

1. 單列集合 (Collection)
  1.1 執行緒不安全的  jdk1.2
    ArrayList   查詢快 增刪慢(相對)
    LinkedList  查詢慢 增刪快(相對)
    HashSet     去重
    TreeSet     排序
    LinkedHashSet   除了去重 還有存取順序

  1.2 執行緒安全的 jdk 1.0  完全被ArrayList替代
   Vector 

2.雙列集合(Map) 
   2.1執行緒不安全的 jdk 1.2
    HashMap
    LinkedHashMap
    TreeMap

   2.2
執行緒安全的 jdk 1.0 被HashMap替代 Hashtable 3.HashMap 和 Hashtable 區別? Hashtable : 儲存null值 執行時報錯 HashMap : 可以儲存null

程式碼例子:

public class Kll {
    public static void main(String[] args) {
        // HashMap
        HashMap<String, Integer> map = new HashMap<>();
        map.put(null
, 22); map.put("kll", null); //System.out.println(map); //Hashtable Hashtable<String, Integer> map1 = new Hashtable<>(); map1.put(null, 33); } }

執行結果:這裡寫圖片描述

二.異常

1.異常類 Throwable:所有異常的父類。 包含:1. Error(資料庫奔潰 系統奔潰)[自己無法解決]。2.Exception(異常類)。 RuntimeException:執行時異常,是Exception異常類的子類。 2.異常的處理方式

2.1 異常處理方法: ① 自己處理。②交給上級去處理(該方法是誰呼叫的 誰就是上級)

常見異常出現的程式碼:

public class Kll {
    public static void main(String[] args) {

        int[] array = {12, 5, 3};
        // 2.越界異常
        //System.out.println(array[3]);
        // 1. 空指標異常
        //array = null;
        //System.out.println(array[0]);
        // 3.算術異常
        int a = 10 / 0;
    }
}
    main 函式中,發生異常,預設交給方法的呼叫者(JVM虛擬機器)處理。
      處理過程:
     1. 列印錯誤資訊 / by zero
     2.列印異常類  java.lang.ArithmeticException
     3.列印錯誤發生的位置  Kll.java:15
     4.將程式停止

2.2 異常的處理方法:


 * try.....catch.........finally
 * try:存放可能發生異常的程式碼
 * catch:匹配異常類的物件
 * finally:異常匹配完畢後 肯定會執行的程式碼
 * 
 * 使用try處理
 *  1.程式不會停止,會繼續向下執行
 *  2.catch 成功後 執行括號中語句
 *  3.括號中語句執行完畢後,程式繼續執行
 *  
 * 用try...catch處理異常的流程:
 *  catch處理 異常時,可以使用多個catch語句
 *  try中,可能發生多個型別的異常
 *   匹配時注意,類要從小往大依次書寫
 *   
 *   
 *   Java安卓(移動端)
 *   移動端處理異常 try...catch  處理的方式 列印一下
 *   
 *   JavaEE(網站端)
 *   try...catch  處理後,會將發生錯誤跳過去(忽略過去)
 *   需要將錯誤寫入日誌中

用try…..catch處理異常程式碼:

public class Kll {
    public static void main(String[] args) {
        TestException test = new TestException();

        try {
            // new ArithmeticException("/by zero");
            // 異常物件 返回後,int型別接受不了
            // 異常物件 會向下與catch進行匹配
            // 匹配成功,執行catch後邊括號內的程式碼
            // 異常處理完畢後,不會停止程式,會繼續向下執行

            int rel = test.division(10, 0);
            // 注意: 異常發生後,異常發生的語句之後的語句不會執行,會直接匹配catch語句
            System.out.println("try語句停止");
        } catch (ArithmeticException e) {//ArithmeticException 或者 Exception都可以
            // 多型物件建立
            // Exception e = new ArithmeticException("/by zero")
            // 括號中填的是 要匹配的 異常類的引用
            System.out.println("catch語句");
        }
        System.out.println("已停止");
    }
}
// 測試異常處理
class TestException{
    public int division(int a, int b) {
        /*
         * 10 / 0 發生算術異常
         * 產生了一個算術異常物件 並且攜帶了異常資訊
         * new ArithmeticException("/by zero");
         * 將這個建立好的異常物件,返回給方法的呼叫者
         */
        return a / b;
    }
}

3.finally 3.1finally特點:

  • 無論發生異常與否.(除非用System.exit(0) 關閉虛擬機器)
  • finally中的語句,一定會被執行
  • 作用是:
  • 資料庫部分 用於關閉資料庫
  • 流部分 用於關閉資源流

  • final finally finalize 三個關鍵詞有什麼關係?

  • 沒關係
  • final(絕育) 修飾變數,方法,類
  • finally (遺言) 異常處理部分使用,關閉資源
  • finalize 方法名 ,Object類中的方法名。
  • 當物件成為垃圾時,系統會自動呼叫該方法,將物件銷燬。

    finally程式碼例子:

public class Kll {
    public static void main(String[] args) {

        try {
            int num = 10 / 1;
            System.out.println(num);
            return;
        // return,結束方法,但是finally裡的語句還是會執行
        } catch (Exception e) {
            System.out.println("catch語句處理");
        } finally {
            System.out.println("finally語句");
        }
        System.out.println("程式停止");
    }
}

4.用丟擲解決異常的方式

4.1throw 和 throws區別:

  • 寫法:
  • throw : 後邊跟的是 丟擲異常的物件
  • throws :後跟的是異常類的 類名
  • 位置:
  • throw :方法中
  • throws :方法上
  • 作用:
  • throw :丟擲一個異常物件
  • throws :標識方法,攜帶一個異常 4.2案例
/*案例需求:
    建立一個人類 有name 和 age
    要求 人類的年齡賦值時 要在 0 到 120歲之間*/

1️⃣建立人類 就直接用攜帶異常的方式,進行處理範圍。

public class Person {
    private String name;
    private int age;
    // 構造方法
    public Person() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    // set/get方法
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    // 控制年齡範圍 0 - 120
    // 丟擲異常的方法,需要在方法上標識一下
    // 該方法可能會接收到 異常物件
    // 關鍵詞 throws  標識方法,有異常
    // throws + 異常型別
    public void setAge(int age) throws Exception{
        if (age > 0 && age < 120) {
            this.age = age;
        }else {
            // 丟擲一個異常物件 提示使用者賦值錯誤
            // Exception e =
            // new Exception("AgeOutOfBounds " + "Age: " + age);
            // 誰呼叫了 該方法,就拋給誰
            // 關鍵詞 throw

            // 建立自定義異常類的物件
            AgeOutOfBoundsException e = new AgeOutOfBoundsException("AgeOutOfBounds " + "Age: " + age);
            throw e;
        }
    }
    // toString方法
    @Override
    public String toString() {
        return "[name=" + name + ", age=" + age + "]";
    }

}
// 自定義 異常類
// 核心:類名(見名知意,類名就能反映出異常的型別)
// 年齡超出了範圍
// 需要提供構造方法
class AgeOutOfBoundsException extends Exception{

    public AgeOutOfBoundsException() {
        super();
    }

    public AgeOutOfBoundsException(String message) {
        super(message);
    }

}

2️⃣主函式

public class Demo05 {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("kll");
        // 自己處理,使用try..catch
        /**try {
            person.setAge(130);
            System.out.println(person);
        } catch (Exception e) {
            // 列印異常資訊
            // 第一種
            //System.out.println(e.getMessage());
            //e.getMessage();
            // 列印資訊 錯誤位置
            // 第二種
            e.printStackTrace();
        }*/
        // 交給上級處理
        // 將異常在方法上丟擲 即在main方法上 丟擲  throws 異常類名
        try {
            person.setAge(130);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

五.異常的分類:

  • 1.執行時異常(程式設計師犯的錯,需要將程式停下來修改錯誤)[RuntimeException]
  • 例如: 空指標,越界
  • 特點: 1.不強制處理. 2.一旦發生執行時異常,程式會立即停止(不處理的情況下)
  • 2.編譯時異常(除了執行時異常,剩下的全是編譯時異常)
  • 未雨綢繆(有可能發生錯誤,提前為這個錯誤做準備)
  • 特點: 系統強制你對編譯時異常進行處理。