程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java異常處置實例教程

Java異常處置實例教程

編輯:關於JAVA

Java異常處置實例教程。本站提示廣大學習愛好者:(Java異常處置實例教程)文章只能為提供參考,不一定能成為您想要的結果。以下是Java異常處置實例教程正文


1、甚麼是異常?
起首,讓我們來看看下圖的例子:
在這個例子中,存在的毛病碼由除以0的成果。因為除以0而招致異常: ArithmeticException
HelloException.java

package com.yiibai.tutorial.exception;

public class HelloException {

  public static void main(String[] args) {

    System.out.println("Three");

    // This division no problem.
    int value = 10 / 2;

    System.out.println("Two");

    // This division no problem.
    value = 10 / 1;

    System.out.println("One");
    
    // This division has problem, divided by 0.
    // An error has occurred here.
    value = 10 / 0;

    // And the following code will not be executed.
    System.out.println("Let's go!");

  }

}

運轉這個例子,獲得的成果是:

可以看到掌握台屏幕上的告訴。毛病告訴是很清晰的,包含代碼行的信息。
讓我們經由過程下圖中的流程看看上面的法式:

  • 法式從(1),(2)至(5)步調正常運轉。
  • 在步調(6)法式除以0。
  • 法式跳轉出 main 辦法後,而(7)代碼行還沒有被履行。

我們將修正上述實行例的代碼。

HelloCatchException.java

package com.yiibai.tutorial.exception;

public class HelloCatchException {

  public static void main(String[] args) {

    System.out.println("Three");

    // This division no problem.
    int value = 10 / 2;

    System.out.println("Two");

    // This division no problem.
    value = 10 / 1;

    System.out.println("One");

    try {
      // This division has problem, divided by 0.
      // An error has occurred here.      
      value = 10 / 0;

      // And the following code will not be executed.
      System.out.println("Value =" + value);

    } catch (ArithmeticException e) {

      // The code in the catch block will be executed
      System.out.println("Error: " + e.getMessage());

      // The code in the catch block will be executed
      System.out.println("Ignore...");

    }

    // This code is executed
    System.out.println("Let's go!");

  }

}

運轉示例成果:

Three

Two

One

Error: / by zero

Ignore...

Let's go!

我們將按以下實例圖象的流程來說明上面的法式。

  • 步調(1)至(5)是完整正常的。
  • 異常產生在步調(6),除以0湧現了成績。
  • 它立刻跳到catch塊履行敕令,步調(7)被跳過。
  • 步調(8),(9)被履行。
  • 步調(10)被履行。

2、 異常條理構造
這是Java異常的分層圖的模子。

最高的類是:Throwable

兩個直接子類是 Error 和 Exception。

在異常轉移有一個RuntimeException子類,包含Java中的編譯時未檢討異常。檢討並撤消檢討在編譯時,鄙人一部門的實行示例中解釋。

留意:您的類應當從兩個分支:Error或Exception繼續,而不是直接從Throwable繼續。

當一個靜態鏈接掉敗,或在虛擬機的一些其他的“硬”毛病產生時,虛擬機激發這個毛病。典范的Java法式不捕捉毛病,所以Java法式都不會拋出任何毛病。年夜多半法式拋出並捕捉從Exception類派生的對象。異常指導湧現了一個成績,然則這些成績其實不是嚴重體系性成績。你寫的年夜多半法式將會拋出和捕捉異常。

Exception類在Java包界說了很多子類。這些子類指明分歧類型的能夠會產生異常。 例如,NegativeArraySizeException注解法式試圖創立一個年夜小為負的數組。

一個導演的子類在Java說話中的特別寄義: RuntimeException類表現Java虛擬機中產生(在運轉時代)的異常。運轉時異常的一個例子是NullYiibaierException異常,個中,當一種辦法試圖經由過程一個空援用來拜訪對象的成員時就會激發。 NullYiibaierException 可以在任何處所湧現某個法式試圖撤消援用一個對象的援用。常常檢討異常捕捉的利益遠遠跨越它的本錢。

因為運轉時異常是無所不在的,在試圖捕捉或指定一切的時光是白費的作法(弗成讀和弗成保護的代碼), 編譯器許可運轉時異常去未捕捉和指定。
Java包界說幾個RuntimeException類。您可以捕捉這些異常,就像其他異常。然則其實不須要一種辦法來指定它拋出運轉時異常。另外可以創立本身的RuntimeException子類。 運轉時異常 - 上面評論辯論包括什麼時候和若何應用運轉時異常停止了深刻商量。 3、應用try-catch處置異常

編寫從Exception 繼續的類。

AgeException.java

package com.yiibai.tutorial.exception.basic;

public class AgeException extends Exception {

  public AgeException(String message) {
    super(message);
  }

}
TooYoungException.java
package com.yiibai.tutorial.exception.basic;

public class TooYoungException extends AgeException {

 public TooYoungException(String message) {
   super(message);
 }

}

TooOldException.java

package com.yiibai.tutorial.exception.basic;

public class TooOldException extends AgeException {

