天天看點

Java 基礎(第三季)

1. Java 異常

1.1 異常介紹

異常:有異于常态,和正常情況不一樣,有錯誤出現,阻止目前方法或作用域,稱之為異常

異常處理:是程式設計語言或計算機硬體裡的一種機制,用于處理軟體或資訊系統中出現的異常狀況(即超出程式正常執行流程的某些特殊條件)。

異常處理的作用:釋放占用的記憶體空間,減少損失

Throwable 包括兩個方面:(Error 和 Exception)

  • Error(系統錯誤,無法處理)包括:虛拟機錯誤,線程死鎖
  • Exception:編碼、環境、使用者操作輸入出現問題

Exception 包括:

  • 非檢查異常:
    • 空指針異常
    • 數組下标異常
    • 類型轉換異常
    • 算數異常 等等
  • 檢查異常:
    • 檔案異常
    • Sql異常 等等,必須要手動添加捕獲以及處理語句

1.2 處理異常

一般使用 Try-catch 以及 Try-catch-finally 來處理異常

Try{

        //一些會抛出異常的語句

    }catch(Exception e){

         //處理該異常的代碼塊,這裡可以使用 e.printStackTrace(); 來列印異常資訊

    }finally{

        //無論是否發生異常都要執行的代碼塊

    }
           

異常的抛出

  • Throw:抛出自定義的異常
  • Throws:聲明将要抛出何種類型的異常,把它抛出去讓調用這個函數的上級調用函數進行處理
    public void 方法名(參數清單) throws 異常清單{
    
        //調用會抛出異常的方法或者抛出自定義異常
    
    }
               

異常是可以多重處理的,但是要注意順序,子類異常在前,父類異常在後

try語句塊不可以獨立存在,必須與 catch 或者 finally 塊同存

自定義異常

class 自定義異常類  extends 異常類型{}
           

注意點:

  • Exception 是異常類,自定義異常類必要繼承于 Exception 類或其子類
  • Exception 的父類是 Throwable
  • 捕獲到的異常,可以在目前方法的 catch 塊中處理,也可抛出給調用者去處理

Java中的異常鍊:(代碼示例)

public class Test {

        public static void main(String[] args) {


            Test t = new Test();
            try {
                t.test2();
            } catch (Exception e) {
                 e.printStackTrace();
            }
        }

        public void test1() throws DrunkException{
            throw new DrunkException("喝車别開酒");
        }

        public void test2(){
            try {
                test1();
            } catch (DrunkException e) {
                RuntimeException newExc =new RuntimeException("司機一滴酒,親人兩行淚");
                newExc.initCause(e);
                throw newExc;
            }
        }
    }
           

實際應用中的經驗總結:

  1. 處理運作時異常時,采用邏輯區合理規避同時輔助 try-catch 處理
  2. 在多重 catch 塊後面,可以加一個 catch(Exception)來處理可能會被遺漏的異常
  3. 對于不确定的代碼,也可以加上 try-catch ,處理潛在的異常
  4. 盡量去處理異常,切忌知識簡單的而調用 printStackTrace() 去列印輸出
  5. 具體如何去處理異常,要根據不同的業務需求和異常類型去決定
  6. 盡量添加finally語句塊區釋放占用的資源

2. Java 中的字元串

String 類型

Java 中,字元串被作為 String 類型的對象處理,String 類位于 java.lang 包中,預設情況下,該包被自動導入所有的程式。

String 對象建立後則不能被修改,是不可變的,所謂的修改其實是建立了新的對象,所指向的記憶體空間不同。如:

String a = "welcome";
    a = a + "to Java";
           

字元串 a 被修改,指向了新的記憶體空間。

  • 一旦一個字元串在記憶體中建立,則這個字元串将不可改變。如果需要一個可以改變的字元串,我們可以使用 StringBuffer 或者 StringBuilder 類型
  • 每次 new 一個字元串就是産生一個新的對象,即便兩個字元串的内容相同,使用 “==” 比較時傳回值仍然為 false ,如果隻需比較内容是否相同,應使用 “equals” 方法。

String 類提供的常用方法

String 類提供了許多用來處理字元串的方法,例如,擷取字元串長度,對字元串進行截取,将字元串轉換為大寫或小寫、字元串分割等。

String 的常用方法代碼執行個體:

public class StringDemo {

        public static void main(String [] args) {

            String s = " abc def.ghij [email protected]好呀mn#op ql好嗎st.uv wxyz  ";
            int a1 = s.length();
            int a2 = s.indexOf('.');
            int a3 = s.indexOf(".");
            int a4 = s.lastIndexOf('.');
            String a5 = s.substring(a2);
            String a6 = s.substring(a2, a4);
            String a7 = s.trim();
            String a8 = s.toUpperCase();
            String a9 = a8.toLowerCase();

            System.out.println(a1);
            System.out.println(a2);
            System.out.println(a3);
            System.out.println(a4);
            System.out.println(a5);
            System.out.println(a6);
            System.out.println(a7);
            System.out.println(a8);
            System.out.println(a9);

            String a[] = s.split(" ");//通過單個空格分割字元串
            int size = a.length;
            for(int i= 0;i<size;i++) {
                System.out.println(a[i]);
            }

        }
    }
           

