您好,登錄后才能下訂單哦!
今天小編給大家分享一下Java注解和異常實(shí)例分析的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
注解是JDK1.5版本開始引入的一個(gè)特性,用于對(duì)代碼進(jìn)行說明,可以對(duì)包、類、接口、字段、方法參數(shù)、局部變量等進(jìn)行注解。它主要的作用有以下四方面:
生成文檔,通過代碼里標(biāo)識(shí)的元數(shù)據(jù)生成javadoc文檔。
編譯檢查,通過代碼里標(biāo)識(shí)的元數(shù)據(jù)讓編譯器在編譯期間進(jìn)行檢查驗(yàn)證。
編譯時(shí)動(dòng)態(tài)處理,編譯時(shí)通過代碼里標(biāo)識(shí)的元數(shù)據(jù)動(dòng)態(tài)處理,例如動(dòng)態(tài)生成代碼。
運(yùn)行時(shí)動(dòng)態(tài)處理,運(yùn)行時(shí)通過代碼里標(biāo)識(shí)的元數(shù)據(jù)動(dòng)態(tài)處理,例如使用反射注入實(shí)例。
Java自帶的標(biāo)準(zhǔn)注解,包括@Override
、@Deprecated
和@SuppressWarnings
,分別用于標(biāo)明重寫某個(gè)方法、標(biāo)明某個(gè)類或方法過時(shí)、標(biāo)明要忽略的警告,用這些注解標(biāo)明后編譯器就會(huì)進(jìn)行檢查。
元注解,元注解是用于定義注解的注解,包括@Retention
、@Target
、@Inherited
、@Documented
@Retention
用于標(biāo)明注解被保留的階段
@Target
用于標(biāo)明注解使用的范圍
@Inherited
用于標(biāo)明注解可繼承
@Documented
用于標(biāo)明是否生成javadoc文檔
自定義注解,可以根據(jù)自己的需求定義注解,并可用元注解對(duì)自定義注解進(jìn)行注解。
Throwable 是 Java 語言中所有錯(cuò)誤與異常的超類。
Error 類及其子類:程序中無法處理的錯(cuò)誤,表示運(yùn)行應(yīng)用程序中出現(xiàn)了嚴(yán)重的錯(cuò)誤。
Exception 程序本身可以捕獲并且可以處理的異常。Exception 這種異常又分為兩類:運(yùn)行時(shí)異常和編譯時(shí)異常。
運(yùn)行時(shí)異常:
都是RuntimeException類及其子類異常,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標(biāo)越界異常)等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯(cuò)誤引起的,程序應(yīng)該從邏輯角度盡可能避免這類異常的發(fā)生。
運(yùn)行時(shí)異常的特點(diǎn)是Java編譯器不會(huì)檢查它,也就是說,當(dāng)程序中可能出現(xiàn)這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會(huì)編譯通過。
非運(yùn)行時(shí)異常 (編譯異常)
是RuntimeException以外的異常,類型上都屬于Exception類及其子類。從程序語法角度講是必須進(jìn)行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。
可查異常(編譯器要求必須處置的異常):
正確的程序在運(yùn)行中,很容易出現(xiàn)的、情理可容的異常狀況??刹楫惓km然是異常狀況,但在一定程度上它的發(fā)生是可以預(yù)計(jì)的,而且一旦發(fā)生這種異常狀況,就必須采取某種方式進(jìn)行處理。
除了RuntimeException及其子類以外,其他的Exception類及其子類都屬于可查異常。這種異常的特點(diǎn)是Java編譯器會(huì)檢查它,也就是說,當(dāng)程序中可能出現(xiàn)這類異常,要么用try-catch語句捕獲它,要么用throws子句聲明拋出它,否則編譯不會(huì)通過。
不可查異常(編譯器不要求強(qiáng)制處置的異常)
包括運(yùn)行時(shí)異常(RuntimeException與其子類)和錯(cuò)誤(Error)。
異常的申明(throws):
在Java中,當(dāng)前執(zhí)行的語句必屬于某個(gè)方法,Java解釋器調(diào)用main方法執(zhí)行開始執(zhí)行程序。若方法中存在檢查異常,如果不對(duì)其捕獲,那必須在方法頭中顯式聲明該異常,以便于告知方法調(diào)用者此方法有異常,需要進(jìn)行處理。 在方法中聲明一個(gè)異常,方法頭中使用關(guān)鍵字throws,后面接上要聲明的異常。若聲明多個(gè)異常,則使用逗號(hào)分割。如下所示:
public static void method() throws IOException, FileNotFoundException{ //something statements }
異常的拋出(throw):
如果代碼可能會(huì)引發(fā)某種錯(cuò)誤,可以創(chuàng)建一個(gè)合適的異常類實(shí)例并拋出它,這就是拋出異常。
如下所示:
public static double method(int value) { if(value == 0) { throw new ArithmeticException("參數(shù)不能為0"); //拋出一個(gè)運(yùn)行時(shí)異常 } return 5.0 / value; }
如果你的資源實(shí)現(xiàn)了 AutoCloseable 接口,你可以使用這個(gè)語法。大多數(shù)的 Java 標(biāo)準(zhǔn)資源都繼承了這個(gè)接口。當(dāng)你在 try 子句中打開資源,資源會(huì)在 try 代碼塊執(zhí)行后或異常處理后自動(dòng)關(guān)閉。
File file = new File("./tmp.txt"); try (FileInputStream inputStream = new FileInputStream(file);) { // use the inputStream to read a file } catch (FileNotFoundException e) { log.error(e); } catch (IOException e) { log.error(e); } }
提到JVM處理異常的機(jī)制,就需要提及Exception Table,以下稱為異常表。我們暫且不急于介紹異常表,先看一個(gè)簡單的 Java 處理異常的小例子。
try { testNPE(); } catch (Exception e) { e.printStackTrace(); } }
異常表中包含了一個(gè)或多個(gè)異常處理者(Exception Handler)的信息,這些信息包含如下
from 可能發(fā)生異常的起始點(diǎn)
to 可能發(fā)生異常的結(jié)束點(diǎn)
target 上述from和to之前發(fā)生異常后的異常處理者的位置
type 異常處理者處理的異常的類信息
JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語言的反射機(jī)制。
在Java中,Class類與java.lang.reflect類庫一起對(duì)反射技術(shù)進(jìn)行了全力的支持。在反射包中,我們常用的類主要有Constructor類表示的是Class 對(duì)象所表示的類的構(gòu)造方法,利用它可以在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建對(duì)象、Field表示Class對(duì)象所表示的類的成員變量,通過它可以在運(yùn)行時(shí)動(dòng)態(tài)修改成員變量的屬性值(包含private)、Method表示Class對(duì)象所表示的類的成員方法,通過它可以動(dòng)態(tài)調(diào)用對(duì)象的方法(包含private)
Class類對(duì)象的獲取:
@Test public void classTest() throws Exception { // 獲取Class對(duì)象的三種方式 logger.info("根據(jù)類名: \t" + User.class); logger.info("根據(jù)對(duì)象: \t" + new User().getClass()); logger.info("根據(jù)全限定類名:\t" + Class.forName("com.test.User")); // 常用的方法 logger.info("獲取全限定類名:\t" + userClass.getName()); logger.info("獲取類名:\t" + userClass.getSimpleName()); logger.info("實(shí)例化:\t" + userClass.newInstance()); }
Constructor類及其用法
Field類及其用法
Method類及其用法
getSimpleName:只獲取類名
getName:類的全限定名,jvm中Class的表示,可以用于動(dòng)態(tài)加載Class對(duì)象,例如Class.forName。
getCanonicalName:返回更容易理解的表示,主要用于輸出(toString)或log打印,大多數(shù)情況下和getName一樣,但是在內(nèi)部類、數(shù)組等類型的表示形式就不同了。
以上就是“Java注解和異常實(shí)例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。