2016-07-06 87 views
0

作爲客戶端,當我的程序的輸入/輸出發生「不好」事件時,應拋出I/O異常。現在,當我連接到服務器時,我的程序作爲客戶端與上述服務器之間具有輸入輸出關係。因此,如果通信上的某些內容不起作用(某些「不好」),則產生的異常應該是IOException,即SQLException應該擴展IOException。爲什麼SQLException不會擴展IOException?

爲什麼不是這樣?

+2

是什麼讓你認爲任何SQL相關的問題都與IO問題有關? – GhostCat

+1

爲什麼「語法錯誤」是IOException? –

回答

6

因爲SQLException並不總是與IO相關。

例如,如果你編寫了一個錯誤的SQL命令,你將有一個SQLException

這裏是不相關的IO可能的SQLException的非詳盡列表:

  • 不良的SQL語法
  • 錯誤的屬性數字
  • 錯誤的屬性類型
  • 約束衝突
  • 權限問題
  • 重複主鍵
  • 不存在表或列名

javadoc

提供關於數據庫訪問錯誤或其他錯誤信息的異常。

+0

因此,要做到最準確,我們需要多重繼承來指示異常是否是SQL異常和I/O異常,但是我們不能用Java來實現,對吧? – GreenThor

+0

驅動程序是隱藏在客戶端(Java應用程序)和服務器之間的通信中發生的事情的驅動程序。 IOException可能會在較低級別引發,但會被攔截並更改爲SQLException。 –

0

SQL異常不一定是IO異常(例如連接丟失,讀取超時等)。

錯誤的SQL或違反約束條件也會引發SQL異常。

1

因爲SQLException不一定是IOException。它可能是錯誤的語法,格式,... IOException意圖由I/O設備(最初的流,如文件和網絡操作)返回,而不一定是程序的任何輸入/輸出。

+0

「如文件和網絡操作」是不是服務器訪問一個網絡操作? – GreenThor

+1

不一定。你可能有嵌入式數據庫,語法錯誤等。在這種情況下,IO本身沒有任何問題。 IOException實際上意味着處理設備/環境而不是應用程序異常。如果網絡壞了,驅動程序可能會拋出IOException – gusto2

相關問題