java todo error_java基础-异常
女神鎮樓
1、概述
異常是一個在程序執行期間發生的事件,他中斷了正在執行的程序的正常指令流。如空指針、數組溢出等。在java中,異常也作為類的實例的形式出現。當某一個方法中發生錯誤時,這個方法會創建一個對象,并且把他傳遞給正在運行的系統。這個對象就是異常對象。通過異常處理機制,可以將非正常情況下的處理代碼和程序的主邏輯分離,即在編寫代碼主流程的同時在其他地方處理異常。
代碼示例:
public classExceptionFirstExpression {public static voidmain(String[] args) {//>> TODO try 語句中如果發生了異常(Exception),那么程序會跳轉到catch語句。//>> TODO Java會將異常相關信息封裝在一個異常類的實例中,ex是指向這個異常實例的引用//>> TODO "處理"最簡單的方法,就是調用printStackTrace將異常信息輸出到控制臺//>> TODO catch語句執行完畢,程序會繼續向下順序執行
try{int[] arr = new int[1];
arr[1] = 9;
}catch(Exception ex) {int abc = 999;
ex.printStackTrace();
}try{
String str= "";
str.substring(9, 10);
}catch(Exception ex) {
ex.printStackTrace();
}
System.out.println("程序執行結束");
}
}
2、異常捕捉
為了保證程序有效的運行,需要對程序發生的異常進行相應的處理。如果某個方法拋出異常,即可以在當前方法中進行捕捉,然后進行處理,也可以將異常向上拋出,由方法調用者進行處理。java中異常捕獲結構是try、catch、finally三部分組成,其中try語句塊存放的是可能發生異常的java語句,catch程序塊在try語句塊之后,用來激發被捕獲的異常,finally是異常處理結構最后的執行部分,無論try語句塊如何退出,都會執行finally語句塊。
語法如下:
try{//程序代碼塊
}catch(Exceptiontype1 e){//對Exceptiontype1的處理
}catch(Exceptiontype2 e){//對Exceptiontype2的處理
}
...finally{//程序塊
}
1)try-catch語句塊
代碼示例:
public classTake {public static voidmain(String[] args) {try{ //try語句中包含可能出現異常的程序代碼
String str = "lili";
System.out.println(str+ "的年齡是:");int age = Integer.parseInt("22L");//數據類型轉換
System.out.println(age);
}catch (Exception e){//catch語句塊用來獲取異常信息
e.printStackTrace(); //輸出異常性質
}
System.out.println("程序結束");
}
}
實例分析:
程序最后還是輸出里“程序結束”的提示信息,沒有因為異常終止。可能出現異常的代碼,使用try-catch處理,當try代碼塊中的語句出現異常時,程序就會跳轉到catch代碼塊中執行,執行完之后,會繼續執行后面的代碼,而不會執行try中發生異常的語句后面的代碼。使得程序不會因為異常而影響整個程序的執行。
public classCallerExceptionAppMain {public static void main(String[] args) throwsMyException {//>> TODO catch 語句是根據異常類型匹配來捕捉相應類型的異常的。//>> TODO 如果類型不匹配,catch語句是不會執行的,異常會繼續拋出//>> TODO 也就是說,catch (Throwable )會捕捉到所有的異常,包括Error,建議最多只捕捉Exception//>> TODO 如果catch一個其實并沒有被拋出的checked exception,Java程序會報錯,因為Java明確的知道這個類型的異常不會發生//>> TODO 如果catch一個unchecked exception,Java程序不會報錯//>> TODO 如果throws一個其實并沒有被拋出的checked exception或者unchecked exception,Java程序不會報錯
Caller1 caller1 = newCaller1();
System.out.println("調用開始");
caller1.call2Exception();
System.out.println("調用結束");
}
}
2)finally語句塊
完整的異常處理語句一定包含finally語句塊,無論程序中有無異常發生,并且之間的try-catch無論是否順利執行完畢,都會執行finally語句。
public classTryCatchFinallyAppMain {private static int VAL = 0;public static voidmain(String[] args) {
System.out.println(withFinally());
System.out.println(VAL);
}private static intwithFinally() {int len = 0;try{
String s= null;//String s = "abc";
returns.length();
}catch(Exception ex) {//>> TODO 異常的處理:在有返回值的情況下,返回一個特殊的值,代表情況不對,有異常
len = -1;
System.out.println("執行catch里的return語句");returnlen;
}finally{//>> TODO 可以認為finally語句會在方法返回后,后面的方法開始前,會在return語句后//>> TODO 無論是因為return結束還是因為異常結束,finally語句都會執行
System.out.println("執行finally語句");//>> TODO finally里最好不要有return語句//return -2;//>> TODO finally里給return用的變量值賦值沒用//len = -2;
VAL= 999;
System.out.println("finally語句執行完畢");
}
}
}
3、java中常見的異常
4、自定義異常
用戶只需繼承Exception類即可自定義異常類。
自定義異常類的步驟:
1)創建自定義異常類。
2)在方法中通過throw關鍵字拋出異常對象。
3)如果在當前拋出異常的方法中處理異常,可以使用try-catch關鍵字捕獲并處理,否則就在方法的聲明處通過throws指名要拋出的異常,讓方法的調用者處理。
4)在出現異常方法的調用者中捕獲并處理。
代碼示例:
public classTran {//定義方法,拋出異常
static int avg(int number1,int number2) throwsMyException{if(number1 < 0 || number2<0){throw new MyException("不可使用負數");
}if(number1 > 100 || number2 > 100){throw new MyException("數值太大了");
}return (number1 + number2) /2;
}public static voidmain(String[] args) {try{int result = avg(102,105);
}catch(MyException e){
System.out.println(e);
}
}private static class MyException extendsException{publicMyException(String ErrorMessaage){super(ErrorMessaage);
}
}
}
5、在方法中拋出異常
1)使用throws關鍵字拋出異常
throws關鍵字通常被用在聲明方法時,用來指定方法可能拋出的異常,多個異常可以使用“,”分割。
代碼示例:
public classShoot {static void pop() throwsNegativeArraySizeException{//定義方法并拋出NegativeArraySizeException異常
int[] arr = new int[-3];
}public static voidmain(String[] args) {try{
pop();
}catch(NegativeArraySizeException e){
System.out.println("pop()方法拋出了異常");
}
}
}
使用throws拋出異常給上級時,如果不想處理,可以繼續向上拋出,但最終要有處理該異常的代碼。
2)使用throw關鍵字拋出異常
throw關鍵字通常用在方法體中,并拋出一個異常對象。程序在執行到throw時終止,他后面的語句都不執行。通過throw拋出異常后,如果想在上一級代碼中捕獲并處理異常,需要在拋出異常的方法中使用throws關鍵字在方法聲明時指明要拋出的異常。如果要捕獲throw拋出的異常,必須使用try-catch代碼塊。
代碼示例:
public class MyException extendsThrowable {
String message;publicMyException(String ErrorMessage){
message=ErrorMessage;
}publicString getMessage(){returnmessage;
}
}
public classCaptor {static int quotint(int x,int y) throwsMyException{if(y<0){
System.out.println("除數不能是負數");
}return x/y;
}public static voidmain(String[] args) {try{int result = quotint(3,-2);
}catch(MyException e){
System.out.println(e.getMessage());
}catch(ArithmeticException e){
System.out.println("除數不能為0");
}catch(Exception e){
System.out.println("程序發生了其他的異常");
}
}
}
實例分析:
實例中使用了多個catch語句來捕獲異常,如果將catch(Exception e)?代碼塊放在了最前面,將永遠也調用不到他后面的代碼塊,所以catch語句的順序不可調換。
6、運行時異常
RuntimeException異常時程序運行過程中產生的異常,java類庫中每個包都定義了異常類,所有這些類都是Throwable類的子類。Throwable類派生了兩個子類,分別是Exception類和Error類,Error類及其子類用來描述java運行系統中的內部錯誤,以及資源耗盡的錯誤,這類錯誤問題比較嚴重。Exception類稱為非致命性類,可以通過捕獲處理使程序繼續執行。Exception類又根據錯誤發生的原因,分為RuntimeException異常和除RuntimeException之外的異常。
7、異常的使用原則
java強制用戶去考慮程序的強健性和安全性,異常處理不應用來控制程序的正常流程,他的主要作用是捕獲程序運行時發生的錯誤,并進行相應的處理,遵循以下原則:
1)在當前方法聲明中使用try-catch方法捕獲異常
2)當一個方法被覆蓋時,覆蓋他的方法必須拋出相同的異常或者異常子類
3)如果父類拋出多個異常,則覆蓋方法必須拋出那些異常的一個子集,不能拋出新異常。
public classCallerRtExceptionAppMain {public static voidmain(String[] args) {
Caller1 caller1= newCaller1();
System.out.println("調用開始");try{
caller1.call2RTException();
}catch(MyRuntimeException ex) {//>> TODO 錯誤的演示!不應該使用異常做正常處理邏輯下的跳轉
System.out.println("凌波微步收到!");
}
System.out.println("調用結束");
}
}
8、接口中的異常
public class ImplIntfWithEx implementsIntfWithEx {
@Overridepublic void danger() throwsException {//>> TODO 接口中聲明了拋出異常,實現類中可以拋,也可以不拋。拋的話必須是接口聲明的類或其子類
throw new Exception("");
}
@Overridepublic voidsafe() {//>> TODO 接口中沒有聲明拋出異常,實現類中可以拋RuntimeException,也可以不拋。//>> TODO 如果拋 checked exception,就會出錯//>> TODO 可以選擇catch住 checked exception,然后將它封在RuntimeException里//throw new Exception();//throw new RuntimeException();
}
}
總結
以上是生活随笔為你收集整理的java todo error_java基础-异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hardfault常见原因_XMC实验分
- 下一篇: java数据库驱动_Java数据库驱动链