 public TooOldException(String message) {
   super(message);
 }

}

和AgeUtils類檢討年紀的檢討靜態辦法。
AgeUtils.java

package com.yiibai.tutorial.exception.basic;

public class AgeUtils {

 
  // This method checks the age.
  // If age is less than 18, the method will throw an exception TooYoungException
  // If age greater than 40, the method will throw an exception TooOldException
  public static void checkAge(int age) throws TooYoungException,
      TooOldException {
    if (age < 18) {

      // If age is less than 18, an exception will be thrown
      // This method ends here.
      throw new TooYoungException("Age " + age + " too young");
    } else if (age > 40) {

      // If age greater than 40, an exception will be thrown.
      // This method ends here.
      throw new TooOldException("Age " + age + " too old");
    }

    // If age is between 18-40.
    // This code will be execute.
    System.out.println("Age " + age + " OK!");
  }
}

檢討異常和未經檢討的異常:
AgeException是Exception,TooOldException的子類和TooYoungException2是 AgeException直接子類,所以它們是“Checked Exception”
在AgeUtils.checkAge(int)辦法曾經拋出異常,須要經由過程症結字“throws”,列出它們的辦法聲明。或許可以聲明拋出更多的級別。
在應用 AgeUtils.checkAge(int) 地位也必需停止處置,以捕捉異常,或持續拋出去。

"Checked exception" 是由 "Java Compiler"來檢討。

有兩個選擇:

TryCatchDemo1.java

package com.yiibai.tutorial.exception.basic;

public class TryCatchDemo1 {

  public static void main(String[] args) {


    System.out.println("Start Recruiting ...");
    // Check age
    System.out.println("Check your Age");
    int age = 50;

    try {

      AgeUtils.checkAge(age);

      System.out.println("You pass!");

    } catch (TooYoungException e) {

      // Do something here ..
      System.out.println("You are too young, not pass!");
      System.out.println(e.getMessage());

    } catch (TooOldException e) {

      // Do something here ..
      System.out.println("You are too old, not pass!");
      System.out.println(e.getMessage());

    }

  }
}

鄙人面的例子中,我們將經由過程父類捕捉異常(超Exception類)。
TryCatchDemo2.java

package com.yiibai.tutorial.exception.basic;

public class TryCatchDemo2 {

  public static void main(String[] args) {

    System.out.println("Start Recruiting ...");
    // Check age
    System.out.println("Check your Age");
    int age = 15;

    try {

      // Here can throw TooOldException or TooYoungException
      AgeUtils.checkAge(age);

      System.out.println("You pass!");

    } catch (AgeException e) {
      
      // If an exception occurs, type of AgeException
      // This catch block will be execute
      System.out.println("Your age invalid, you not pass");
      System.out.println(e.getMessage());

    }
  }
}

也能夠組分歧的異常在塊中來處置,假如它們對邏輯法式處置是雷同的方法。
TryCatchDemo3.java

package com.yiibai.tutorial.exception.basic;

public class TryCatchDemo3 {

  public static void main(String[] args) {

    System.out.println("Start Recruiting ...");
    // Check age
    System.out.println("Check your Age");
    int age = 15;

    try {

      // Here can throw TooOldException or TooYoungException
      AgeUtils.checkAge(age);

      System.out.println("You pass!");

    } catch (TooYoungException | TooOldException e) {
      // Catch multi exceptions in one block.

      System.out.println("Your age invalid, you not pass");
      System.out.println(e.getMessage());

    }
  }

}

4、 try-catch-finally
我們已習氣於經由過程 try-catch 塊捕捉毛病。Try-catch-finally 來完整處置異常。

try {

  // Do something here

} catch (Exception1 e) {

  // Do something here

} catch (Exception2 e) {

  // Do something here

} finally {

  // Finally block is always executed
  // Do something here

}

TryCatchFinallyDemo.java

package com.yiibai.tutorial.exception.basic;

public class TryCatchFinallyDemo {

  public static void main(String[] args) {

    String text = "001234A2";

    int value = toInteger(text);

    System.out.println("Value= " + value);

  }

  public static int toInteger(String text) {
    try {

      System.out.println("Begin parse text: " + text);

      // An Exception can throw here (NumberFormatException).
      int value = Integer.parseInt(text);

      return value;

    } catch (NumberFormatException e) {

      
      // In the case of 'text' is not a number.
      // This catch block will be executed.      
      System.out.println("Number format exception " + e.getMessage());

      // Returns 0 if NumberFormatException occurs
      return 0;

    } finally {

      System.out.println("End parse text: " + text);

    }
  }

}

這是法式的流程。 finally塊不管甚麼情形下總會被履行。

5、 圍繞異常

  • 我們須要一些類介入到這個例子:
  • Person: 模仿一個受試者招募到公司的信息:姓名,年紀,性別。
  • GenderException: 性別異常。
  • ValidateException: 異常評價求職者。
  • ValidateUtils: 靜態辦法類綜合評價面試者。
  • 假如男性年紀在18-40之間的被以為是有用的。

Person.java

package com.yiibai.tutorial.exception.wrap;

