2异常处理_异常是什么?什么是常用类?
第一節 異常
1. 異常的概念
? 異常(Exception) 即例外,程序沒有按自己預想的結果運行出來,出現了非正常情況,即“程序得病了”。怎么讓我們寫的程序做出合理的處理,不至于崩潰是我們關注的核心。 異常機制就是當程序出現錯誤,程序如何安全退出的機制。
? 所謂錯誤是指該程序運行的過程中發生的一些例外事件(如:除0,數組下標越界,所要讀取的文件不存在)。
? Java異常類是Java提供的用于處理程序中錯誤的一種機制。設計良好的程序應該在異常發生時提供處理這些錯誤的方法,使得程序不會因為異常的發生而阻斷或發生不可預見的結果。
? Java程序的執行過程中如出現例外事件,可以生成一個異常類對象,該異常對象封裝了例外事件的信息并將被提交給Java運行時系統,這個過程稱為拋出( throw )異常。
當Java運行時系統接收到異常對象時,會尋找能處理這一異常的代碼并把當前異常對象交給其處理,這一過程稱為捕獲(catch)異常。
2. 異常的分類
? JDK中定義了很多異常類,這些類對應了各種各樣可能出現的例外事件。我開著車走在路上,一頭豬沖在路中間,我剎車,這叫一個 異常。我開著車在路上,發動機壞了,我停車,這叫錯誤。系統處于不可恢復的崩潰狀態。發動機什么時候壞?我們普通司機能管嗎?不能。發動機什么時候壞是汽車廠發動機制造商的事。
? Error:稱為錯誤,由Java虛擬機生成并拋出,包括動態鏈接失敗、虛擬機錯誤等,程序對其不做處理。Error 類層次描述了 Java 運行時系統內部錯誤和資源耗盡錯誤。這類錯誤是我們無法控制的,同時也是非常罕見的錯誤。所以在編程中,不去處理這類錯誤。Error 表明系統 JVM 已經處于不可恢復的崩潰狀態中。我們不需要管他。 如:寫代碼時突然斷電,或者內存溢出。
? Exception:所有異常的父類,其子類對應了各種各樣可能出現的異常事件,一般需要用戶顯示地聲明或捕獲。
Runtime Exception
? Runtime Exception類是 Exception 類的子類,叫做運行時異常,Java 中的所有運行時異常都會直接或者間接地繼承自 RuntimeException 類。
? 這一類特殊的異常,如被0除、數組下標超范圍等,其產生比較頻繁,處理麻煩,如果顯示的聲明或捕獲將會對程序可讀性可運行效率影響很大。因此由系統自動檢測并將它們交給缺省的異常處理程序(用戶可不必對其處理);我們可以通過程序的健壯性來處理,不推薦使用異常處理機制來處理。例如:
NullPointerException: 當程序訪問只有引用沒有對象的成員屬性或成員方法。怎么處理?
ArithmeticException: 除數為 0ClassCastException:多態時類型轉換錯誤
ArrayIndexOutOfBoundsException: 訪問的元素下表超過數組長度
NumberFormatException: 數字格式異常!
CheckException(**需要處理的)
? Java 中凡是繼承自 Exception,而不繼承自 RuntimeException 類的異常都是非運行時異常,也叫檢查時異常。 如:IOException。 必須要對其進行處理,否則無法通過編譯。這類異常的產生不是程序本身的問題,通常由外界因素造成的。 為了預防這些異常產生時,造成程序的中斷或得到不正確的結果,Java 要求編寫可能產生這類異常的程序代碼時,一定要去做異常的處理。
3. 異常處理
1) 異常產生
? 之所以出現異常,是因為內部拋出了異常對象,這個異常對象的產生分為系統內部產生,或程序員手動拋出異常。
2) 異常捕獲 try catch finally
對于編譯(非運行)時異常( checked exception ),必須要對其進行處理,否則無法通過編譯。處理方式有兩種:
- 異常捕獲
- 異常處理
try代碼段包含可能產生例外的代碼
try代碼段后跟有一個或多個catch代碼段
每個catch代碼段聲明其能處理的一種特定類型的異常并提供處理的方法
當異常發生時,程序會中止當前的流程,根據獲取異常的類型去執行相應的catch代碼段
一個 try 后面可以跟多個 catch,但不管多少個, 最多只會有一個catch 塊被執行。
finally段的代碼無論是否發生異常都有執行try語句
? try{…}語句制定了一段代碼,該段代碼就是一次捕獲并處理意外的范圍。
? 在執行過程中,該段代碼可能會產生并拋出一種或幾種類型的異常對象,它后面的catch語句要分別對這些異常做相應的處理。
? 如果沒有意外產生,所有的catch代碼段都被略過不執行。catch語句
? 在catch語句塊中是對異常進行處理的代碼,每個try語句塊可以伴隨一個或多個catch語句,用于處理可能產生的不同類型的異常對象。
? 在catch中聲明的異常對象封裝了異常事件發生的信息,在catch語句塊中可以使用這個對象的一些方法獲取這些信息。例如:
getMessage()方法,用來得到有關異常事件的信息
printStackTrace()方法,用來跟蹤異常事件發生時執行堆棧的內容finally語句
? finally語句為異常處理提供一個統一的出口,使得在控制流程轉到程序的其它部分以前,能夠對程序的狀態作統一的管理。無論try所制定的程序塊中是否拋出異常,finally所指定的代碼都要被執行。
通常在finally語句中可以進行資源的清除工作,如:
關閉打開的文件
刪除臨時文件
3) 向外 聲明( 拋出) 異常 throws
? 在產生異常的方法聲明后面寫上 throws 某一個 Exception 類型,如 throws Exception,將異常拋出到外面一層去
異常與重寫聲明
子類聲明的異常范圍不能超出父類的異常范圍
4. 使用自定義的異常
1)概念
? 所謂自定義異常,通常就是定義一個類,去繼承 Exception 類或者它的子類。因為異常必須直接或者間接地繼承自 Exception 類。通常情況下,會直接繼承自 Exception 類,一般不會繼承某個運行時的異常類。
2)步驟
使用自定義異常一般有如下步驟:
1、 通過繼承java.lang.Exception類聲明自己的異常類
2、 在方法適當的位置生成自定義異常的實例,并用throw語句拋出
3、 在方法聲明部分用throws語句聲明該方法可能拋出的異常
第三節 常用類
1. 字符串相關類
1)String
不可變的字符序列
2)StringBuffer
可變字符序列,并且線程安全,但是效率低
3)StringBuilder
可變字符序列,線程 不安全,但是效率高 (一般用他!)
1)String
由于使用特別多,所以有特殊快捷的創建方式通過雙引號 "" 直接創建對象
構造方法
常用方法
還有 valueOf()系列,可以將基本類型的數據轉為字符串,當然一般不用這么麻煩
字符串分割 split()
2)StringBuffer和StringBuilder
這兩個類使用方式類似。一般用于做字符串拼接,刪除,替換,反轉,截取,插入等。
通過查看源碼,認識StringBuffer和StringBuilder的構造方式,以及與String的轉換方式
2. 包裝類?
JAVA并不是純面向對象的語言。Java語言是一個面向對象的語言,但是Java中的基本數據類型卻是不面向對象的。但是我們在實際使用中經常需要將基本數據轉化成對象,便于操作。比如:集合的操作中。例如使用Map對象要操作put()方法時,需要傳入的參數是對象而不是基本數據類型。為了解決這個不足,在設計類時為每個基本數據類型設計了一個對應的類進行代表,這樣八個和基本數據類型對應的類統稱為包裝類(Wrapper Class)。包裝類均位于java.lang包
在這八個類名中,除了Integer和Character類以后,其它六個類的類名和基本數據類型一致,只是類名的第一個字母大寫即可。
對于包裝類說,這些類的用途主要包含兩種:
a、作為和基本數據類型對應的類類型存在,方便涉及到對象的操作。
b、包含每種基本數據類型的相關屬性如最大值、最小值等,以及相關的操作方法(這些操作方法的作用是在基本類型數據、包裝類對象、字符串之間提供轉化!)。
包裝類和基本類型之間存在自動裝箱和自動拆箱操作,所以可以互相方便地切換。
3. 日期類
? 作為與我們息息相關的日期,在開發中也是很常見的。在程序中,日期的存儲也是個數字,是個長整型的數字。0代表1970年1月1日 00:00:00,而我們處于東八區,所以為1970年1月1日 08:00:0 ,往前推,負數表示之前的時間,往后算正數表示之后的時間。
? 而在日常中,我們表示日期是使用字符串表示,如 1970年1月1日 08:15 、 1970/01/01 08:15 1970-01-01 08:15 等等,因此就涉及到 如何將長整型數與字符串互轉的問題,這也是學習的重點。
1) pre8常用日期相關類
(1) 當前時間
//當前毫秒數long timeNum =System.currentTimeMillis();System.out.println(timeNum);//當前日期Date nowDate =new Date();System.out.println(date);(2) Date
//0 時間點 東八區 1970年1月1日 08:00:0 Date date =new Date(0L);System.out.println(date);//指定一個時間Date myDate =new Date(189712329239L);System.out.println(myDate);System.out.println(myDate.getTime()); //獲取長整型數字//修改時間myDate.setTime(0L);System.out.println(myDate);(3) SimpleDateFormat 日期格式化,在日期格式化的過程中,會用到模板,這個在api中有詳細說明
字符串的表示形式與日期互換,使用日期轉換器SimpleDateFormat ,代碼如下:
注意parse()存在 的異常ParseException
2) 8日期相關的常用api(1) jdk8的日期類
java8提供了更為簡介的,更明了的常用日期類
//今年System.out.println("今年"+Year.now());//6月System.out.println("月份:"+Month.FEBRUARY);//今天不包含時分秒LocalDate today = LocalDate.now();System.out.println("今天:"+today);//此時此刻LocalDateTime now = LocalDateTime.now();System.out.println("現在:"+now);//您的生日LocalDate yourBirthDate = LocalDate.of(1999, Month.JUNE, 15);System.out.println("生日:"+yourBirthDate);//您的學習時間LocalDateTime dateTime = LocalDateTime.of(2020, 2, 25, 12, 30,40);System.out.println("時間:"+dateTime);(2) jdk8的格式化類
//日期轉換器DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");//格式化日期字符串LocalDateTime now = LocalDateTime.now();String nowStr = now.format(formatter); //放入格式器System.out.println(nowStr);String dateStr= "2020-02-25 11:23:04";//轉成日期 LocalDateTime date= LocalDateTime.parse(dateStr, formatter);//放入格式器//獲取日System.out.println(date.getDayOfMonth());(3) jdk8的間隔類
java8提供了方便計算的間隔相關的類 ,這部分了解即可。
LocalDate today = LocalDate.now();LocalDate birthDate = LocalDate.of(1999, 3, 15);//時期間隔 年月日Period p = Period.between(birthDate, today);System.out.printf(p.getYears()+"年"+p.getMonths()+"d"+p.getDays()+"日");LocalDate startDate = LocalDate.of(1993, 8, 19);LocalDate endDate = LocalDate.of(1994, Month.JANUARY,16);//期量單位 間隔long between =ChronoUnit.YEARS.between(startDate, endDate); System.out.println("兩年之間的差 : " + between); //0 不是1不滿一年不計算在內between =ChronoUnit.MONTHS.between(startDate, endDate); System.out.println("兩月之間的差 : " + between); //4 不是5不滿一月不計算在內 //瞬間 Instant inst1 = Instant.now();Instant inst2 = inst1.minus(Duration.ofSeconds(10));System.out.println("毫秒相隔 : " + Duration.between(inst1, inst2).toMillis());System.out.println("秒相隔 : " + Duration.between(inst1, inst2).getSeconds());4. Math類
? java.lang.Math 提供了一系列靜態方法用于科學計算;其方法的參數和返回值類型一般為 double 型。
5.File類
File 代表文件和目錄路徑名的抽象表示形式
File 類的常見構造方法:public File(String pathname)
? 以 pathname 為路徑創建 File 對象,如果 pathname 是相對路徑,則默認的當前路徑在系 統屬性 user.dir 中存儲。 File 的靜態屬性 separator 存儲了當前系統的路徑分隔符。
常見的方法
通過 File 對象創建空文件或目錄(在該對象所指的文件或目錄不存在的情況下)。
總結
以上是生活随笔為你收集整理的2异常处理_异常是什么?什么是常用类?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: asp点击按钮sql列求和_SQL 结构
- 下一篇: 1964年诞生的第一代电子计算机,世界第