2015-07-11 123 views
-1

我在java中實現了一個固定大小的Queue,它使用一個常數大小的ArrayList作爲基礎容器,其中我的front()方法應該返回Queue的前面元素。只返回沒有異常拋出

public T front(){ 


     try{ 
      if(isEmpty()) 
       throw new Exception("Queue is Empty- can't return Front element."); 
      return arrayList.get(frontIndex); 

     }catch (Exception e){ 
      System.out.println(e); 
     } 

    } 

通過以上述方式編碼,我想前()僅返回如果沒有拋出異常值,但預期編譯器給我「缺少return語句。」那麼,有沒有什麼辦法可以讓這個函數只在沒有拋出異常的情況下返回。

+0

如果該方法具有非'void'返回類型,則*有*返回值或拋出異常。沒有其他選擇。你想對這兩種選擇做什麼? –

回答

3

由於您在捕獲代碼中的異常,因此編譯器顯示缺少返回語句錯誤。

您可以實現的功能就像這樣:

public T front() throws Exception { 

    if(isEmpty()) { 
     throw new Exception("Queue is Empty- can't return Front element."); 
    } 

    return arrayList.get(frontIndex); 
} 

最後處理該異常在調用函數/客戶端

0

爲什麼如果你之後抓到它,你會使用這個例外嗎?您必須返回T或拋出異常。但是,該方法不會拋出異常,因爲您正在捕獲它。難道這樣做不容易:

public T front() throws SomeException{ // if SomeException is checked you need to declare it 
     if(isEmpty()) 
      throw new SomeException("Queue is Empty- can't return Front element."); 
     return arrayList.get(frontIndex); 
    } 

您還應該使用更具體的異常,而不是異常。

+1

異常意味着被捕獲,他應該拋出一個錯誤 – ceph3us

+0

異常可以被捕獲,但通常它們被方法調用者捕獲,而不是在方法本身中捕獲 – user140547

+0

異常與錯誤有什麼區別?錯誤不應該被捕獲 – ceph3us

1

我想前()只返回如果沒有拋出異常值

反問:那你想如果拋出異常回報?

這是問題所在。您已聲明front()返回某個內容(T的實例)。這意味着,有兩個相關的方式終止呼叫front()

  • 它可以返回一些符合類型T正常終止。

  • 它可以通過拋出未經檢查的異常異常終止。

您不能返回「無」,因爲front()必須返回一個值。

您不能拋出檢查異常(如Exception),因爲front()未被聲明爲拋出任何異常。


那麼你能做什麼?

  • 使SomeException被拋出,其中SomeExceptionException下降可以改變方法簽名。 (投擲Exception是一個非常糟糕的主意......)

  • 您可以將throw new Exception更改爲throw new SomeException,其中SomeException來自RuntimeException

  • 假設T是引用類型,您可以返回null。 (這將是,如果T是一個類型參數。)


1 - 事實上,有一對夫婦的其他方式,但他們不是在這方面非常有用。例如,您可以撥打System.exit(int)並終止JVM。 (也有結構化的代碼,這樣你就不需要(冗餘)returnthrowexit調用的方式提示:無限循環不需要返回。)

+0

即使您調用'System.exit(int)',您仍然必須返回一個值或拋出異常;編譯器在調用System.exit(int)後不知道程序流停止。 –

+0

修辭我可以返回T型或null的任何東西,即使當一個例外將拋出 – ceph3us

+0

謝謝,你的修辭問題使我清楚的事情,我明白了! – charany1

0

這個「榜樣」節目當u能拋出異常和返回值的可能性

private boolean throwExReturnValue() throws NullPointerException { 

    try { 

     throw new NullPointerException("HAHA"); 
    } 

    finally { 

     return true; 
    } 
} 

private void ExceptionHanler() { 

    boolean myEx; 

    try { 

     myEx = throwExReturnValue(); 

     /** code here will still execute & myEx will have value = true */ 

    } catch (Exception ex) { 

     /** will execute or not (depending on VM) even we throwed an exception */ 

    } 

    /** code will still execute */ 

} 

編輯:

我想這有兩個不同的虛擬機,讓我吃驚的一個是扔異常第二是跳過catch塊並執行代碼,因此取決於虛擬機實現