public class Person {

  public static final String MALE = "male";
  public static final String FEMALE = "female";

  private String name;
  private String gender;
  private int age;

  public Person(String name, String gender, int age) {
    this.name = name;
    this.gender = gender;
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getGender() {
    return gender;
  }

  public void setGender(String gender) {
    this.gender = gender;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }
}

GenderException.java

package com.yiibai.tutorial.exception.wrap;

// Gender Exception.
public class GenderException extends Exception {

   public GenderException(String message) {
     super(message);
   }
}

ValidateException 類包有其他異常。
ValidateException.java

package com.yiibai.tutorial.exception.wrap;

public class ValidateException extends Exception {
  
  // Wrap an Exception
  public ValidateException(Exception e) {
    super(e);
  }

}

ValidateUtils.java

package com.yiibai.tutorial.exception.wrap;

import com.yiibai.tutorial.exception.basic.AgeUtils;

public class ValidateUtils {

  public static void checkPerson(Person person) throws ValidateException {
    try {

      // Check age.
      // Valid if between 18-40
      // This method can throw TooOldException, TooYoungException.    
      AgeUtils.checkAge(person.getAge());

    } catch (Exception e) {
      
      // If not valid
      // Wrap this exception by ValidateException, and throw
      throw new ValidateException(e);

    }

    // If that person is Female, ie invalid.
    if (person.getGender().equals(Person.FEMALE)) {

      GenderException e = new GenderException("Do not accept women");
      throw new ValidateException(e);

    }
  }

}

WrapperExceptionDemo.java

package com.yiibai.tutorial.exception.wrap;

public class WrapperExceptionDemo {

  public static void main(String[] args) {
    
    // One participant recruitment.
    Person person = new Person("Marry", Person.FEMALE, 20);

    try {

      // Exceptions may occur here.
      ValidateUtils.checkPerson(person);

    } catch (ValidateException wrap) {

      // Get the real cause.
      // May be TooYoungException, TooOldException, GenderException
      Exception cause = (Exception) wrap.getCause();

      if (cause != null) {
        System.out.println("Not pass, cause: " + cause.getMessage());
      } else {
        System.out.println(wrap.getMessage());
      }

    }
  }

}

6、RuntimeException和子類 RuntimeException類及其子類都是“未檢討的破例”。它不是由Java編譯器在編譯時停止檢討。在某些情形下,你可以從這個分支繼續編寫本身的異常。

上面是屬於RuntimeException分支一些類(固然,這還不是全體)。
一些處置這類類型異常的例子:

6.1- NullYiibaierException
這是最多見的異常,平日會招致毛病在法式中。異常被拋出,當你挪用辦法或拜訪一個空對象的字段。
NullYiibaierExceptionDemo.java

package com.yiibai.tutorial.exception.runtime;

public class NullYiibaierExceptionDemo {

  // For example, here is a method that can return null string.
  public static String getString() {
    if (1 == 2) {
      return "1==2 !!";
    }
    return null;
  }

  public static void main(String[] args) {

    // This is an object that references not null.
    String text1 = "Hello exception";

    // Call the method retrieves the string length.
    int length = text1.length();

    System.out.println("Length text1 = " + length);

    // This is an object that references null.
    String text2 = getString();
    
    // Call the method retrieves the string length.
    // NullYiibaierException will occur here.
    // It is an exception occurs at runtime (type of RuntimeException)
    // Javac compiler does not force you to use a try-catch block to handle it
    length = text2.length();

    System.out.println("Finish!");
  }

}

運轉示例的成果:

在實際中,像處置其他異常時,可使用 try-catch 來捕捉並處置這個異常。 但是,這是機械的,平日情形下,我們應當檢討,以確保在應用它之前,對象不為空值。
您可以更正下面的代碼,使其相似於上面的以免空指針異常:

// This is a null object.
String text2 = getString();

// Check to make sure 'Text2' are not null.
// Instead of using try-catch.
if (text2 != null) {
 length = text2.length();
}

6.2- ArrayIndexOfBoundException
當您試圖拜訪一個有效的索引的數組元素就會產生此異常。例如,一個數組有10個元素可以拜訪,但您拜訪的是索引為20的元素。
ArrayIndexOfBoundsExceptionDemo.java

package com.yiibai.tutorial.exception.runtime;

public class ArrayIndexOfBoundsExceptionDemo {

  public static void main(String[] args) {

    String[] strs = new String[] { "One", "Two", "Three" };

    // Access to the element has index 0.
    String str1 = strs[0];

    System.out.println("String at 0 = " + str1);

    
    // Access to the element has index 5.
    // ArrayIndexOfBoundsException occur here.
    String str2 = strs[5];

    System.out.println("String at 5 = " + str2);

  }

}

為了不 ArrayIndexOfBoundsException,我們更多的應當是檢討數組而不是應用try-catch。

if (strs.length > 5) {
  String str2 = strs[5];
  System.out.println("String at 5 = " + str2);
} else {
  System.out.println("No elements with index 5");
}

以上就是本文的全體內容,願望對年夜家的進修有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved