2014-03-12 129 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

相关问题