和Java的其他任何對象一樣,需要用new在內存堆裡創建違例,並需調用一個構建器。在所有標准違例中,存在著兩個構建器:第一個是默認構建器,第二個則需使用一個字串自變量,使我們能在違例裡置入相關信息:
if(t == null)
throw new NullPointerException("t = null");
稍後,字串可用各種方法提取出來,就象稍後會展示的那樣。
在這兒,關鍵字throw會象變戲法一樣做出一系列不可思議的事情。它首先執行new表達式,創建一個不在程序常規執行范圍之內的對象。而且理所當然,會為那個對象調用構建器。隨後,對象實際會從方法中返回——盡管對象的類型通常並不是方法設計為返回的類型。為深入理解違例控制,可將其想象成另一種返回機制——但是不要在這個問題上深究,否則會遇到麻煩。通過“擲”出一個違例,亦可從原來的作用域中退出。但是會先返回一個值,再退出方法或作用域。
但是,與普通方法返回的相似性到此便全部結束了,因為我們返回的地方與從普通方法調用中返回的地方是迥然有異的(我們結束於一個恰當的違例控制器,它距離違例“擲”出的地方可能相當遙遠——在調用堆棧中要低上許多級)。
此外,我們可根據需要擲出任何類型的“可擲”對象。典型情況下,我們要為每種不同類型的錯誤“擲”出一類不同的違例。我們的思路是在違例對象以及挑選的違例對象類型中保存信息,所以在更大場景中的某個人可知道如何對待我們的違例(通常,唯一的信息是違例對象的類型,而違例對象中保存的沒什麼意義)。