異常
異常:代碼出現的編譯或者運行時的錯誤
異常包含了錯誤的類型、原因以及位置
異常的分類:
- 運行時異常–RuntimeException,在編譯時期可以選擇處理或者不處理
- 編譯時異常–在編譯時期必須處理的異常,是Exception的子類並且是非RuntimeException的子類
異常的體系結構
Throwable
- Error:出現的不可以處理的嚴重的問題
- Exception:可以處理的問題
package com.it01;
import java.io.FileWriter;
import java.io.IOException;
/*
* 異常的處理方式:
* 1-捕獲異常
* try...catch
* try{
* 有可能出現問題的代碼;
* }catch(Exception ep){
* 處理異常;
* }
* 2-拋出去
* 不想處理異常或者沒有能力處理異常的時候,我們可以選擇拋出異常,誰調用方法誰處理異常
* 使用關鍵字throws在方法的聲明拋出異常
* try...catch 執行順序:try語句-------如果發現異常--------異常下面的代碼不再執行---------catch語句
* try語句-------如沒有發現異常-----------------catch語句不再執行
* jvm處理異常的方式:
* 返回異常信息,並且終止程序
*/
public class ExceptionDemo {
public static void main(String[] args) throws IOException {
function();
method();
}
public static void method() throws IOException {
//編譯時期的異常
FileWriter fw = new FileWriter("a.txt");
}
private static void function() {
try {
System.out.println(2/0);
} catch (ArithmeticException e) {
// TODO: handle exception
System.out.println("分母不能爲零");
}
}
}
如何處理異常
package com.it01;
/*
* 處理多個異常:
* 可以使用多個try---catch語句
* 使用一個try和多個catch語句
* 多個catch之間的順序:
* 多個catch之間可以有子父類
* 平級之間沒有順序關係
* 如果有子父類,父類異常一定要放在後面
*/
public class ExceptionDemo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//method();
try {
//空指針異常
String s = null;
System.out.println(s.length());
int[] arr = new int[5];
System.out.println(arr[8]);
} catch (NullPointerException e) {
// TODO: handle exception
System.out.println("空指針異常");
}catch (ArrayIndexOutOfBoundsException e) {
System.out.println("數組越界");
}
}
private static void method() {
try {
//空指針異常
String s = null;
System.out.println(s.length());
} catch (NullPointerException e) {
// TODO: handle exception
System.out.println("空指針異常");
}
try {
//數組越界
int[] arr = new int[5];
System.out.println(arr[8]);
} catch (ArrayIndexOutOfBoundsException e) {
// TODO: handle exception
System.out.println("數組越界");
}
}
}
Throwable的常用方法
- String toString()
- String getMessage()
- void printStackTrace()
package com.it02;
/*
* Throwable的常用方法
* String toString()
* String getMessage()
* void printStackTrace()
*/
public class ExceptionDemo4 {
public static void main(String[] args) {
try {
System.out.println(2/0);
} catch (ArithmeticException e) {
// TODO: handle exception
e.toString();//錯誤類型和原因
e.getMessage();//錯誤原因
e.printStackTrace();//返回類型原因和位置
//System.out.println("錯誤");
}
}
}
finally
package com.it02;
import java.io.FileWriter;
import java.io.IOException;
/*
* finally:組合try--catch語句用於釋放資源等收尾工作,finally代碼一定會執行
*
* try{
*
* }
* catch(){
*
* }finally{
*
* }
*
*/
public class ExceptionDemo5 {
public static void main(String[] args) {
method();
FileWriter fw= null;
try {
fw = new FileWriter("a.txt");
fw.write("hello");
fw.write("world");
fw.write("java");
System.out.println(2/0);
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//釋放資源
try {
if (fw!=null) {
fw.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private static void method() {
try {
System.out.println(2/0);
} catch (Exception e) {
// TODO Auto-generated catch block
//e.printStackTrace();
System.out.println("分母不爲0");
}finally {
System.out.println("收尾");
}
}
}
throws和throw
- throws:處理異常的一種方式,把異常拋出,調用者處理
- throw:製造異常的方式,並且結束方法
注意:如果拋出throw的異常時編譯時期的異常,必須在方法聲明處拋出throws
package com.it03;
import javax.management.RuntimeErrorException;
/*
* throws:處理異常的一種方式,把異常拋出,調用者處理
* throw:製造異常的方式,並且結束方法
*
* 注意:如果拋出throw的異常時編譯時期的異常,必須在方法聲明處拋出throws
*/
public class ExceptionDemo6 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//boolean flag = checkScore(100);
//System.out.println(flag);
checkScore(110);
}
/*
*
public static boolean checkScore(int score) {
//判斷成績是否符合要求
if (score<0||score>100) {
return false;
}
return true;
}
*/
public static void checkScore(int score) throws Exception {
//判斷成績是狗符合要求
if (score<0||score>100) {
//throw new RuntimeErrorException(null);
//throw new RuntimeErrorException(null,"考試成績不符合要求");
//throw new Exception("考試成績不符合要求");
throw new MyException("考試成績不符合要求");
}
System.out.println("考試成績符合要求");
}
}
自定義異常
package com.it03;
/*
* 如何書寫自定義異常
* 寫一個類去繼承Exception或者RuntimeException,然後實現多個構造
*/
public class MyException extends RuntimeException{
public MyException() {
super();
// TODO Auto-generated constructor stub
}
public MyException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
}