欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

全面了解java異常

 更新時(shí)間:2021年08月31日 17:19:48   作者:高小小天  
本文非常詳細(xì)的介紹了java異常,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們可以學(xué)習(xí)一下這篇文章

異常的概念

異常,在程序中的意思是:程序在執(zhí)行過(guò)程中,出現(xiàn)的非正常的情況,最終會(huì)導(dǎo)致JVM的非正常停止。

Java的異常機(jī)制主要依賴于try、catch、finally、throw和throws五個(gè)關(guān)鍵字
其中try關(guān)鍵字后面緊跟著一個(gè)花括號(hào)括起來(lái)的代碼塊,它里面放置可能會(huì)引發(fā)異常的代碼塊。catch后面對(duì)應(yīng)異常類型和一個(gè)代碼塊,用于表明該catch塊用于處理這種異常類型的代碼塊,多個(gè)catch塊后面還可以跟一個(gè)finally塊,用于回收在try塊里打開(kāi)的物理資源,異常機(jī)制會(huì)保證finally塊一定被執(zhí)行。
throws關(guān)鍵字主要在方法簽名中使用,用于聲明該方法可能拋出的異常;
而throw用于拋出一個(gè)實(shí)際的異常,throw可以單獨(dú)作為語(yǔ)句使用,拋出一個(gè)具體的異常對(duì)象。

在Java等面向?qū)ο蟮木幊陶Z(yǔ)言中,異常本身是一個(gè)類,產(chǎn)生異常就是創(chuàng)建并拋出了一個(gè)異常對(duì)象。Java處理異常的方式是中斷處理。異常指的并不是語(yǔ)法錯(cuò)誤,語(yǔ)法錯(cuò)了編譯不能通過(guò),不會(huì)產(chǎn)生字節(jié)碼文件,根本不能運(yùn)行。

異常體系

Error:嚴(yán)重錯(cuò)誤Error,無(wú)法通過(guò)處理的錯(cuò)誤,只能事先避免,比如內(nèi)存溢出。
Exception:表示異常,異常產(chǎn)生后程序員可以通過(guò)代碼的方式糾正,使程序繼續(xù)運(yùn)行,是必須要處理的

異常的分類

我們平常說(shuō)的異常就是指Exception,因?yàn)檫@類異常一旦出現(xiàn),我們就要對(duì)代碼進(jìn)行更正,修復(fù)程序。
異常(Exception)的分類:根據(jù)在編譯時(shí)期還是運(yùn)行時(shí)期去檢查異常。
編譯時(shí)期異常:checked異常。在編譯時(shí)期就會(huì)檢查,如果沒(méi)有處理異常,則編譯失敗。(如日期格式化異常)運(yùn)行時(shí)期異常:
runtime異常。在運(yùn)行時(shí)期,檢查異常。在編譯時(shí)期,運(yùn)行期異常不會(huì)被編譯器檢測(cè)(不報(bào)錯(cuò))。(如數(shù)學(xué)異常)

異常產(chǎn)生的過(guò)程分析

1.JVM(java virtual machine)會(huì)檢測(cè)出程序出現(xiàn)的異常,JVM會(huì)做兩件事情。

1).JVM會(huì)根據(jù)異常產(chǎn)生的原因創(chuàng)建一個(gè)異常對(duì)象,這個(gè)異常對(duì)象包含了異常產(chǎn)生的(內(nèi)容,原因,位置)。
2).在方法中,沒(méi)有異常處理的邏輯(try-catch),那么JVM就會(huì)把異常對(duì)象拋出給方法的調(diào)用者main方法來(lái)處理這個(gè)異常.

2.MAIN方法接受到這個(gè)異常對(duì)象,MAIN方法也沒(méi)有異常的處理邏輯,繼續(xù)把對(duì)象拋出給MAIN方法的調(diào)用者JVM處理(MAIN方法把異常對(duì)象拋出給JVM)
3.JVM接受到這個(gè)異常對(duì)象,做了兩件事情。

1).把異常對(duì)象(內(nèi)容,原因,位置)以紅色的字體打印在控制臺(tái)
2).JVM會(huì)終止當(dāng)前正在執(zhí)行的java程序 à中斷處理

異常的處理

Java異常處理的五個(gè)關(guān)鍵字:try、catch、finally、throw、throws。

拋出異常throw

