顯示具有 例外處理 標籤的文章。 顯示所有文章
顯示具有 例外處理 標籤的文章。 顯示所有文章

2010年6月28日 星期一

JAVA筆記-覆寫例外函式

class Father {
  public void a() throw Exception{}
  public void b() throw Exception{}
  public void c() throw java.io.IOException{}
}

class Son extends Father {
  // 可以不使用throws來覆寫
  public void a() {}

  // 可用子類別來覆寫
  public void b() throw java.io.IOException,
                        java.sql.SQLException{}

  // 錯誤,不可用父類別來覆寫
  public void c() throw Exception{}
}
##ShowAll##

JAVA筆記-使用extends自訂例外類別

class MemberIDException extends Exception
{
  public MemberIDException(String mID)
  {
    super("ERROR: " + mID)
  }
  public void contactWith() // 自訂例外中的自訂方法
  {
    System.out.println("Please try again.");
  }
}

public static void main(String[] args)
{
  try
  {
    checkMemberID("123456");
  }
  catch(MemberIDException e)
  {
    System.out.println(e.getMessage());
    e.contactWith(); // 自訂例外類別中的自訂方法
  }
}

public static void checkMemberID(String mID) throws MemberIDException
{
  if(mID.length() != 5)
  {
    throw new MemberIDException(mID); // 自訂例外
  }
}
##ShowAll##

JAVA筆記-使用throw和throws自訂觸發例外

使用方法:
(1) 丟出例外物件變數,即顯示系統錯誤訊息 => throw 例外物件變數
(2) 丟出一個例外物件 => throw new Wxception(錯誤訊息字串)
##ReadMore##
public static void main(String[] args)
{
  try
  {
    score(101);
  }
  catch(Exception e)
  {
    System.out.println(e.getMessage());
  }
}

public static void score(int num) throws Exception // throws用來告知此方法有可能發生例外
{
  if(num > 100)
  {
    throw new Exception("Over");
  }
}

score方法為Exception所修飾,使用時必須被呼叫在try-catch內
如果呼叫score的函式有經過throws修飾,則可直接使用,不需try-catch
如:
public static void main(String[] args) throws Exception {

可同時使用多個Exception子類別修飾方法
public void calc() throws IOException, SQLException{
throw new IOException();
throws new Exception(); // 不可丟出更大的父類別
}

JAVA筆記-使用assert維護程式碼

AssertionError繼承Error類別
用於維護程式碼,與C語言的assert用法意義相同
意義是當產生AssertionError時,
代表程式碼可能撰寫錯誤或不完全
##ReadMore##
assert表達式
(1) assert expression1 ;
(2) assert expression1 : expression2 ;

當expression1 = true,不做動作
當expression1 = false,產生AssertionError錯誤字串

AssertionError預設為關閉,開啟方法:
(1) 編譯指令 => javac -source 1.4 XXX.java
(2) 執行指令 => java -ea XXX

關閉方法:
執行指令 => java -da XXX

// 例1
assert (score >= 0) : "INPUT ERROR!" ;
if(score > 60) System.out.println("Pass.");

// 例2
while (true){;}
assert false : "IMPOSSIBLE!" ;

2010年4月16日 星期五

JAVA筆記-擷取例外的類別

Throwable
     <- Error (Compiler會自己找出來)
     <- Exception (由try-catch擷取例外)

Exception
     <- ClassNotFoundException
     <- SQLException
     <- InterruptedException
     <- IOException <- EOFException
                            <- FileNotFoundException
     <- RuntimeException <- ArithmeticException(除以零)
                                     <- NullPointerException
                                     <- IndexOutOfBoundsException
                                     <- IllegalStateException
                                     <- ClassCastException
                                     <- IllegalArgumentException

IndexOutOfBoundsException
     <- NumberFormatException

IllegalStateException
     <- ArrayIndexOutOfBoundsException

使用範例:
try {
  // 可能發生例外的程式碼
}
catch (ArithmeticException e){
  // 發生例外時處理的程式碼
}

2010年3月24日 星期三

JAVA筆記-try-catch-finally 例外處理機制

若沒有設置例外處理機制,當錯誤發生時,
函式會層層往上反應到JVM,而結束程式
若有設置例外處理機制,當錯誤發生時,
程式可以有相對應的處理

try區段後必須至少接一個catch區段或finally區段
可用e.printStackTrace(System.out);來配合使用

finally是總是執行的程式碼,就算在try-catch內有return也會執行
如果不想讓它執行,finally前使用System.exit(1);

try
{
  /* 可能發生例外的程式碼 */
}
catch(ArithmeticException e)
{
  /* 發生例外時處理的程式碼 */
  System.out.println(e.getMessage()); //顯示錯誤原因
}
//有直系關係的exception類別要放在後面
catch(RuntimeException e)
{
  /* 發生例外時處理的程式碼 */
  e.printStackTrace(System.out); //顯示詳細錯誤原因
}
finally
{
  /* 總是執行的程式碼 */
}

2009年9月19日 星期六

C/C++筆記-assert防止陣列索引溢出

/* 叫用#include <assert.h> 來檢查有無超過範圍 */
int primes[] = {2,3,5,7,11,13,17};
int index = 10;
assert(index < (sizeof(primes)/sizeof(primes[0]))); assert(index >= 0);
std::cout << primes[index] ; /* 用起來其實很累人,但一些大型source code,會看到在用 */
##ShowAll##
/