Two Types of Error in JAVA

殷老實發表於2016-10-05

在 java 中有兩種不同的 error, Compile-time Error 和 Runtime Error.

 

Compile-time Error:  發生在程式compile的時候, compile-time error 不能被catch,只是error,不是exception;程式並沒有執行。

造成的原因:

  1. 語法錯誤 

          1.1  ...expected.  括號 ( parentheses, square brackets, curly braces)等沒有匹配或者缺少分號( semicolon)  

          1.2unclosed string literal String 的冒號不匹配 。 

          1.3... 這裡都是簡單的語法上錯誤。 

  2. Identifiers 

          2.1  比如缺少對某個變數的定義  

          2.2  重複對某個變數定義  

          2.3 不能訪問 ...has private access in ..

  3. Computation 

          3.1 使用沒有被賦值的變數對其他變數賦值。 variable ... might not have been initialized. etc.  

          3.2 傳入引數型別不匹配

          3.3 操作符不能進行計算 int a; boolean b; a + b 錯誤。  ..

  4. 返回值 

          4.1 缺少返回值/返回語句  

          4.2 沒有返回型別 

          4.3 不能到達的語句 

  5. 訪問靜態entity

          訪問物件中的方法, 沒有例項化物件,也沒有講方法使用static進行標註。


Runtime Error: 發生在程式執行的時候. 

       Runtime Error 大體上可分為兩類 - 1. Errors 2. Exceptions.


         它們的結構如下: (紅色塊 是checked exception 藍色塊的是 unckecked exception)


                Unchecked Exception: 就是不需要強制使用 try-catch throw的exception ( RunTime Exception 的所有子類)

                Checked Exception: Exception 的所有除了Runtime Exception 的子類,如果我們不對checked exception處理的時候,compile 根本過不了( 在eclipse上會顯示exception,                       並提示你增加try-catch)。

所以可以根據在編譯的時候編譯器是否會檢查,檢查的話就是checked exception, 反之就是 unchecked.

                                               

從上圖可以看出來,Error 和 Exception 都是繼承 Throwable 類, 那麼說明他們都可以丟擲異常。 但是值得注意的是Error不能被try - catch 到, 但是 Exception 能被try - catch 到。 



使用者定義 Exception

以下是一個使用者定義 exception 的例子。 


因為我們繼承的是Exception, 所以我們定義的這個 exception 是 checked exception

package Exception_Example;

/**
 * Define Exception Class
 * 
 * */

public class InsufficientFundsException extends Exception{
	private double amount;
	
	public InsufficientFundsException (double amount) {
		this.amount = amount;
	}
	
	public double getAmount () {
		return amount;
	}

}



package Exception_Example;

public class CheckingAccount {
	private double balance;
	private int number;
	
	public CheckingAccount (int number) {
		this.number = number;
	}
	
	public void deposit (double money) {
		this.balance += money;
	}
	
	public void withdraw (double amount) throws InsufficientFundsException {
		if (amount <= balance) {
			balance -= amount;
		} else {
			double needs = amount - balance;
			throw new InsufficientFundsException(needs);
		}
	}
	
	public double getBalance () {
		return this.balance;
	}
	
	public int getNumber () {
		return this.number;
	}
}

Main 函式


package Exception_Example;

public class BankDemo {
	public static void main (String[] args) {
		CheckingAccount account = new CheckingAccount(101);
		account.deposit(500);
		//Since we extends from Exception which is checked exception
		//we must handle it before we can compile.
		try{
			account.withdraw(600);
		} catch (InsufficientFundsException e) {
			System.out.println(e + " Less money: " + e.getAmount());
			
		} finally {
			System.out.println("Successfully cache!");
		}
	}

}

因為這是一個 checked exception, 所以在main函式中我們必須加上try - catch. 

但是如果我們要是想定義一個unchecked 的 exception呢? 

其實就是簡單的講 InsufficientFundsException 的父類改成 RuntimeException, 在這時 main函式可以變成。並且不會報錯( 執行時丟擲異常)

<span style="font-size:14px;">package Exception_Example;

public class BankDemo {
	public static void main (String[] args) {
		CheckingAccount account = new CheckingAccount(101);
		account.deposit(500);
		account.withdraw(600);
	}

}</span><span style="font-size:18px;">
</span>



有問題歡迎指出

相關文章