在編寫程序時(shí),我們必須要考慮程序出現(xiàn)問(wèn)題的情況。比如,在定義方法時(shí),方法需要接受參數(shù)。那么,當(dāng)調(diào)用方法使用接受到的參數(shù)時(shí),首先需要先對(duì)參數(shù)數(shù)據(jù)進(jìn)行合法的判斷,數(shù)據(jù)若不合法,就應(yīng)該告訴調(diào)用者,傳遞合法的數(shù)據(jù)進(jìn)來(lái)。這時(shí)需要使用拋出異常的方式來(lái)告訴調(diào)用者。

在java中,提供了一個(gè)throw關(guān)鍵字,它用來(lái)拋出一個(gè)指定的異常對(duì)象。那么,拋出一個(gè)異常具體如何操作呢?
1.創(chuàng)建一個(gè)異常對(duì)象。封裝一些提示信息(信息可以自己編寫)。
2.需要將這個(gè)異常對(duì)象告知給調(diào)用者。怎么告知呢?怎么將這個(gè)異常對(duì)象傳遞到調(diào)用者處呢?通過(guò)關(guān)鍵字throw就可以完成。

throw用在方法內(nèi),用來(lái)拋出一個(gè)異常對(duì)象,將這個(gè)異常對(duì)象傳遞到調(diào)用者處,并結(jié)束當(dāng)前方法的執(zhí)行。

格式

throw new 異常類名(參數(shù));

//例:
public class ThrowDemo{
    public static void main(String[]args){
        //創(chuàng)建一個(gè)數(shù)組
        int[]arr={9,5,2,7};
        //根據(jù)索引找對(duì)應(yīng)元素
        int index = 4; 
        int element = getElement(arr,index); 
  		System.out.println(element);
        System.out.println("over!");
    }
    public static int getElement(int arr[],int index){
        //判斷索引是否越界
        if(index<0||index>arr.length-1){
            /*
            *判斷條件如果滿足,當(dāng)執(zhí)行完throw拋出異常對(duì)象后,方法已經(jīng)無(wú)法繼續(xù)運(yùn)算.
            *這時(shí)就會(huì)結(jié)束當(dāng)前方法的執(zhí)行,并將異常告知給調(diào)用者,這時(shí)就需要通過(guò)異常來(lái)解決.
            */
            throw new ArrayIndexOutOfBoundsException("哥們,角標(biāo)越界了!!!"); 
        }
        int element=arr[index];
        return element;
    }
}

注意:如果產(chǎn)生了問(wèn)題,我們就會(huì)throw將問(wèn)題描述類即異常進(jìn)行拋出,也就是將問(wèn)題返回給該方法的調(diào)用者。
那么對(duì)于調(diào)用者來(lái)說(shuō),該怎么處理呢?一種是進(jìn)行捕獲處理,另一種就是繼續(xù)講問(wèn)題聲明出去,使用throws聲明處理。

聲明異常throws

聲明異常:將問(wèn)題標(biāo)識(shí)出來(lái),報(bào)告給調(diào)用者。如果方法內(nèi)通過(guò)throw拋出了編譯時(shí)異常,而沒(méi)有捕獲處理(稍后講解該方式),那么必須通過(guò)throws進(jìn)行聲明,讓調(diào)用者去處理。
關(guān)鍵字throws運(yùn)用于方法聲明之上,用于表示當(dāng)前方法不處理異常,而是提醒該方法的調(diào)用者來(lái)處理異常(拋出異常)

聲明異常格式:

修飾符 返回值類型 方法名 (參數(shù)列表) throws 異常類名1,異常類名2... {  } 

//示例代碼
public class ThrowsDemo{
    public static void main(String[]args) throws FileNotFoundException {
        read("a.txt");
    }
    //定義功能時(shí)有問(wèn)題發(fā)生需要報(bào)告給調(diào)用者.可以通過(guò)在方法上使用throws關(guān)鍵字進(jìn)行聲明
  public static void read(String path) throws FileNotFoundException{
      if(!path.equals("a.txt")){
          //如果不是a.txt就認(rèn)為文件不存在是一個(gè)異常拋出問(wèn)題!
          throw new FileNotFoundException("文件不存在");
      }
  }
}

throws用于進(jìn)行異常類的聲明,若該方法可能有多種異常情況產(chǎn)生,那么在throws后面可以寫多個(gè)異常類,用逗號(hào)隔開(kāi)。

public class ThrowsDemo2 {
    public static void main(String[]args) throwsIOException {
        read("a.txt");
    }
    //定義功能時(shí)有問(wèn)題發(fā)生需要報(bào)告給調(diào)用者.可以通過(guò)在方法上使用throws關(guān)鍵字進(jìn)行聲明
  public static void read(String path) throws FileNotFoundException , IOException {
      if(!path.equals("a.txt")) {
          //如果不是a.txt就認(rèn)為文件不存在是一個(gè)異常拋出問(wèn)題!
          throw new FileNotFoundException("文件不存在");
      }
      if(!path.equals("b.txt")){
          throw new IOException();
      }
  }
}

捕獲異常try…catch

如果異常出現(xiàn)的話,會(huì)立刻終止程序,所以我們得處理異常:
1.該方法不處理,而是聲明拋出,由該方法的調(diào)用者來(lái)處理(throws)。
2.在方法中使用try-catch的語(yǔ)句塊來(lái)處理異常。
try-catch的方式就是捕獲異常。
捕獲異常:Java中對(duì)異常有針對(duì)性的語(yǔ)句進(jìn)行捕獲,可以對(duì)出現(xiàn)的異常進(jìn)行指定方式的處理。

捕獲異常語(yǔ)法

try {
    編寫可能會(huì)出現(xiàn)異常的代碼
}catch(異常類型 e){
    處理異常的代碼
        //記錄日志/打印異常信息/繼續(xù)拋出異常
}

try:該代碼塊中編寫可能產(chǎn)生異常的代碼。
catch:用來(lái)進(jìn)行某種異常的捕獲,實(shí)現(xiàn)對(duì)捕獲到的異常進(jìn)行處理。
注意:

try和catch都不能單獨(dú)使用,必須連用。

try里面還可以有try…catch

示例代碼:

public class TryCatchDemo {
    public static void main (String[]args) {
        try {//當(dāng)產(chǎn)生異常時(shí),必須有處理方式,要么捕獲要么聲明
            read("a.txt");
        }catch(FileNotFoundException e){//try中拋出什么異常,括號(hào)中就定義什么類型
     	 System.out.println(e);
        }
     System.out.println("OVER!");
    }
    //定義功能時(shí)有問(wèn)題發(fā)生需要報(bào)告給調(diào)用者.可以通過(guò)在方法上使用throws關(guān)鍵字進(jìn)行聲明
  public static void read (String path) throws FileNotFoundException {
      if(!path.equals("a.txt")){
          //如果不是a.txt就認(rèn)為文件不存在是一個(gè)異常拋出問(wèn)題!
          throw new FileNotFoundException("文件不存在");
      }
  }
}

如何獲取異常信息:

Throwable類中定義了一些查看方法:
public String getMessage():獲取異常的描述信息,原因(提示給用戶的時(shí)候,就提示錯(cuò)誤原因。

public String toString():獲取異常的類型和異常描述信息(不用)。

public void printStackTrace():打印異常的跟蹤棧信息并輸出到控制臺(tái)。包含了異常的類型,異常的原因,還包括異常出現(xiàn)的位置,在開(kāi)發(fā)和調(diào)試階段,都得使用printStackTrace。

示例代碼:

public static void main(String[]args){
    try {
        String str=null;
        System.out.println(str.length());
    }catch(Exceptione){
        e.printStackTrace();//打印異常的堆棧追蹤信息
    }
    System.out.println("OVER!");
}

//運(yùn)行結(jié)果:
java.lang.NullPointerException
    at com.langsin.exception.ExceptionDemo.main(ExceptionDemo.java:7)
    OVER!

finally代碼塊

finally:有一些特定的代碼無(wú)論異常是否發(fā)生,都需要執(zhí)行。另外,因?yàn)楫惓?huì)引發(fā)程序跳轉(zhuǎn),導(dǎo)致有些語(yǔ)句執(zhí)行不到。而finally就是解決這個(gè)問(wèn)題的,在finally代碼塊中存放的代碼都是一定會(huì)被執(zhí)行的。

什么時(shí)候的代碼必須最終執(zhí)行?

當(dāng)我們?cè)趖ry語(yǔ)句塊中打開(kāi)了一些物理資源(磁盤文件/網(wǎng)絡(luò)連接/數(shù)據(jù)庫(kù)連接等),我們都得在使用完之后,最終關(guān)閉打開(kāi)的資源。

