2014-03-12 126 views
0

我有以下方法:Java錯誤:未報告的異常?

public T peek() throws StackEmptyException { 
    Node<T> tracker = head; 
    while(tracker.getNext() != null) { 
     tracker = tracker.getNext(); 
    } 
    return tracker.getItem(); 
} 

的問題是,當我嘗試做一些像

int firstOne = stack.peek(); 

我得到一個unreported exception StackEmptyException,我不知道我做錯了什麼在此刻。該StackEmptyException已在一個單獨的課堂。我是否想讓這個類擴展我創建的新的異常類?如此迷茫。想傢伙?

+1

這有什麼好做仿製藥 - 它只是正常檢查異常。請參閱http://docs.oracle.com/javase/tutorial/essential/exceptions/ –

+0

是的,爲什麼它報告當我編譯它? – Vimzy

+0

因爲你已經擴展了'Exception',所以你的異常是一個檢查的異常。這意味着使用你的方法的代碼應該捕獲它,或者使用'.peek()'的方法也應該拋出它。 – fge

回答

0

由方法拋出的檢查異常(即擴展了Exception但不包含RuntimeExceptionError的類)應該由此方法的調用方以遞歸方式處理。

在這裏你有.peek()其中拋出,例如,異常類E(壞的名字,但這是爲了說明)。你必須做一個foo()方法,它調用.peek()下列之一:再次

  • catch,或
  • 扔掉它。

也就是說,無論是:

// catch 
void foo() 
{ 
    try { 
     peek(); 
    } catch (E e) { 
     // something 
    } 
} 

或:

// throw 
void foo() throws E 
{ 
    peek(); 
} 

你甚至可以重新拋出:

// catch then rethrow 
void foo() throws E 
{ 
    try { 
     peek(); 
    } catch (E e) { 
     // something, then 
     throw e; 
    } 
} 
2

由於StackEmptyException檢查異常(你不應該首先做),你應該調用peek()方法時處理該異常。規則是,你應該處理異常或者聲明它被拋出。

但是,我會後退一步,將StackEmptyException更改爲未檢查的異常。那麼你不需要處理它或將其聲明爲拋出。

+0

「(你不應該在第一位)」< - 爲什麼? – fge

+0

這是一項任務,所以我別無選擇,只能按照他們想要的方式去做。 – Vimzy

+0

那麼你是說我必須在聲明int時使用try/catch firstOne = stack.peek(); ? – Vimzy

相關問題