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;
}
}
}
實際應用中的經驗總結:
- 處理運作時異常時,采用邏輯區合理規避同時輔助 try-catch 處理
- 在多重 catch 塊後面,可以加一個 catch(Exception)來處理可能會被遺漏的異常
- 對于不确定的代碼,也可以加上 try-catch ,處理潛在的異常
- 盡量去處理異常,切忌知識簡單的而調用 printStackTrace() 去列印輸出
- 具體如何去處理異常,要根據不同的業務需求和異常類型去決定
- 盡量添加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對象
注意點:
- 字元串是對象
- 字元串具不變性
- String類提供了許多用來操作字元串的方法:連接配接,提取,查詢等
- 在需要頻繁對字元串進行修改操作時使用StringBuilder的效率比String高
3. Java 中的包裝類:
八大基本資料類型:int,long.short,float,double,char,byte,Boolean
為什麼要有包裝類?
基本資料類型是不具備對象的特性的,比如基本類型不能調用方法,功能簡單,為了讓基本資料類型也具備對象的特性,java 為每個基本資料類型鬥提供了一個包裝類,這樣我們就可以向操作對象那樣來操作基本資料類型。
包裝類主要提供兩大類方法:
- 将本類型和其他基本類型進行類型轉換的方法
- 将字元串和本類型及包裝類互相轉換的方法
我們以 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; //自動拆箱
注意點:
- Integer 類型可以自動轉化為 int 基本類型
- Int 類型對應的安裝包是 java.lang.Integer
- long 類型可以自動轉化為 Long 類型
- 基本類型 int 無法直接轉換為安裝包 Long 類型
4. Java 中基本類型和字元串之間的轉換
在程式開發中,我們經常需要在基本資料類型和字元串之間進行轉換。
其中,基本資料類型轉換為字元串有三種方法:
- 使用包裝類的 toString() 方法
- 使用 String 類的 valueOf() 方法
- 用一個空字元串加上基本類型,得到的就是基本類型資料對應的字元串
示例如下:
Int c = 10;
String str1 = Integer.toString(c); //方法一
String str2 = String.valueOf(c); //方法二
String str3 = c + ""; //方法三
将字元串轉換成基本類型有兩種方法:
- 調用包裝類的parseXXX 靜态方法
- 調用包裝類的valueOf()方法轉換為基本類型的包裝類,會自動拆箱
示例如下:
String str = “8”;
int d = Integer.parseInt(str); //方法一
int e = Integer.valueOf(str); //方法二
注意點:
- 每一個基本資料類型都對應一個包裝類
- 包裝類都在java.lang包中
- 包裝類提供了在不同類型間進行轉換的方法
- 基本類型是不能調用方法的,而其包裝類具有很多方法
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
注意點:
- 調用 SimpleDateFormat 對象的 parse() 方法時可能會出現轉換異常,即 ParseException ,是以需要進行異常處理
- 使用 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