雙等号和equals()的差別:

  • “==”:判斷兩個字元串在記憶體中首位址是否相同,即判斷是否時同一個字元串對象
  • Equals():比較兩個字元串對象中存儲的内容是否一緻

Ps:位元組時計算機存儲資訊的基本機關,1 個位元組等于 8 位,gbk 編碼中 1 個漢字字元存儲需要 2 個位元組,1 個英文字元存儲需要 1 個位元組。是以我們看到上面的程式運作結果中,每個漢字對應兩個位元組值,

StringBuilder 和 StringBuffer

在 java 中,除了可以使用 String 類來存儲字元串,還可以使用 StringBuilder 類或 StringBuffer 類存儲字元串。

為什麼要要使用 StringBuilder 或 StringBuffer ?

String類具有不可變性。也就是說String類型的變量在改變時其實是建立一個新的對象。是以當頻繁操作字元串是,就會額外産生很多臨時變量。而使用 StringBuilder 或 StringBuffer 就可以避免這個問題。

它們的差別?

StringBuilder 和 StringBuffer,他們基本相似,不同之處在于,StringBuffer 是線程安全的,而StringBuilder 則沒有實作線程安全功能,是以性能略高。是以一般情況瞎,如果需要建立一個内容可變的字元串對象,應有限考慮使用 StringBuilder 類。

定義 StringBuilder 類的對象的方法:

StringBuilder str1 = new StringBuilder();  

    StringBuilder str2 = new StringBuilder(“imooc”);  
           

Java 中 StringBuilder 類的常用方法:

StringBuilder類提供了很多方法來操作字元串:

代碼示例:

StringBuilderstr = new StringBuilder(“hello”);

    str.append(“imooc”);//在字元串後面追加字元串

    str.append(123);//在字元串後面追加整數

    str.insert(11,”!”);//在指定位置插入内容

    String str2= str.toString();//轉換為String對象
           

注意點:

  1. 字元串是對象
  2. 字元串具不變性
  3. String類提供了許多用來操作字元串的方法:連接配接,提取,查詢等
  4. 在需要頻繁對字元串進行修改操作時使用StringBuilder的效率比String高

3. Java 中的包裝類:

八大基本資料類型:int,long.short,float,double,char,byte,Boolean

為什麼要有包裝類?

基本資料類型是不具備對象的特性的,比如基本類型不能調用方法,功能簡單,為了讓基本資料類型也具備對象的特性,java 為每個基本資料類型鬥提供了一個包裝類,這樣我們就可以向操作對象那樣來操作基本資料類型。

包裝類主要提供兩大類方法:

  1. 将本類型和其他基本類型進行類型轉換的方法
  2. 将字元串和本類型及包裝類互相轉換的方法

我們以 Integer 包裝類為例,來看下包裝類的特性。

Integer包裝類的構造方法:

Integer(int value)    //建立一個Integer對象,表示指定的int值

    Integer(String s)    //建立一個Integer對象,表示String參數所訓示的int值
           

示例如下:

inti = 2;

    Integerm = new Integer(5);             //定義Integer包裝類對象,值為5

    Integern = new Integer(“8”);          //定義Integer包裝類對象,值為8
           

Java中基本類型和包裝類之間的轉換

基本類型和包裝類之間經常需要互相轉換,以Integer為例(其他包裝類類似)

               Integer a = new Integer(3);           //定義Integer包裝類對象

               intb = a +5;               //将對象和基本類型進行運算
           

裝箱和拆箱機制:

裝箱:把基本類型轉換成包裝類,使其具有對象的性質,又可分為手動裝箱和自動裝箱

int i = 10;

    Integer x = new Integer(i); //手動裝箱

    Integer y = i; //自動裝箱
           

拆箱:和裝箱相反,把包裝類對象轉換成基本類型的值,又可分為手動拆箱和自動拆箱

Integer j = new Integer(8);

    int m = j.intValue(); //手動拆箱

    int n = j; //自動拆箱
           

注意點:

  1. Integer 類型可以自動轉化為 int 基本類型
  2. Int 類型對應的安裝包是 java.lang.Integer
  3. long 類型可以自動轉化為 Long 類型
  4. 基本類型 int 無法直接轉換為安裝包 Long 類型

4. Java 中基本類型和字元串之間的轉換

在程式開發中,我們經常需要在基本資料類型和字元串之間進行轉換。

其中,基本資料類型轉換為字元串有三種方法:

  1. 使用包裝類的 toString() 方法
  2. 使用 String 類的 valueOf() 方法
  3. 用一個空字元串加上基本類型,得到的就是基本類型資料對應的字元串

示例如下:

Int c = 10;

    String str1 = Integer.toString(c); //方法一

    String str2 = String.valueOf(c); //方法二

    String str3 = c +  "";          //方法三
           

将字元串轉換成基本類型有兩種方法:

  1. 調用包裝類的parseXXX 靜态方法
  2. 調用包裝類的valueOf()方法轉換為基本類型的包裝類,會自動拆箱

