• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • JAVA學習筆記(四)

    標簽: JAVA

    一、生成Javadoc文檔

    我們先來看一下java的API文檔中Arrays類的sort方法:
    這里寫圖片描述
    我們在Eclipse中這樣寫道:

    /**
     * 該類是數組操作算法的工具類,提供了大量的靜態方法用來操作數組
     * @author Author
     *
     */
    public class ArrayUtil {
    
        private ArrayUtil(){
    
        }
    
        /**
         * 使用算法對數組進行升序排序
         * @param arr 要排序的數組
         */
        public static void sort(int[] arr){
            //具體方法實現省略...
        }
    
        /**
         * 使用二分搜索法來搜索指定的int型數組,以獲得指定的值。
         * 必須在進行此調用之前對數組進行排序(通過 sort(int[]) 方法)。
         * @param   arr    要搜索的數組
         * @param   key    要搜索的值
         * @return  如果存在則返回對應的索引,如果不存在則返回-1
         */
        public static int BinarySearch(int[] arr,int key){
            return -1;
        }
    }

    當生成文檔時是這樣的:
    這里寫圖片描述

    再來看一個例子:

    /**
     * 定義一個可走路的規范,包含一個可走路的行為,適用于爬行動物
     * 
     * 
     * @author Author
     * @since Android 8.0
     * @see 另請參見www.baidu.com
     */
    public interface IWalkable {
        /**
         *  可走路的行為
         */
        void walk();
    }

    生成文檔時是這樣的:
    這里寫圖片描述
    這里寫圖片描述

    怎樣生成文檔:選中你想生成的文檔,選擇導出,選擇javadoc,再點擊完成即可。
    這里寫圖片描述

    二、異常處理機制

    沒有異常處理機制的困惑

    ?所謂異常,不是指語法錯誤,語法錯誤是編譯錯誤,這樣是無法生成字節碼。
    ?異常處理是衡量一門語言是否成熟的標準之一,主流的語言Java,C++,C#等都是支持異常處理機制的。
    ?異常處理機制可以讓程序有更好的容錯性,使我們的代碼更健壯。
    但是傳統的C語言并沒有異常處理機制,此時程序員只能通過方法的特定返回值來表示異常情況,并且使用if語句來判斷是否產生了異常,那沒有異常會帶來什么呢?

    沒有異常機制的缺點:
    1.使用方法的返回值來表示異常情況有限,無法窮舉出所有的異常情況;
    2.異常流程代碼和正常流程代碼混在一起,增大了程序的復雜性,降低了可讀性;
    3.隨著系統的規模擴大,可維護性降低。

    針對沒有異常處理機制的缺點,我們有以下解決方案:
    解決方案:
    1.把不同類型的異常情況描述成不同類(異常類);
    2.分離異常流程代碼和正常流程代碼;
    3.靈活處理異常,如果當前方法處理不了,應該交給調用者處理。

    出現異常之后,程序運行會中斷,所以我們要處理異常:
    1.該方法不處理,而是聲明拋出,由該方法的調用者來處理(throws);
    2.在方法中使用try-catch的語句塊來處理異常

    使用try-catch捕獲單個異常:
    語法:

    try{
        //編寫可能會出現異常的代碼
    }catch(異常類型 e){
        //處理異常的代碼
        //記錄日志,打印異常信息,繼續拋出異常
    }

    注意: try和catch必須一起使用,不能單獨使用。

    如何獲取異常信息:(Throwable類的方法)
    1.String getMessage():獲取異常類的,描述信息;
    2.String toString():獲取異常類的類型和異常描述信息;
    3.void printStackTrace():打印異常的跟蹤棧信息并輸入到控制臺;
    (System.err.println(“XXX”))
    在開發中常用printStackTrace()


    使用try-catch捕獲單個異常:

    try{
        //編寫可能會出現異常的代碼
    }catch(異常類型A e){
        //處理異常的代碼
        //記錄日志,打印異常信息,繼續拋出異常
    }catch(異常類型B e){
        //處理異常的代碼
        //記錄日志,打印異常信息,繼續拋出異常
    }

    注意:
    1.一個catch語句只能捕獲一種類型的異常,如果要捕獲多個類型的異常,必須使用多個catch語句;
    2.代碼在運行時,只能同時擁有一種類型的異常。


    finally語句塊

    finally語句塊表示最終都會執行的代碼,無論是否有異常

    什么時候必須要用finally語句塊:
    ?當我們在try語句塊中打開了一些物理資源(磁盤文件 /網絡連接/數據庫連接等),我們都得在使用完之后,關閉這些資源。

    finally的兩種語法:

    1.try…finally:此時我們沒有用catch來捕獲異常,因為此時根據具體情況,我們會拋出異常,自己不處理;
    2.try…catch…finally:自身需要處理異常,最后還需要關閉資源。

    注意: finally不能單獨使用。

    當只有在try或者catch中調用退出JVM的方法時,finally語句才不會執行,否則finally將永遠執行。

    關于finally的有趣的問題:
    問下面代碼輸出結果為?

    try {
            return 
                    1;
        } finally {
            return 
                    100;
        }

    實際上輸出100,因為先執行finally語句塊。

    那么下面的代碼輸出結果是多少:

    int a = 1;
    try {       
            return 
                    a;
        } finally {
            ++
            a;
        }
    System.out.println(a);

    實際上輸出1,因為try語句塊中的a在程序進入時就確定了(具體的用斷點調試一下,仍然是finally先執行)

    拋出異常

    throw語句:

    用于方法內部,拋出一個異常對象:

    throw new 異常類(異常信息);終止方法

    一般的,當一個方法出現不正常的情況的時候,我們不知道該方法應該返回什么,此時就返回一個錯誤,在catch語句塊中繼續向上拋出異常。
    return是返回一個值,throw是返回一個錯誤,返回給該方法的調用者。
    如以下代碼:

    public static void main(String[] args) {
            try{
                int ret = divide(10,0);
                System.out.println(ret);
            } catch(ArithmeticException e) {
                System.out.println(e.getMessage());
            }
        }
    
        private static int divide(int num1, int num2) {
            System.out.println("begin...");
            if (num2 == 0) {
                throw new ArithmeticException("除數不能為0!!!");
            }
            System.out.println("--------------------");
            try {
                int ret = num1 / num2;
                System.out.println("結果為" + ret);
            } catch (ArithmeticException e) {
                e.printStackTrace();
            }
            System.out.println("end...");
            return 0;
        }

    throws語句:

    運用于方法聲明之上,表明當前方法不處理異常,二十提醒該方法的調用者來處理異常(拋出異常)。
    如果每一個方法都放棄處理異常,都直接通過throws聲明拋出,最后異常會拋到main方法,如果此時main方法不處理,繼續拋出給JVM,底層的處理機制就是打印異常的跟蹤棧信息。(runtime異常就是默認這種處理方式)
    如以下代碼:

    public static void main(String[] args) {
            try {
                int ret = divide(10, 0);
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    
        private static int divide(int num1, int num2) throws Exception {
            System.out.println("begin...");
            if (num2 == 0) {
                throw new Exception("除數不能為0!!!");
            }
            System.out.println("------");
            try {
                int ret = num1 / num2;
                System.out.println("結果為" + ret);
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("end...");
            return 0;
        }

    自定義異常類

    為什么需要自定義異常類?
    Java中的不同異常類,分別別表示某一種特殊的異常情況,在開發中總是有些異常情況是Sun公司沒有定義的。此時我們根據自己的業務的異常情況來定義異常類
    什么是自定義異常類?
    在開發中根據自己業務的情況來定義異常類。
    異常類如何定義?
    1.自定義一個受檢查的異常類,并繼承于Exception;
    2.自定義一個運行時期的異常類,并繼承于RuntimeException。

    用以下代碼作為Example:

    //業務邏輯異常
    public class LogicException extends RuntimeException{
        private static final long serialVersionUID = 1L;
    
        public LogicException() {
            super();
        }
    
        public LogicException(String message) {
            super(message);
        }
    
        /**
         * 
         * @param message 表示當前異常的原因/信息
         * @param cause   當前異常的根本原因
         */
        public LogicException(String message, Throwable cause) {
            super(message, cause);
        }
    }

    下面是模擬注冊賬戶的自定義異常類:

    public class RegisterDemo {
        //模擬數據庫中已經存在的賬號
        private static String[] names = {"will","lucy","Sue","Bob"};
    
        public static void main(String[] args) {
            try{
                //可能出現異常的代碼
                checkUsername("will");
                System.out.println("注冊成功!");
            }catch(LogicException e) {
                //處理異常
                String errorMes = e.getMessage();
                System.out.println(errorMes);
            }   
        }
        //判斷當前賬號是否存在
        public static boolean checkUsername(String username){
            for (String name : names){
                if (name.equals(username)){
                    throw new LogicException("該用戶名已經被注冊");
                }
            }
            return true;
        }
    }
    

    Java7 的異常新特性

    Android 用不到Java7,支持Java5和Java6的語法。
    1.增強的throw:
    Java7中處理拋出異常更精確了,不再籠統的使用Exception聲明拋出。
    2.多異常捕獲:

    try {
        //...
    } catch (ArithmeticException | NumberFormatException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }

    3.自動資源關閉:
    Java7之前的關閉資源:

    private static void test1() {
        OutputStream out = null;
        try {
            out = new FileOutputStream("F:/123.txt");
            out.write(1);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    Java7中關閉資源:

    private static void test2() {
        try (
                // 打開資源
                OutputStream out = new FileOutputStream("F:/123.txt");) {
            // 可能出現異常的代碼
            out.write(1);
        } catch (Exception e) {
            // 處理異常
            e.printStackTrace();
        }
    }

    注意:try語句塊()中的對象必須實現AutoCloseable的接口。

    處理異常的原則

    1.異常只能處理非正常情況,try-catch會影響性能;
    2.需要為異常提供說明文檔,比如Java doc,如果自定義了一個異常或某一方法拋出了異常,我們應該記錄在文檔注釋中;
    3.盡可能避免異常;
    4.異常的粒度很重要,應該為一個基本操作定義一個try-catch塊,不要為了簡便將幾百行代碼放到一個try-catch塊中;
    5.不建議在循環中進行異常處理,應該在循環外對異常進行捕獲處理;
    6.自定義異常類盡量使用RuntimeException類型的。

    幾個常見的RuntimeException:
    ArithmeticException(算術異常)
    NullPointerException(空指針異常)
    IndexOutOfBoundsException(索引越界)
    ArrayIndexOutOfBoundsException(數組索引越界)
    ClassCastException(類型強制轉化異常)
    NumberFormatException(數字格式化異常)


    版權聲明:本文為qq_42650988原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_42650988/article/details/81669052

    智能推薦

    2020.09.13 Java學習筆記(四)

    2020.09.13 Java學習筆記(四) 一.Java方法詳解 1.System.out.println();是什么? 類:system out:輸出對象 println():方法 即調用系統類里的標準輸出對象out中的方法 println() 2.Java方法是語句的集合,他們在一起執行一個功能。 ? 方法是解決一類問題的步驟的有序組合 ? 方法包含于類或者對象中 ? 方法在程序中被創建,在...

    Java學習筆記(四) —— 類和對象

    Java中的類和C中的結構體相似,并且類中可以包含方法和變量。 而對象就好比C中的結構體變量,對象通過‘.’來調用類中的方法和變量。 以上是我的個人理解,下面來具體說說類和對象。   類 類是組成Java源文件的基本元素一個源文件是由若干個類組成的。 類的形式如下: class 類名{      類體 } class是關鍵字...

    JAVA學習筆記四:線程(創建)

    線程概念: 線程,有時被稱為輕量進程(Lightweight Process,LWP),是程序執行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一...

    java學習筆記(四)多維數組

    多維數組 二維數組 0.數組特點 1.定義/聲明 2.初始化 3.元素訪問 4.遍歷輪詢 5.引用類型在內存中的存儲結構 三維數組 二維數組練習 1.模擬班級同學每周換位置 二維數組 0.數組特點 數組本身是一個引用類型 聲明時必須指定長度 長度一旦確定不能再次發生改變 1.定義/聲明 里面存儲的類型[ 數組名字; int[][] arrray; 2.初始化 靜態 —有長度  有元素 ...

    Java學習筆記(四)Map集合

    Map<k, v> Map集合特點: 是一個雙列集合,一個元素包含兩個值(key,value) key與value數據類型可以相同,也可以不同 key不可以重復,value可以重復 key與value一一對應 Map的遍歷: 第一種方法 第二種方法 HashMap: 繼承Map接口, 底層是哈希表,查詢速度特別快 無序的集合,存取順序可能不一致 LinkedHashMap: 繼承Has...

    猜你喜歡

    Java Web學習筆記(四)——xml基礎

    xml是可擴展標記語言,非常靈活,沒有固定的標簽,所有的標簽都可以自定義。xml通常用于信息的記錄和傳遞,經常被用于充當配置文件。 xml的格式 1.  聲明信息,用于描述xml的版本和編碼方式 2.  xml有且僅有一個根元素(元素由開始標簽、元素內容和結束標簽組成) 3.  xml是大小寫敏感的 4.  標簽是成對出現的,并且要正確嵌套 5.  ...

    Java基礎語言部分學習筆記(四)

    靜態static關鍵字描述 例子:學生類 { 姓名 年齡 學號 所在教室} 根據同一學生類可以創造多個學生對象,但是所在教室相同,所以教室的值初始化在學生類中 ===================== 靜態static關鍵字修飾成員變量 ============================================== static用來修飾成員方法 一旦使用static修飾成員方法,就...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    精品国产乱码久久久久久蜜桃不卡