- int與Integer有什麼差別?
Java語言是一個面向對象的語言,但是Java中的基本資料類型卻不是面向對象的,這在實際使用時存在了很多的不便,為了解決這個不足,在設計類時為每個基本資料類型設計了一個對應的類進行代表,這樣八個和基本資料類型對應的類成為包裝類(Wrapper Class)
Java語言提供兩種不同的類型:引用類型和基本資料類型;int是Java語言中的原始資料類型,Integer是Java為int提供的包裝類,Java為每個基本資料類型提供了封裝類,其中,基本資料類型包括byte、short、int、long、float、double、char、boolean這八個基本資料類型,這八個基本資料類型對應的封裝類為Byte、Integer、Long、Float、Double、Character、Boolean。
這八個類中,除了Integer和Character類以外,其他六個類的類名和基本資料類型一緻,隻是類名的第一個字母大寫即可。對于包裝類說,這些類的用途主要包含兩種:
1)、作為和基本資料類型對應的類類型存在,友善設計到對象的操作。
2)、包含每種基本資料類型的相關屬性如最大值、最小值等,以及相關的操作方法。
- 檢視示例代碼。

解釋上述代碼中,"System.out…"兩句代碼輸出完全不同的結果?
"Hello"是一個字元串常量,它存放在記憶體的常量池中。在第一行代碼執行後建立此
- 如何将int型變量轉換為String類型的變量?如何将String類型變量轉換成int類型變量?
- 加法運算符+可以施加于原始數值類型(比如int)的變量,但我們發現一些對象類型(比如Integer)的變量,也支援+運算,請看代碼。
這看上去好像Integer類型重載了"+"運算符,一些程式設計語言比如C++可以重載運算符,但Java本身并不支援這一特性,依照你的了解或猜測,Java采用什麼方法處理兩個Integer對象直接"+"的語句?
- 通過正規表達式判斷一個字元串:首位是字母,後面可以是字母、數字或者下劃線,總長度6-18位?
- 請寫出中國身份證号的正規表達式。
- Java中字元串轉換到數字的API。
将String類型變量Byte、Short、Integer、Long、Float、Double的API如下顯示。
- Anonymous Inner Class(匿名内部類)是否可以extends(繼承)其他類?是否可以implements實作interface接口。
匿名内部類可以繼承其他類或實作其他接口,在Java程式設計中常用此方式。
- 内部類可以引用其他包含類的成員嗎?有沒有什麼限制。
- 内部類的實作方法。
- Checked Exception和Unchecked Exception是什麼以及他們的差別。
- 在Java語言中,如何引發異常,對異常處理的兩條途徑是什麼?
- 異常分幾種類型?有什麼差別?寫出幾個常見異常。
異常(Exception)分為兩類:運作時異常和非運作時異常。
運作時異常和非運作時異常時運作時異常(RuntimeException)又稱為非檢查異常,非運作時異常指的是檢查異常。運作時異常是指直接或間接繼承RuntimeException的異常。非運作異常是除了RuntimeException以外的其他異常,是程式有邏輯錯誤,程式員應該積極避免其出現的異常。java編譯器要求方法必須聲明抛出可能發生的非運作時異常,但是并不要求必須聲明抛出來未捕獲的運作時異常。
常見的運作時異常:
- NullPointerException:當操作一個空引用時出現的異常。
- NumberFormatException:試圖将字元串轉換成一種數值類型,但該字元串不能轉換為适當格式時,抛出該異常。
- ClassCastEcception:強制類型轉換不比對時出現此異常。
- ArrayIndexOutOfBoundsException:當使用一個不存在的數組下标時出現此異常。
- ArithmeticException:當出現異常的運算條件時出現此異常。
常見的非運作時異常:
1)、SQLException:提供關于資料庫通路錯的異常。
2)、IOException:當發生某種I/O異常時,抛出此異常。
3)、ClassNotFoundException:當應用程式試圖使用Class類中的forName方法、loadClass方法時,抛出的異常。
- Java中的一場處理機制的簡單原理。
- try中又一個return語句,那麼緊跟在try後的finally裡的代碼塊會不會執行,什麼時候被執行,在return之前還是之後。
會,在return之前。
- 當使用多個catch語句捕獲多個異常時,Java規定捕獲Exception的catch語句必須排在最後。如下所示,為什麼有此限制,談談你的了解。
為什麼會有這個限制?談談你的了解。
- Java語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分别代表是什麼意思?在try語句塊中可以抛出異常嗎?
- final,finally,finalize的差別?
final是一個修飾符。如果一個類被生命為final,意味着它不能再派生出新的子類,不能作為父類被繼承,是以一個類不能既被聲明為abstract的,又被聲明為final的;将變量或方法聲明為final,可以保證他們在使用中不被改變;被聲明為final的變量必須在聲明時就給定初始值,而在以後引用中隻能讀取,不可修改;被聲明為final的方法也同樣隻能使用,不能重載。
finally用在異常處理時提供finally塊來執行任何清除操作;如果抛出一個異常,那麼相比對的catch子句就會執行,然後控制就會進入finally塊(如果由的話)
finalize是方法名,Java技術允許使用finalize()方法在垃圾收集器将對象從記憶體中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在确定這個對象沒有被引用時對這個對象調用的。它是Object類中定義的,是以所有的類都繼承它。子類覆寫finalize()方法以整理系統資源或者執行其他清理工作。
- 闡述一下IndexOutOfBoundsException通常在什麼情況下發生。
訓示某排序索引(例如對數組、字元串等)超出範圍時抛出。例如:當使用一個不存在的數組下标時出現ArrayIndexOutOfBoundsException。
- 闡述一下NullPointerException通常在什麼情況下發生。
通常在操作一個空引用時會産生NullPointerException,例如:空引用調用屬性或方法時。
- 闡述一下ClassCastException通常在什麼情況下發生。
- 畫出集合的架構圖。
- 編寫一段程式,用來建立和疊代一個List
- 編寫一段程式,用來建立和疊代一個Set
- 編寫一段程式,用來建立和疊代一個Map
- Collection和Collections的差別。
Collection是java.util下的接口,它是各種集合的父接口,繼承于它的接口主要有Set和List;Collections是個java.util下的類,是針對集合的幫助類,提供一系列靜态方法實作對各種集合的搜尋、排序、線程安全化等操作。
- 說說Java集合類:HashMap是如何設計的?是如何解決什麼沖突的。
1)、HashMap是基于哈希表的Map接口的非同步實作。在Java程式設計語言中,最基本的結構就是兩種,一個是數組,另一個是模拟指針(引用),所有的資料結構都可以用這兩個基本結構來構造的,HashMap也不例外。HashMap實際是一個“連結清單的數組”的資料結構,每個元素存放連結清單頭結點的數組,即數組和連結清單的結合體。HashMap底層就是一個數組結構,數組中的每一項又是一個連結清單。當建立一個HashMap的時候,就會初始化一個數組。Entry就是數組中的元素,每個Map.Entry其實就是一個key-value對,它持有一個指向下一個元素的引用,這就構成了連結清單。
2)、HashMap的存儲。當我們往HashMap中put元素的時候,先根據key的hashCode重新計算hash值,根據hash值得到這個元素在數組中的位置(即下标),如果數組該位置上已經存放有其他元素了,那麼在這個位置上的元素将以連結清單的形式存放,新加入的放在鍊頭,最先加入的放在鍊尾。如果數組該位置上沒有元素,就直接将鈣元素放到此數組中的該位置上。
3)、HashMap的存儲。當我們往HashMap中put元素的時候,先根據key的hashCode,找到數組中的對應位置的某一進制素,然後通過key的equals方法在對應位置的連結清單中找到需要的元素。
4)、HashMap的resize(rehash):當HashMap中的元素越來越多時,hash沖突的幾率也就越來越高,因為數組的長度是固定的。是以為了提高查詢效率,就要對HashMap的數組進行擴容,資料擴容這個操作也會出現在ArrayList中,這是一個常用的操作,而在HashMap數組擴容之後,最消耗性能的點就出現了:原數組中的資料
- 簡述HashTable原理,并說明它和HashMap差別?
- HashMap和HashSet有什麼關系。
- Vector和ArrayList有什麼差異。
- List、Set、Map是否繼承自Collection接口。
List,Set繼承于Collection接口,而Map沒有繼承自Collection接口
- List底層是怎麼實作的?雙向連結清單和數組的差別。
在Java中List是一個接口,繼承于Collection接口,并定義了添加元素,删除元素,取出元素等對集合操作的抽象方法。
雙向連結清單和數組的差別:
1)、數組必須事先定義固定的長度(元素個數),不能适應資料動态地增減的情況。當資料增加時,可能超出原先定義的元素個數;當資料減少時,造成記憶體浪費;數組可以根據下标直接存取。
2)、連結清單動态地進行存儲配置設定,可以适應資料動态地增減的情況,且可以友善地插入,删除資料項;而數組中插入、删除資料項時,需要移動其他資料項,非常繁瑣。
- 說出ArrayList,Vector,LinkedList的存儲性能和特性。
ArrayList和Vector都是使用數組方式存儲資料,此數組元素數大于實際存儲的資料以便增加和插入元素,他們都允許直接按照序号索引元素,到那時插入元素要涉及數組元素移動等記憶體操作,是以索引資料快而插入資料慢,Vector由于使用的是synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向連結清單實作存儲,按序号索引資料需要進行向前或向後周遊,但是插入資料隻需記錄本項的前後項即可,是以插入速度較快。
- 請通過一次循環,清除掉一個ArrayList中的每個元素。
- 設計一個程式基于Map泛型完成10個英文單詞的翻譯。
- Set裡的元素是不能重複的,用什麼方法來區分重複與否,用==還是equals,他們有什麼差別。
- 編寫一個List集合,存儲通訊錄。(同學姓名和電話)并輸出通訊錄
- 有兩個List<Integer>,寫一個方法要求合并這兩個結合,不能有重複的,不能用集合的sort等方法,而且要求中間的數字最大,兩邊逐漸減小。例如(m是集合的size)(get(0)<get(m-1),get(1)<get(m-2))。
- 将檔案夾a(包括其下所有子檔案夾和檔案)複制到檔案夾b下。要求:使用10個線程同時進行,每一個線程獨立處理一個檔案。
- 請說明什麼是線程安全?
- 為什麼要使用多線程程式設計?
- 啟動一個線程是用run()還是start()?
啟動一個線程是調用start()方法,使得線程所代表的虛拟處理機處于可運作狀态,這意味着它可以由JVM排程并執行。但并不意味着線程就會立即運作,run()方法可以産生必須退出的辨別來停止一個線程。
- sleep()和wait()有什麼差別?
sleep方法:是線程類(Thead)的方法,導緻此線程暫時執行指定的時間,把執行機會給其他線程,但是監控狀态依然保持,到時後會自動恢複。調用sleep不會釋放對象鎖。wait是Object類的方法,對象調用wait方法導緻本線程放棄對象鎖,進入等待此對象的等待鎖定池,隻有針對此對象發出notify方法(或notifyAll)後本線程才能進入到鎖定池準備獲得對象鎖進入運作狀态。
- sleep()和yield()有什麼差別?
yield方式隻是讓出配置設定給自己的cpu時間片,并且會立刻進入Runnable狀态參與cpu時間的競争,若程式中沒有其他線程,那麼該線程馬上就會開始往下執行,sleep會進入Blocked狀态,等待時間結束時間的發生,然後進入Runnable狀态參與cpu時間的競争。
- 當一個線程進入一個對象的一個synchronized方法後,其他線程是否可進入此對象的其他方法?
其他線程隻能通路該對象的其他非同步方法,同步方法則不能進入。
- 請說出你所知道線程同步的方法?
- 同步和異步有何異同,在什麼情況下分别使用它們?舉例說明?
- 簡述synchronized和java.util.concurrent.locks.Lock的異同?
- 分别用Java中多線程的兩種方法實作:輸出字元串"Hello",要求每間隔1s輸出一個字母。
- 線程池是什麼?
當一個程式中若建立大量線程,并在任務結束後銷毀,會給系統帶來過度消耗資源,以及過度切換線程的危險,進而可能導緻系統崩潰。為此我們應使用線程池來解決這個問題,
首先建立一些線程,他們的集合稱為線程池,當伺服器接收到一個客戶請求後,就從線程池中取出一個空閑的線程為之服務,服務結束後不關閉該線程,而是将該線程還回到線程池中,子線程池的程式設計模式下,任務是送出給線程池,而不是直接交給某個線程,線程池在拿到任務後,它就在内部找有誤空閑的線程,再把線程送出給内部某個空閑的線程,一個線程同時隻能執行一個任務,但可以同時向一個線程池送出多個任務。
- 寫一個簡單的socket實作聊天功能的例子(不要求界面,隻實作資料傳輸)一個主服務端,一個用戶端。
- Java Socket程式設計,從伺服器讀幾個字元,再寫入本地控制台。
- 什麼時候Java序列化,如何實作Java序列化。
序列化就是一種個用來處理對象流的機制,所謂對象流也就是将對象的内容進行流化。可以對流化後的對象進行讀寫操作,也可将流化後的對象傳輸于網絡之間。序列化是為了解決在對對象流進行讀寫操作時所引發的問題;序列化的實作:将需要被序列化的類實作Serializable接口,該接口沒有要實作的方法,隻是為了标注該對象是可被序列化的,然後使用一個輸出流(如:FileOutputStream)構造一個ObjectOutputStream(對象流)對象,接着,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以将參數為obj的對象寫出(即儲存其狀态),要恢複的話用輸入流。
- Java中有幾種類型的流?jdk為每種類型的流提供一些抽象類以供繼承,請說出分别是哪些類。
Java中有位元組流,字元流。
位元組輸入流的父類為InputStream、位元組輸出流的父類為OutputStream;字元輸入流的父類為Reader、字元輸出流的父類為Writer。
- 位元組流與字元流的差別?
- 檔案和目錄(IO)操作
- 如何列出某個目錄下的所有檔案?
- 如何列出某個目錄下的所有子目錄?
- 如何判斷一個檔案或目錄是否存在?
- String s = new String("xyx"); 建立了幾個String Object?
- 是否可以繼承String類?
- 說出"==" 和"equals()"方法在字元串變量操作中的不同?
- 數組有沒有length()這個方法?String有沒有length()方法?
- String, StringBuffer, StringBuilder的差別?
String的長度是不可變的;StringBuffer的長度是可變的,如果對字元串中的内容經常進行操作,特别是内容要修改時,則使用StringBuffer,如果最後需要String,那麼使用StringBuffere的toString()方法轉換成String類型的資料;
StringBuffer是線程安全的;StringBuilder是從JDK1.5開始,為StringBuffer該類補充了一個單個線程使用的等價類;通常應該優先使用StringBuilder類,因為它支援所有相同的操作,但由于它不執行同步,是以速度更快。
- 編寫程式将由數字及字元組成的字元串中的數字截取出來被按順序輸出,例如:"ABC127GMNQQ2049PN5FFF"輸出的結果應該為01234579。
- String s = "abcdefghigklmnopqrstuvwxyz"; 編寫一段程式,實作"mnop"輸出。
- 在Java代碼中有一個字元串String ss = "abc,efgAA,12q,456,zA,KJD";在不使用split方法的情況下寫一段代碼實作按"," 拆分字元的功能,并輸出結果。
- 從檔案IN.DAT中讀取一篇英文文章存入到字元串數組xx中,以行為機關對行中以空格或标點符号為分隔的所有單詞進行倒排,最後把已處理的字元串(應不含标點符号)扔按行重新存入字元串數組xx中,最後把結果xx輸出到檔案out.dat中。
- Class.forName(String class) 的功能?
如果沒有加載給定字元串對應的類,要加載這個類,然後傳回與帶有給定字元串名的類或接口相關聯的Class對象。
- 談談對反射技術的了解。
- 如何獲得目前日期時間。
- 如何将日期時間轉換成想要的格式。
- 編寫程式,計算任意兩個日期之間的天數。
- 什麼是辨別接口(Mark Interface),它與接口的差別在什麼地方,并簡單列舉你知道的辨別接口。
- 請使用Java語言定義一個具備棧功能的類,實作以下接口。
public interface StackInterface{
void push(Object value):
Object pop();
Boolean isEmpty();
}
- 編寫一個程式,使用者輸入任何一個字元串以後,反轉輸出其結果。其運作結果如下所示:
- 請輸入一個字元串:我在學習Java程式設計
- 您輸入了:計設序程avaJ習學在我。
- 請用面向對象的思想設計一個計算機程式,請寫出程式架構(主要使用的類和方法)
- 寫一個函數,2個參數,1個字元串,1個位元組數,傳回截取的字元串,要求字元串中的中文不能出現亂碼:如("我ABC",4)應該截為"我AB", 輸入(“我ABC漢DEF”, 6)應該輸出為"我ABC"而不是"我ABC+漢的半個"
- 日期和時間
- 如何取得年月日、小時分秒
- 如何取得從1970年到現在的毫秒數
- 如何取得某個日期的當月的最後一天
- 如何格式化日期
- 寫一個方法,輸入一個檔案名和一個字元串,統計這個字元串在這個檔案中出現的次數?
- 寫一個函數,要求輸入一個字元串和一個字元的長度,對該字元串進行分割?
- Java類實作序列化的方法?在collection架構中,實作比較要實作什麼樣的接口?
- 設計4個線程,其中兩個縣城每次對j增加1,另兩個縣城對j每次減少1;寫出程式?
- 請寫出線程的實作方式?
- 字元串"sh24sdgf909sdf8",不改變原字元串對象,寫一個方法,傳回"shsdgfsdf"?
- "driver|name|id|"寫一個函數,分别擷取driver,name,id并輸出。
- 剔除下面字元的","。例如:字元串"A, B, C, D, E, F" ,剔除的傳回結果為"ABCDEF"
- 編寫一個指令行程式,提示輸入2個字元串,找出2串字元串中是否存在相同的長度為3的字元串,比如字元串"abc12uwks"和字元串"q72bnabc00",則把abc找出來。
- 現有一個數組int data_arr[]={12,31,56,23,277,1,43,65,4,99},已完成如下代碼,請在注釋處增加一段代碼,實作這樣的功能:将data_arr數組的内容先寫入一個名為"temp.dat"檔案中,再重寫将該檔案的内容讀出,能逆序将檔案的内容輸出至控制台(形如99,4,65,1,27,23,56,31,12)
答案:
- 現有一個程式需要記錄運作中的關鍵資訊,要求在記憶體中保留最近的n條資訊供查詢。儲存的資訊不需要做持久化處理,要求提供一個獨立的日志類,負責對日志的寫入和讀取,請列出該類所應具有的方法并寫出大緻的實作代碼。
注:持久化指的是将資料存入資料庫或存為檔案。讀取日志時隻要求能一次性讀出現有的所有記錄。
- 數學中,一個複數包容着一個實部(Real)和一個虛部(Imaginary),請設計一個Complex類,它的執行個體代表一個複數,并且使用者可以這樣使用它:
//建立一個實部為3,虛部為4的複數
Complex obj = new Complex(3,4);
//Complex對象具備按照數學中複數的習慣表示形式輸出的能力
System.out.println(obj);//輸出:3+41
- 我們可以調用Integer.parseInt()方法将一個字元串轉化為int類型,但當要轉換的字元串不是一個有效的數字時(比如a123),此方法會抛出一個NumberFormatException?要求編寫一個程式,當程式運作時讓使用者從鍵盤上輸入一個字元串,代表考試成績,然後調用Integer.parseInt()方法将其轉換為int類型,并給出是否通過的提示,控制台互動過程如下:
- 請輸入您的考試成績:76
- 恭喜您通過了考試
由于無法控制使用者的輸入,是以會出現兩種情況
- 使用者輸入一個無法轉換為int的字元串;
- 使用者輸入的數字不在[0-100]區間内。
請設計一個自定義的異常類InvalidScoreException,當出現上述異常情況時抛出此異常對象。要求程式運作時,對使用者的錯誤輸入能給以明确的提示。
首先,自定義異常處理類InvalidScoreException,代碼如下:
然後,當使用者輸入了一個無法轉換為int類型的字元串或使用者輸入的數字不在[0,100]區間内時抛出自定義異常InvalidScoreException,代碼如下所示:
- 設計一個類,實作如下圖所示的狀态機?
提示:上圖說明,當使用new關鍵字建立此類對象時,對象居于Created狀态(這是初始狀态),這時,調用對象的open()方法,對象轉換到Opened狀态,再調用對象的close()方法,對象轉入"Closed"狀态,這是終止狀态
- 一個圖書管理系統的面向對象設計方案如下圖所示。
Book代表書,有Name(書名)、Author(作者名)、Price(單價)和IsBorrowed(是否被借出)四個屬性。
類Library代表圖書館,其内部字段books用于儲存圖書館中所有的書。它的FindBook()方法依據書名查找同名的書(可能有多本),另一個GetAllBooks()方法擷取圖書館所有的詳細資訊
類Reader代表讀者,Name字段代表其姓名,讀者可以ReturnBook(還書)和BorrowBook(借書)
請編寫完成以下工作:
- 用java程式設計實作上述三個類。
- 在main()方法中書寫以下的測試代碼:
- 建立一個Library類的執行個體myLittleLibrary,其中預存3本書
- Java程式設計,張三著,45元
- Java核心技術,李四著,50元。
- Java程式設計,王五著,38元
- 顯示圖書館中所有圖書的資訊,輸出樣例如下
- Java程式設計,張三著,45元,可借
- Java核心技術,李四著,50元,可借
- Java程式設計,王五著,38元,未還
- 建立一個Reader類的執行個體oneBeautifulGirl,她先在myLittleLibrary中查找《Java程式設計》
- oneBeautifulGirl借了張三著的那本書,現在顯示圖書館中所有圖書的資訊。
- oneBeautifulGirl把書還了,再次顯示圖書館中圖書的資訊。
注意:在滿足題目要求實作功能的前提下,你可以依據自己的考慮修改系統設計方案(比如給某個類添加或修改類的方法,甚至是添加新的類)
- 讀取txt檔案内容
- 檔案内容大緻如下:
- 00001 張三 計算機系 男
- 00002 李四 外語系 女
- 讀取檔案後對内容進行整合,按院系分類輸出,格式為:
- 計算機系
- 00001 張三 男…
- 外語系
- 00002 李四 女…
- 檔案内容大緻如下:
- 采用Java多線程技術(wait和notify),設計實作一個符合生産者和消費者問題的程式,對一個對象(槍膛)進行操作,其最大容量是20顆子彈,生産者線程是一個壓入線程,它不斷向槍膛中壓入子彈;消費者線程是一個射出線程,它不斷從槍膛中射出子彈?
- 寫一個線程,每隔10秒鐘标準輸出到螢幕一個"hello world"列印10此以後退出。
- 下面兩個方法有什麼差別?
public synchronized void method(){}
public void method2(){
synchronized(obj){}
}
- 如何取1970到現在的毫秒數?
- 如何格式化日期?
- 給SomeInputStream類的skip函數添加Java注釋,需要添加函數本身功能(流指針向後偏移指定長度),作者(答題者姓名),異常,參數,函數傳回,函數定義最早出現的版本。
答案:
- 有數組[5,0,-5,2,-4,5,10,3,-5,2,-4,3,4,9,1],請寫出代碼輸出每個數的頻率數(正負數算一個數),如下面結果
- 5出現4次
- 0出現1次
- 請寫出一個Test類包含divide方法,該方法實作兩個整數相除精确傳回四舍五入到百分位的數值。
- 将某網頁評論送出給背景的字元串str中,如果包含有"\", "<", ">" , "=" 四中符号的,過濾掉以後放置系統被執行惡意代碼,寫出Java代碼。
- 現在給你一個新一代的身份證号,預設為18位号碼:如果該号碼是15位的話,請在第6位後面加上19,并在末尾加上x;如果是18位則保持不變。
- 編寫一個方法:一個字元串數組String s[]={"A","B","C","D","E","F"},請随機生成一個數,比如:生成的數為2,則輸出數組中随機兩個元素的組合B、E或者A、C等;生成數為3,就為是哪個随機元素組合。
- 請編寫一個對于Java例外處理的完整的程式。
首先建立自定義異常類NotNumberException,該異常可以在某個字元串不為數字組成的情況下抛出,代碼如下。
然後,建立類ExceptionDemo,在類中添加parseInt方法,該方法使用者将字元串轉換成整數類型,當該字元串不是由數字組成時,使用throw抛出上面自定義異常NotNumberException,并且在方法聲明處,使用throws聲明抛出該異常,然後在main方法中調用parseInt方法時,使用try-catch處理異常,代碼如下。
- 編寫自定義異常,處理輸入字元串abc抛出異常,其他不抛出。