例外處理

異常處理是程式設計的重要機制之一,主要用作維護程式的正常流程使程式不致於出乎意料中斷。Java中的異常稱「exception」翻譯為「例外」,也就在程式「執行階段」的突發狀況。這些例外通常會破壞程式的正常流程,讓JVM輸出一堆問題清單並中斷程式執行。異常處理「try{...}catch(...)」則是一種處理運行時錯誤的機制,如「NullPoint、NotFound、IO、SQL、NetWork」等...。因此,當發生異常時,需要提供適當的流程和的解決方法,使得主要程式的執行不會受到影響。 Java程式語言的主要優點之一,就是有這種維護程式正常執行的機制。


public class CH01201 {

 public static void main(String[] args) {
  
  int  i = 50 / 0 ; //ArithmeticException 
  
  //String   s = null ;   
  //System . out . println (s.length ()) ; //NullPointerException 
  
  //int a [] = new   int [5] ;   
  //a [10] = 50 ;   //ArrayIndexOutOfBoundsException 

 }

}
有些情況是無法進入例外處理的,比如作業系統的或是設備發生問題。


try • catch

所有異常和錯誤類型都是「Throwable」類的子類,都是在「執行階段」發生。一個分支以「Exception」為結尾,通常為程式執行中無預期發生如「NullPointerException」。另一個分支以「Error」為結尾,通常為「JVM」環境的限制如「 StackOverflowError」。這2種解釋都太過抽象,若用較為實際的方式則分為3種類型。



1) Checked Exception

執行階段發生的異常狀況,能透過修改程式解決的異常:「IOException、SQLException...」。

import java.io.IOException;

public class CH01202 {

 public static void main(String[] args) {
  
  Process p = null;

  while (true) {
   try {
    
    // p = Runtime.getRuntime().exec("wmic cpu get loadpercentage");
    p = Runtime.getRuntime().exec("wmc cpu get loadpercentage"); // 可以透過修改程式碼解決異常
    System.out.println("正確執行");
    
   } catch (IOException e) {

    System.out.println("捕捉到問題: "+e);

    break;
   }

  }

 }

}

2) Unchecked Exception

同樣是執行階段發生的異常狀況,不同之處在於沒有辦法透過修改程式解決:「ArithmeticException、NullPointerException、ArrayIndexOutOfBoundsException...」。

public class CH01203 {

 public static void main(String[] args) {
  
  int i[] = {1, 2, 3, 4};
  
  //System.out.println(i[4]);
  
  try{
   
   System.out.println(i[4]);
   
  }catch(ArrayIndexOutOfBoundsException e) {
   
   System.out.println("成功捕捉: "+e);
   
  }
  
 }

}

3) Error
完全沒辦法避免的,例如「OutOfMemoryError、VirtualMachineError、AssertionError」。

public class CH01204 {

    public static void main(String[] args) {

        try {

            System.out.printf("執行 %s 功能%n", args[0]);

        }catch(Exception e) {

            System.out.println("沒有指定參數!");

            //e.printStackTrace();

        }finally{

            System.out.println("執行完成...");
  
        }

    }

}

catch(Exception e)可以捕捉到所有問題,但是只會提示第1個。使用上很方便,但是沒有辦法精確處理不同問題。



連續偵測例外

可以根據可能出現的各種例外建立處理機制
import java.io.IOException;

public class CH01205 {

 public static void main(String[] args) {
  
  Process p = null;

  while (true) {
   try {
    
    // p = Runtime.getRuntime().exec("wmic cpu get loadpercentage");
    p = Runtime.getRuntime().exec("wmc cpu get loadpercentage"); // 可以透過修改程式碼解決異常
    System.out.println("正確執行");
    
   } catch (IOException e) {

    System.out.println("捕捉到問題: "+e);

    break;
   }catch(Exception e) {
    
    System.out.println("捕捉到其他問題"+e);
    
    break;    
   }

  }

 }

}


強制拋出例外

可以根據自己的喜好拋出不同的種類的例外
public class CH01206 {

 public static void main(String[] args) {

  if (args != null) {

   throw new NullPointerException("query is null");

  }

 }

}

下一步 函式

沒有留言:

張貼留言