亚洲区国产区激情区无码区,国产成人mv视频在线观看,国产A毛片AAAAAA,亚洲精品国产首次亮相在线

Java 菜鳥(niǎo)教程

Java 流程控制

Java 數(shù)組

Java 面向?qū)ο?I)

Java 面向?qū)ο?II)

Java 面向?qū)ο?III)

Java 異常處理

Java 列表(List)

Java Queue(隊(duì)列)

Java Map集合

Java Set集合

Java 輸入輸出(I/O)

Java Reader/Writer

Java 其他主題

Java throw和throws 關(guān)鍵字

在本教程中,我們將在示例的幫助下學(xué)習(xí)使用throw和throws關(guān)鍵字進(jìn)行異常處理。

在Java中,異??梢苑譃閮煞N類(lèi)型:

  • 未檢查的異常:它們不是在編譯時(shí)而是在運(yùn)行時(shí)被檢查,例如:ArithmeticException,NullPointerException,ArrayIndexOutOfBoundsException,Error類(lèi)下的異常等。

  • 檢查的異常:在編譯時(shí)檢查它們。例如IOException,InterruptedException等。

請(qǐng)參考Java異常以詳細(xì)了解已檢查和未檢查的異常。

通常,我們不需要處理未經(jīng)檢查的異常。這是因?yàn)橛捎诰幊体e(cuò)誤而發(fā)生了未經(jīng)檢查的異常。并且,糾正它們而不是處理它們是一個(gè)好習(xí)慣。

現(xiàn)在,本教程將重點(diǎn)介紹如何使用throw和throws處理已檢查的異常。

Java throws 關(guān)鍵字

我們?cè)诜椒暶髦惺褂胻hrows關(guān)鍵字來(lái)聲明其中可能發(fā)生的異常的類(lèi)型。

其語(yǔ)法為:

accessModifier returnType methodName() throws ExceptionType1, ExceptionType2 … {
  // code
}

從上面的語(yǔ)法可以看到,我們可以用throws來(lái)聲明多個(gè)異常。

示例1:Java throws 關(guān)鍵字

import java.io.*;
class Main {
  public static void findFile() throws IOException {
    //可能產(chǎn)生IOException的代碼
    File newFile=new File("test.txt");
    FileInputStream stream=new FileInputStream(newFile);
  }

  public static void main(String[] args) {
    try{
      findFile();
    } catch(IOException e){
      System.out.println(e);
    }
  }
}

輸出結(jié)果

java.io.FileNotFoundException: test.txt (No such file or directory)

當(dāng)我們運(yùn)行這個(gè)程序時(shí),如果文件test.txt不存在,F(xiàn)ileInputStream將拋出一個(gè)繼承IOException類(lèi)的FileNotFoundException異常。

如果方法不處理異常,則必須在throws子句中指定該方法中可能發(fā)生的異常類(lèi)型,以便調(diào)用堆棧中更高層的方法可以處理它們或使用throws關(guān)鍵字本身指定它們。

findFile()方法指定可以拋出IOException。  main()方法調(diào)用此方法并處理拋出的異常。

引發(fā)多個(gè)異常

這是我們?nèi)绾问褂胻hrows關(guān)鍵字引發(fā)多個(gè)異常的方法。

import java.io.*;
class Main {
  public static void findFile() throws NullPointerException, IOException, InvalidClassException {
    
    // 可能產(chǎn)生NullPointerException的代碼
    … … … 

    // 可能產(chǎn)生IOException的代碼
    … … … 

    // 可能產(chǎn)生InvalidClassException的代碼 
    … … … 
  }

  public static void main(String[] args) {
    try{
      findFile();
    } catch(IOException e1){
      System.out.println(e1.getMessage());
    } catch(InvalidClassException e2){
      System.out.println(e2.getMessage());
    }
  }
}

這里,findFile()方法指定它可以在其throws子句中拋出NullPointerException、IOException和InvalidClassException。

請(qǐng)注意,我們尚未處理NullPointerException。這是因?yàn)樗俏唇?jīng)檢查的異常。不必在throws子句中指定它并進(jìn)行處理。

throws 關(guān)鍵字 與. try...catch...finally

可能有幾個(gè)方法會(huì)導(dǎo)致異常。為每種方法編寫(xiě)try...catch將是乏味的,并且代碼將變得冗長(zhǎng)且難以理解。

當(dāng)您已檢查了不希望在當(dāng)前方法中捕獲的異常(必須處理的異常)時(shí),throws也很有用。

Java throw關(guān)鍵字

throw關(guān)鍵字用于顯式地拋出一個(gè)異常。

當(dāng)引發(fā)異常時(shí),程序執(zhí)行的流程從try塊轉(zhuǎn)移到catch塊。我們?cè)诜椒ㄖ惺褂胻hrow關(guān)鍵字。

其語(yǔ)法為:

throw throwableObject;

Throwable對(duì)象是Throwable類(lèi)或Throwable類(lèi)的子類(lèi)的實(shí)例。

示例2:Java throw關(guān)鍵字

class Main {
  public static void divideByZero() {
    throw new ArithmeticException("試圖除以0");
  }

  public static void main(String[] args) {
    divideByZero();
  }
}

輸出結(jié)果

Exception in thread "main" java.lang.ArithmeticException: 試圖除以0
    at Main.divideByZero(Main.java:3)
    at Main.main(Main.java:7)
exit status 1

在此示例中,我們明確拋出 ArithmeticException.

注意: ArithmeticException是未經(jīng)檢查的異常。通常沒(méi)有必要處理未經(jīng)檢查的異常。

示例3:拋出檢查異常

import java.io.*;
class Main {
  public static void findFile() throws IOException {
    throw new IOException("文件未找到");
  }

  public static void main(String[] args) {
    try {
      findFile();
      System.out.println("try塊中的其余代碼");
    } catch (IOException e) {
      System.out.println(e.getMessage());
    }
  }
}

輸出結(jié)果

文件未找到

findFile()方法使用傳遞給其構(gòu)造函數(shù)的消息拋出一個(gè)IOException。

注意,由于它是一個(gè)檢查的異常,因此必須在throws子句中指定它。

調(diào)用findFile()方法的方法需要處理此異常,或者自己使用throws關(guān)鍵字指定它。

我們已經(jīng)在main()方法中處理了此異常。引發(fā)異常時(shí),程序執(zhí)行的流程在try塊之間轉(zhuǎn)移到catch。因此,將跳過(guò)該try塊中的其余代碼,并執(zhí)行該catch塊中的語(yǔ)句。