示例如下:

String str = “8”;

    int d = Integer.parseInt(str);            //方法一

    int e = Integer.valueOf(str);              //方法二
           

注意點:

  1. 每一個基本資料類型都對應一個包裝類
  2. 包裝類都在java.lang包中
  3. 包裝類提供了在不同類型間進行轉換的方法
  4. 基本類型是不能調用方法的,而其包裝類具有很多方法

5. 使用 Date 和 SimpleDateFormat 類表示時間

在程式開發中,經常需要處理日期和時間的相關資料,此時我們可以使用 java.util 包中的 Date 類。這個類最主要的作用就是擷取目前時間,我們來看下 Date 類的使用:

Dated = new Date();    //使用預設的構造方法建立Date對象

     System.out.println(d); //輸出Date對象
           

使用 Date 類的預設無參構造方法建立出的對象就代表目前時間,我們可以直接輸出 Date 對象顯示目前的時間,顯示的結果如下:

Wed Jun 11 09:22:30CST 2014

其中,Wed 代表 Wednesday(星期三),Jun 代表 June(六月),11 代表 11 号,CST 代表 China Standard Time

從上面的輸出結果中,我們發現,預設的時間格式不會很友好,與我們日常看到的日期格式不太一樣,如果想要按指定的格式進行顯示,如 2014-06-11 09:22:30,那該怎麼做呢?此時就到了 java.text 包中的 SimpleDateFormat 類大仙身手的時候了,可以使用 SimpleDateFormat 來對日期時間進行格式化,如可以将日期轉換為指定格式的文本,也可将文本轉換為日期。

  • 使用 Format() 方法将日期轉換為指定格式的文本
    Date d = new Date();
    
    //建立 SimpleDateFormat 對象,指定目标格式
    
    SimpleDateFormat  sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
    
    //調用 format() 方法,格式化時間,轉換為指定格式字元串
    
    String today = sdf.format(d);
    
    System.out.println(today);
               

代碼中的 “yyyy-MM-dd HH:mm:ss” 為預定字元串,yyyy 表示四位年,MM 表示兩位月份,dd 表示兩位日期,HH 表示小時(24小時制),mm 表示分鐘,ss 表示秒,這樣就指定了轉換的目标格式,最後調用 format() 方法将時間轉換為指定的格式的字元串。

運作的結果為:2014-06-11 09:55:48

  • 使用 parse() 方法将文本轉換為日期
    String day = “2014年02月14日 10:30:25”;
    
    SimpleDateFormat df = new SimpleDateFormat(“yyyy年MM月dd日  HH:mm:ss”);
    
    //調用parse()方法,将字元串轉化為日期
    
    Date date = df.parse(day);
    
    System.out.println(“目前時間:”+date);
               

運作結果:Fri Feb 14 10:30:25 CST 2014

注意點:

  1. 調用 SimpleDateFormat 對象的 parse() 方法時可能會出現轉換異常,即 ParseException ,是以需要進行異常處理
  2. 使用 Date 類時需要導入 java.util 包,使用 SimpleDateFormat 時需要導入 java.text 包

6. Calendar類的應用

Date 類最主要的作用就是獲得目前時間,同時這個類裡面也具有設定時間以及一些其他功能,但是由于本身設計的問題,這些方法卻遭到衆多批評,不建議使用,更推薦使用 Calendar 類進行時間和日期的處理。

Java.util.Calendar 類時一個抽象類,可以通過調用 getlnstance() 靜态方法擷取一個 Calendar 對象,此對象已由目前日期時間初始化,即預設代表目前時間,如

Calendar c = Calendar.getInstance();
           

那麼如何使用 Calendar 擷取年、月、日、時間等資訊呢?我們來看下面的代碼:

Calendar c = Calendar.getInstance();    //建立Calendar對象

    int year = c.get(Calendar.YEAR);

    int month = c.get(Calendar.MONTH)+1;//擷取月份,因為從0開始,是以加1

    int day = c.get(Calendar.DAY_OF_MONTH);//擷取日期

    int minute = c.get(Calendar.MINUTE);

    int second = c.get(Calendar.SECOND);
           

其中,調用 Calendar 類的 getInstance() 方法擷取一個執行個體,然後通過調用 get() 方法擷取日期時間資訊,參數為需要獲得的字段的值,Calendar.Yea r等為 Calendar 類中定義的靜态常量。

Calendar 類提供了 getTime() 方法,用來擷取 Date 對象,完成 Calendar 和 Date 的轉換,還可通過 getTimeInMillis() 方法,擷取此 Calendar 的時間值,以毫秒為機關,如下所示:

Date date = c.getTime();    //将 Calendar 對象轉換為 Date 對象

    Long time = c.getTimeInMillis();      //擷取目前毫秒數

    System.out.println(“目前時間:” + date);

    System.out.println(“目前毫秒數:” + time);
           

運作結果為:

目前時間:Wed Jun 11 11:26:59 CST 2014

    目前毫秒數:1402457219381