注意:finally不能單獨(dú)使用。

比如在我們之后學(xué)習(xí)的IO流中,當(dāng)打開(kāi)了一個(gè)關(guān)聯(lián)文件的資源,最后程序不管結(jié)果如何,都需要把這個(gè)資源關(guān)閉掉。

try catch 語(yǔ)句中有return 的各類情況

首先給出一道題目:

下面代碼的運(yùn)行結(jié)果為?

public class test {
	public int add(int a,int b) {
		try {
			return a+b;
		}catch(Exception e){
			System.out.println("catch語(yǔ)句塊");
		}finally {
			System.out.println("finally語(yǔ)句塊");
		}
		return 0;
	}
	public static void main(String[] args) {
		test t=new test();
		System.out.println("和是"+t.add(9, 34));
	}
 
}

A、catch語(yǔ)句塊 和是43

B、編譯異常

C、finally語(yǔ)句塊 和是43

D、和是43 finally語(yǔ)句塊

正確答案:C

由于學(xué)習(xí)過(guò)編譯原理的課程,知道了System.out.println中要執(zhí)行add()方法與前面的“和是”字符串拼接后才會(huì)輸出,因此首先執(zhí)行add()方法。

add()方法中try語(yǔ)句塊中有return語(yǔ)句,那么是否執(zhí)行完try語(yǔ)句塊就直接退出方法了呢?

上述代碼在Eclipse下運(yùn)行此代碼結(jié)果為:

看來(lái)盡管try語(yǔ)句塊中有return,還是會(huì)執(zhí)行finally語(yǔ)句塊。

看到了合理的解釋是,在try中執(zhí)行到return語(yǔ)句時(shí),不會(huì)真正的return,即只是會(huì)計(jì)算return中的表達(dá)式(本題為執(zhí)行a+b),之后將結(jié)果保存在一個(gè)臨時(shí)棧中,接著執(zhí)行finally中的語(yǔ)句,最后才會(huì)從臨時(shí)棧中取出之前的結(jié)果返回。

下面我們?cè)谶@道題的finally語(yǔ)句中加入這么一行代碼:

a=1;

public class test {
	public int add(int a,int b) {
		try {
			return a+b;
		}catch(Exception e){
			System.out.println("catch語(yǔ)句塊");
		}finally {
			System.out.println("finally語(yǔ)句塊");
			a=1;
		}
		return 0;
	}
	public static void main(String[] args) {
		test t=new test();
		System.out.println("和是"+t.add(9, 34));
	}
 
}

下面是運(yùn)行結(jié)果截圖:

從結(jié)果看出來(lái)結(jié)果并沒(méi)有發(fā)生改變,這也驗(yàn)證了finally中的語(yǔ)句不會(huì)影響到臨時(shí)棧中的值,即在執(zhí)行finally之前,臨時(shí)棧中的值已經(jīng)確定為43了,執(zhí)行finally語(yǔ)句將a的值變?yōu)?,對(duì)結(jié)果沒(méi)有產(chǎn)生影響,執(zhí)行完finally后的輸出結(jié)果仍為43.

finally塊中的內(nèi)容會(huì)先于try中的return語(yǔ)句執(zhí)行,如果finall語(yǔ)句塊中也有return語(yǔ)句的話,那么直接從finally中返回了,這也是不建議在finally中return的原因。下面來(lái)看這幾種情況。

情況一(try中有return,finally中沒(méi)有return):

public class TryTest{
	public static void main(String[] args){
		System.out.println(test());
	}
private static int test(){
	int num = 10;
	try{
		System.out.println("try");
		return num += 80;
	}catch(Exception e){
		System.out.println("error");
	}finally{
		if (num > 20){
			System.out.println("num>20 : " + num);
		}
		System.out.println("finally");
	}
	return num;
 }
}

輸出結(jié)果如下:

try
num>20 : 90
finally
90

分析:顯然“return num += 80”被拆分成了“num = num+80”和“return num”兩個(gè)語(yǔ)句,線執(zhí)行try中的“num = num+80”語(yǔ)句,將其保存起來(lái),在try中的”return num“執(zhí)行前,先將finally中的語(yǔ)句執(zhí)行完,而后再將90返回。

情況二(try和finally中均有return):

