checked和unchecked操作符用於整型算術運算時控制當前環境中的溢出檢查。下列運算參與了checked和uncheced檢查:
●預定義的++和--:一元操作符,當其操作數類型為整型時。
●預定義的-:一元操作符,當其操作數為整型數時。
●預定義的+、-、*、/等二元操作符,當兩個操作數數據類型都是整型。
●從一種整型到另一種整型地顯式數據轉換。
當上述運算之一產生一個目標類型無法表示的大數時,在使用了checked操作符的表達式中,如果運算是一個常量表達式,則產生運行時錯誤,否則,當運行時執行該運算時會溢出異常。而在使用了uncheced操作符的表達式中,返回值被截掉不符合目標類型的高位。
如果非常量表達式沒有被任何checked或unchecked操作符或語句所包括時,運行時計算該表達式的值,是否會產生溢出,依據於外部因素,如編譯器狀態、執行環境參數等。而對於一個常量表達式而言,總是默認為進行溢出檢查。
使用了unchecked操作符後,溢出的發生不會導致編譯錯誤。但這往往會出現一些不可預期的結果,所以使用unchecked操作符要小心。
下面的例子說明了checked和unchecked操作符的用法:
class Test { static int x=1000000; static int y=1000000; static intF(){ return checked(x*y); //編譯錯誤,拋出異常 } static int G(){ return unchecked(x*y); //返回值為-727379968 } static int H(){ return x*y; //依賴於編譯時的默認情況 } }
由於編譯時沒有對任何表達式進行計算,因此不會產生編譯錯誤。當程序運行時,調用F方法會拋出一個OverFlowException異常,而調用G方法則返回-727379968(超出結果范圍的低32位)。H方法是否拋出異常則要看編譯環境的默認情況了,調用它的結果有可能與F相同,也有可能與G相同。而對於常量表達式則是另一種情況:
class Test { const int x=1000000; const int y=1000000; static int F(){ return checked(x*y); //編譯錯誤,溢出 } static int G(){ return unchecked(x*Y); //返回值為-727379968 } static int H(){ return x*y; } }
當計算F和H方法中的常量表達式時發生溢出,由於是在checked環境中,那麼在編譯時就報告錯誤。當計算G方法中的常量表達式時,也會發生溢出,但不會報告錯誤。
checked和unchecked操作符只影響置於其後括號之中運算的溢出檢查。它們不會影響作為表達式結果的被調用的方法成員。例如:
class Test { static int F(int x,int y){ return x*y; } static int G(){ return checked(F(1000000,1000000)); } }
其中,G方法中的checked不會影響函數F方法中的x*y運算,因此,x*y運算在默認溢出檢查的上下文中。