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(數字格式化異常)
智能推薦
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修飾成員方法,就...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...