public class TryTest{
	public static void main(String[] args){
		System.out.println(test());
	}
private static int test(){
	int num = 10;
	try{
		System.out.println("try");
		return num += 80;
	}catch(Exception e){
		System.out.println("error");
	}finally{
		if (num > 20){
			System.out.println("num>20 : " + num);
		}
		System.out.println("finally");
		num = 100;
		return num;
	}
}
}

輸出結(jié)果如下:

try
num>20 : 90
finally
100

分析:try中的return語(yǔ)句同樣被拆分了,finally中的return語(yǔ)句先于try中的return語(yǔ)句執(zhí)行,因而try中的return被”覆蓋“掉了,不再執(zhí)行。

情況三(finally中改變返回值num):

public class TryTest{
	public static void main(String[] args){
		System.out.println(test());
	}
private static int test(){
	int num = 10;
	try{
		System.out.println("try");
		return num;
	}catch(Exception e){
		System.out.println("error");
	}finally{
		if (num > 20){
			System.out.println("num>20 : " + num);
		}
		System.out.println("finally");
		num = 100;
	}
	return num;
}
}

輸出結(jié)果如下:

try

finally

10

分析:雖然在finally中改變了返回值num,但因?yàn)閒inally中沒(méi)有return該num的值,因此在執(zhí)行完finally中的語(yǔ)句后,test()函數(shù)會(huì)得到try中返回的num的值,而try中的num的值依然是程序進(jìn)入finally代碼塊前保留下來(lái)的值,因此得到的返回值為10。

​但是我們來(lái)看下面的情況(將num的值包裝在Num類中):

public class TryTest{
	public static void main(String[] args){
		System.out.println(test().num);
	}
private static Num test(){
	Num number = new Num();
	try{
		System.out.println("try");
		return number;
	}catch(Exception e){
		System.out.println("error");
	}finally{
		if (number.num > 20){
			System.out.println("number.num>20 : " + number.num);
		}
		System.out.println("finally");
		number.num = 100;
	}
	return number;
}
}
class Num{
	public int num = 10;
}

輸出結(jié)果如下:

try
finally
100

從結(jié)果中可以看出,同樣是在finally中改變了返回值num的值,在情況三中,并沒(méi)有被try中的return返回(test()方法得到的不是100),但在這里卻被try中的return語(yǔ)句返回了。

對(duì)以上情況的分析,需要深入JVM虛擬機(jī)中程序執(zhí)行exection_table中的字節(jié)碼指令時(shí)操作棧的的操作情況,可以參考htp://www.dbjr.com.cn/kf/201010/76754.html)這篇文章,也可以參考《深入Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》第6章中對(duì)屬性表集合的講解部分。

對(duì)于含有return語(yǔ)句的情況,這里我們可以簡(jiǎn)單地總結(jié)如下:

       try語(yǔ)句在返回前,將其他所有的操作執(zhí)行完,保留好要返回的值,而后轉(zhuǎn)入執(zhí)行finally中的語(yǔ)句,而后分為以下三種情況:

  • 情況一:如果finally中有return語(yǔ)句,則會(huì)將try中的return語(yǔ)句”覆蓋“掉,直接執(zhí)行finally中的return語(yǔ)句,得到返回值,這樣便無(wú)法得到try之前保留好的返回值。
  • 情況二:如果finally中沒(méi)有return語(yǔ)句,也沒(méi)有改變要返回值,則執(zhí)行完finally中的語(yǔ)句后,會(huì)接著執(zhí)行try中的return語(yǔ)句,返回之前保留的值。
  • 情況三:如果finally中沒(méi)有return語(yǔ)句,但是改變了要返回的值,這里有點(diǎn)類似與引用傳遞和值傳遞的區(qū)別,分以下兩種情況,:

1)如果return的數(shù)據(jù)是基本數(shù)據(jù)類型或文本字符串,則在finally中對(duì)該基本數(shù)據(jù)的改變不起作用,try中的return語(yǔ)句依然會(huì)返回進(jìn)入finally塊之前保留的值。

2)如果return的數(shù)據(jù)是引用數(shù)據(jù)類型,而在finally中對(duì)該引用數(shù)據(jù)類型的屬性值的改變起作用,try中的return語(yǔ)句返回的就是在finally中改變后的該屬性的值。

異常注意事項(xiàng)

多個(gè)異常使用捕獲又該如何處理呢?

1.多個(gè)異常分別處理。

2.多個(gè)異常一次捕獲,多次處理。

3.多個(gè)異常一次捕獲一次處理。

一般我們是使用一次捕獲多次處理方式,格式如下:

