2013-04-24 17 views
1

我在Java項目中有一個類,其中包含一個二維數組值,並提供了與其交互的有用方法。它使用Location對象(它只存儲兩個值)來訪問映射中的點並返回值。它有一個方法isValid(),它檢查Location對象是否在網格的映射中。try/catch中必需的AssignmentOperators

public boolean isValid(Location loc) { 
    try { 
     // will throw an ArrayIndexOutOfBoundsException if not valid 
     // occs is the 2D array within the class 
     occs[loc.getX()][loc.getY()]; 
     return true; 
    } 
    catch (ArrayIndexOutOfBoundsException e) { 
     return false; 
    } 
} 

現在,我知道我可以只使用比較來檢查值,看看是否能LOC在網格內配合,但是這是更快,因爲它並不需要運行比較和被檢查非有效位置的情況下,在很少的情況下。 但是,這是我的問題:由於訪問數組的行返回的值沒有被分配或發送到方法中,所以我收到有關AssignmentOperators的錯誤。我知道將它分配給一個臨時值或通過一些無用的方法運行它可能是一個簡單的解決方法,但這兩個對我來說似乎都是狡猾的bandaid解決方案,我想知道是否有更乾淨的方法來做到這一點。 (此外,前者引發了來自Eclipse的警告。)

無論如何,這是低優先級,但它讓我煩惱,在這樣一個簡單的實現中,如此簡單的事情不可能完全誠實。謝謝!

+0

有關您的檢查位置的方式的問題:http://stackoverflow.com/questions/18872733/is-it-ok-to-use-exceptions-to-check-for-array-boundaries/18872734 – Dariusz 2013-09-18 12:54:01

回答

1

不幸的是,這只是Java的方式。從JLS第14.8節,表達式語句:

與C和C++不同,Java編程語言只允許某些 表達式形式用作表達式語句。需要注意的是 Java編程語言不允許「轉換爲void」 - 無效 不是一個類型 - 所以寫一個表達式 聲明如傳統的C伎倆:

(無效)...; //不正確!不起作用。另一方面,編程語言允許在表達式語句中使用所有最有用的表達式 ,並且它不需要用作表達式語句的方法調用 來調用void方法,所以這樣的一個 技巧幾乎是從不需要。如果需要技巧,可以使用 賦值語句(第15.26節)或局部變量聲明 語句(第14.4節)代替。

目前尚不清楚他們爲什麼這樣做,但我的猜測是它旨在減少錯誤。例如,如果有人不小心寫入a == b;而不是a=b;,則會導致編譯器錯誤。在極少數情況下,有人真的想要這種行爲,他們必須明確地將其分配給一個臨時變量(或將其傳遞給一個方法或類似的東西)。

2

因爲它不需要運行比較,所以速度更快。

當然,它需要'運行比較'。還有什麼可能工作?你在這一點上的推理是錯誤的。因此你的問題是無效的。

+0

此外,即使它不需要比較(例如依靠硬件陷阱),拋出異常仍然會比四次比較慢得多。 – 2013-09-18 11:57:18