try{
    //編寫可能出現(xiàn)異常的代碼
}catch(異常類型A e){//當(dāng)try中出現(xiàn)A類型異常,就用該catch來(lái)捕獲
    //處理異常的代碼
    //記錄日志/打印異常信息/繼續(xù)拋出異常
}catch(異常類型B e){//當(dāng)try中出現(xiàn)B類型異常,就用該catch來(lái)捕獲
    //處理異常的代碼//記錄日志/打印異常信息/繼續(xù)拋出異常
}

注意:這種異常處理方式,要求多個(gè)catch中的異常不能相同,并且若catch中的多個(gè)異常之間有子父類異常的關(guān)系,那么子類異常要求在上面的catch處理,父類異常在下面的catch處理。

運(yùn)行時(shí)異常被拋出可以不處理。即不捕獲也不聲明拋出。

如果finally有return語(yǔ)句,永遠(yuǎn)返回finally中的結(jié)果,避免該情況。

如果父類拋出了多個(gè)異常,子類重寫父類方法時(shí),拋出和父類相同的異?;蛘呤歉割惍惓5淖宇惢蛘卟粧伋霎惓?/p>

父類方法沒(méi)有拋出異常,子類重寫父類該方法時(shí)也不可拋出異常。此時(shí)子類產(chǎn)生該異常,只能捕獲處理,不能聲明拋出。

自定義異常

概述

為什么需要自定義異常類:

我們說(shuō)了Java中不同的異常類,分別表示著某一種具體的異常情況,那么在開(kāi)發(fā)中總是有些異常情況是SUN沒(méi)有定義好的,此時(shí)我們根據(jù)自己業(yè)務(wù)的異常情況來(lái)定義異常類。例如年齡負(fù)數(shù)問(wèn)題,考試成績(jī)負(fù)數(shù)問(wèn)題等等。

在上述代碼中,發(fā)現(xiàn)這些異常都是JDK內(nèi)部定義好的,但是實(shí)際開(kāi)發(fā)中也會(huì)出現(xiàn)很多異常,這些異常很可能在JDK中沒(méi)有定義過(guò),例如年齡負(fù)數(shù)問(wèn)題,考試成績(jī)負(fù)數(shù)問(wèn)題.那么能不能自己定義異常呢?

在開(kāi)發(fā)中根據(jù)自己業(yè)務(wù)的異常情況來(lái)定義異常類.比如:自定義一個(gè)業(yè)務(wù)邏輯異常:RegisterException。一個(gè)注冊(cè)異常類。

異常類如何定義:

1.自定義一個(gè)編譯期異常:自定義類并繼承于java.lang.Exception。

2.自定義一個(gè)運(yùn)行時(shí)期的異常類:自定義類并繼承于java.lang.RuntimeException。

自定義異常演示

要求:我們模擬注冊(cè)操作,如果用戶名已存在,則拋出異常并提示:親,該用戶名已經(jīng)被注冊(cè)。

首先定義一個(gè)注冊(cè)異常類RegisterException:

public class RegisterException extends Exception{
    /** 
    *空參構(gòu)造
    */
    public RegisterException (){   
    }
    /**
    *
    *@parammessage異常提示*/
    public RegisterException(String message){
        super (message);
    }
}

模擬登陸操作,使用數(shù)組模擬數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù),并提供當(dāng)前注冊(cè)賬號(hào)是否存在方法用于判斷。

public class Demo {
    private static String[]names={"lyan","zhyuqi","xdongdong"};
    public static void main(String[]args) {
        try{
            //可能出現(xiàn)異常的代碼
            checkUsername("zhyuqi");
            System.out.println("用戶名可用!");//沒(méi)有異常則用戶名沒(méi)有重復(fù),可用
        }catch(RegisterException e){
            //處理異常
            e.printStackTrace();
        }
    }
    //因?yàn)镽egisterException是編譯期異常,又想調(diào)用者去處理,所以在方法上聲明該異常
  public static boolean checkUsername(String uname) throws RegisterException{for(Stringname:names){
      if(name.equals(uname)){//如果名字在數(shù)組里面就拋出注冊(cè)異常
          throw new RegisterException("親"+uname+"已經(jīng)被注冊(cè)了!");
       }
     }
     return true;
  }
}

到此這篇關(guān)于全面了解java異常的文章就介紹到這了,更多相關(guān)java異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論