JDBC 防御性編程

防御性編程(Defensive Programming)

什么是Defensive Programming[1]

原文:Defensive programming is a form of defensive design intended to ensure the continuing function of a piece of software under unforeseen circumstances.
_
翻譯:防御性編程是防御性設計的一種形式,它能夠保證軟件產品在不可預測的環境中持續運行。

我們可以看到,防御性編程只是防御性設計的分支,對于防御性設計,可以布滿我們生活的任何角落,尤其是設計行業和制造業,因此,理解和應用防御性編程,讓我們更好地懂得“防御”,也能將其應用于自己的生活。

防御性編程的重要思想[2]

所有的外部因素(輸入參數、環境變量、上下文)都是“邪惡”的,都存在著企圖摧毀程序的罪惡本源,為了抵制它,我們要在程序中處處檢驗,滿地設卡,不滿足條件就不再執行后續程序,以保護主程序的正確性

簡單來說就是,不管別人如何使用程序,它都能做出相應的處理,因此我們需要預測可能出現的錯誤并阻止它。

注意,不要濫用Defensive Programming,這可能讓你的程序消耗過多資源,犧牲本不必犧牲的性能(可以在文章最底部的參考資料中進一步學習)。

JDBC代碼示例

防御性編程在Java異常中的應用情況

  1. 當程序產生異常,對后面的影響不大(視情況,看模塊獨立性),則只需拋出異常并繼續執行
  2. 若程序產生異常,導致后面都不能執行,那就只能回滾重新執行,或者退出程序了

例如使用JDBC連接云端Mysql的時候,可能會斷網導致無法連接,這個時候,連登錄賬戶都不行,就需要用戶

  1. 要么嘗試重新連接
  2. 要么退出程序

給出示例代碼,注釋已經足夠清楚,不再過多解釋(代碼是基于簡單的控制臺程序)

package FinancialSystem.UsualFunction;import com.mysql.cj.jdbc.exceptions.CommunicationsException;import javax.xml.crypto.Data;
import java.net.UnknownHostException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Time;
import java.util.Scanner;/*** 執行連接數據庫操作的類** <p>* 創建日期:2020-08-04 20:44** @author 作者* @version 1.0.0* @since 1.0.0*/public class DatabaseOperating {/*** 供其他程序連接數據庫使用** <p>*     方法保證了返回值一定是非空的 Connection對象* </p>** @return Connection Object* @throws InterruptedException*/public static Connection createDatabaseLink() throws InterruptedException {Connection connection;int i = 0;for (; i < 5; i++) {connection = DatabaseOperating.createDatabase();if (connection != null) {if(i != 0){System.out.println("恭喜您,網絡連接成功!");}return connection;}System.out.println("是否嘗試重新連接?");System.out.println("1. 是   2. 否");Scanner scanner = new Scanner(System.in);System.out.print("請輸入序號:");int choose = scanner.nextInt();if(choose != 1){break;}}if (i == 5) {System.err.println("超過重連次數,請聯系相關運營商檢查您的網絡!");}for (int j = 5; j > 0; j--) {System.err.print("\r" + j + "秒后將自動退出程序");Thread.sleep(1000);}System.err.print("\r程序退出!");System.exit(0);return null;}/*** 連接本地(或云端)的Mysql數據庫** @return Connection實例*/private static Connection createDatabase() throws InterruptedException {try {String url = "jdbc:mysql://主機:端口/數據庫";String user = "用戶名";String password = "密碼";return DriverManager.getConnection(url, user, password);} catch (CommunicationsException communicationsException) {System.err.println("網絡連接錯誤!");return null;} catch (SQLException throwable) {// throwable.printStackTrace();System.err.println("遠程服務器連接失敗");for (int i = 5; i > 0; i--) {System.err.print("\r" + i + "秒后將自動退出程序");Thread.sleep(1000);}System.err.print("\r程序退出!");System.exit(0);}return null;}
}

方法的調用,能夠保證,connection一定不是null,也就能夠保證后面的一些步驟避免一些問題,例如NullPointerException

舉例如下(部分代碼):

String sql = "sql語句";try (Connection connection = DatabaseOperating.createDatabaseLink();PreparedStatement preparedStatement = connection.prepareStatement(sql)
) {// <代碼部分>
} catch (SQLException | InterruptedException throwable) {throwable.printStackTrace();
}

思考點

以下是我的思考,對于初學者,我想暫時我暫時沒有必要花精力于此處,目前這些也沒有搜集專業資料,僅供思考,這一小節可以忽略掉

  1. JDBC不應該使用一個具備大量的MySQL賬戶,這是危險的,我們應該分配多個具備專門權限的賬戶,去處理不同的信息。
  2. 不應該使用明碼表示MySQL賬戶,如果那樣的話,使用逆向工程,很容易被找到和破解,這樣不太安全,例如,可以將賬戶存在隱秘的地方以密碼傳輸,在程序中解碼;又或者使用低等權限賬戶登錄數據庫,從數據庫獲取具備操作權限的賬戶信息,再用該賬戶登錄數據庫。

參考資料

[1] Wikipedia: Defensive Programming

[2] 防御性編程的核心思想

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384692.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384692.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384692.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Java】異常處理的目的

編程思維&#xff1a;Defensive Programming 我們寫好程序&#xff0c;將其打包&#xff0c;然后用戶就可以使用和運行&#xff0c;但是&#xff0c;外界的情況是未知的&#xff0c;我們的程序很可能因為某個因素的出現而崩潰&#xff0c;因此&#xff0c;對于我們可以預測到的…

【Coursera】Getting Started with Python:Week One - Reading: Welcome to The Class

原文 & 翻譯 Reading: Welcome to The Class Welcome to Getting Started with Python, the first class in our Python for Everybody Specialization. We have built this class specifically for those with no prior programming experience. With a relatively simpl…

【Java】獲取目錄及其子目錄文件的相關事宜

獲取目錄及其子目錄文件的代碼 public class Main {public static void main(String[] args) {String path "D:/"; File f new File(path);Main.getFile(f);}public static void getFile(File file){if(file ! null){File[] f file.listFiles();if(f ! null){for…

【計算機思維】面向人的開發 站在巨人的肩膀上

思維轉變&#xff1a;使用其他程序員開發的“黑箱”&#xff0c;不要重復造輪子 以Java舉例&#xff0c;從常用的集合框架開始&#xff0c;我們要產生新的思維轉變了&#xff0c;我們已經學會了基本的功能&#xff0c;但是在真正開發的時候&#xff0c;用基礎功能去做開發效率…

【Computer Organization】The Core Design Thinking of single cycle CPU

1 Overview This section introduces someting that maybe you need to know before learning. Note:This CPU is based on MIPS instruction set. 1.1 Tools LogisimCS 3410 ComponentsMARS MIPS simulatorWin10 or Mac OS 1.2 Courses 自己動手畫CPU《計算機組織與結構實…

【匯編語言】王爽 - 內中斷復習

0 前言 基于王爽《匯編語言》和Coursera的《計算機組成》課程。 1 中斷分類 CPU在執行指令的過程中&#xff0c;產生了一個異常/中斷&#xff0c;因為CPU只能同時執行一條指令&#xff0c;所以需要暫停該指令的執行&#xff0c;轉而去處理異常/中斷信息。 這個異常可以來…

【算法】蠻力法/窮舉法/枚舉法 的基本問題分析

炮兵問題的優化&#xff0c;設立邏輯數組 蠻力法設計思想 有策略地窮舉 驗證 制定窮舉策略避免重復 簡單來說&#xff0c;就是列舉問題所有可能的解&#xff0c;然后去看看是否滿足題目要求&#xff0c;是一種逆向解題方式。&#xff08;我也不知道答案是什么&#xff0c;…

如何高效學習算法【實例 + 可視化】

對于初學者來說&#xff0c;學習算法&#xff0c;不應該先學習抽象的理論&#xff0c;那樣沒有感覺&#xff0c;越學越暈&#xff0c;應該&#xff1a; 有具體的例子有可視化過程 同時需要結合理論知識對照學習&#xff0c;理論扎實、實踐有效&#xff0c;同時要有結果反饋。…

【計算機網絡實驗·北航】實驗一:網絡實驗入門(1)

1.3 遠程在線環境使用 PCA、PCB、PCC和PCD&#xff1a;4臺PC機S1、S2&#xff1a;2臺交換機R1、R2&#xff1a;2臺路由器中間的設備&#xff1a;組網連線器 遠程組網連線&#xff1a; 使用PCA上的組網連線軟件&#xff0c;配置組網連線器&#xff0c;實現組網連線。 PCA和PCB…

【C++】int與string轉換

頭文件&#xff1a;<string>&#xff0c;注意&#xff0c;這與<string.h>、<cstring>不是一回事兒語法&#xff1a;int x to_string(str)&#xff0c;其中string str "1"。

【C++】rand函數的基本使用

rand()函數用于生成偽隨機數&#xff0c;每次生成的隨機數都不變&#xff0c;方便我們調試程序。 重要是的隨機數的范圍公式&#xff08;適用整數&#xff09; 公式&#xff1a; 確定范圍加偏移量 例如&#xff1a;a和b是整數 [a,b]&#xff0c;范圍是b - a 1&#xff0c…

【操作系統】虛擬化CPU、Memory,共享文件

幾個概念 CPU、虛擬CPU進程內存、虛擬地址空間 物理的CPU被OS虛擬成了多個虛擬的CPU&#xff0c;這些虛擬CPU分別運行各自的程序&#xff0c;這些正在運行的程序被稱為進程。物理內存被OS虛擬成了多個虛擬地址空間&#xff0c;每個進程都有獨立的、自己的地址空間&#xff0c;…

【Linux】編譯C語言文件(-o -lpthread)

在gcc中使用-o編譯 對于一個一般的程序&#xff0c;直接使用gcc <C語言文件名> -o <編譯后生成的文件名>即可&#xff0c;例如以下程序&#xff1a; // cpu.c #include <stdio.h> #include <unistd.h> #include <stdlib.h>int main(int argc,…

【Linux】Ubuntu下進行C語言編程

前言 需要您會使用Windows下cd切換目錄的基本命令&#xff0c;否則請先自學相關知識&#xff0c;之后再閱讀本文。 0 基礎命令 介紹最基礎的Linux終端命令。 su - root&#xff1a;切換到root用戶&#xff08;不用也可以&#xff09;ls&#xff1a;查看當前目錄位置cd&…

【Linux】Ubuntu 18下安裝Vim自動補全插件YouCompleteMe(可高速下載安裝)

前言 本文寫于2020年10月&#xff0c;如果你多年后看見這篇文章&#xff0c;方法可能已經失效&#xff0c;但是請牢記&#xff0c;盡量下載你所處時代的最新版本的軟件&#xff0c;會減少很多麻煩。 擺正心態 即便按照本文操作&#xff0c;由于你的系統狀態和我的不一樣&…

【操作系統】進程調度(1):FIFO(先進先出)算法 原理與實踐

0 前言 本文基于書籍《Operating System&#xff1a;Three Easy Pieces》。 中譯本&#xff1a;《操作系統導論》&#xff0c;中譯本質量還可以&#xff0c;但是英文版后來的更新&#xff0c;中文版目前沒有進行同步更新&#xff08;寫下此文的時間是2020年10月&#xff09; 1…

【操作系統】進程調度(2a):SJF(短任務優先) 算法 原理與實踐

0 前言 接上一篇文章&#xff1a;進程調度&#xff08;1&#xff09;&#xff1a;FIFO&#xff08;先進先出&#xff09;算法 原理與實踐 1 前提鋪墊 請參考上一篇文章的前提鋪墊部分&#xff0c;本文與之完全一致。 2 SJF 原理 SJF&#xff08;Shortest Job First&#x…

【操作系統】進程調度(2b):STCF(最短完成時間優先) 算法 原理與實踐

0 前言 接上一篇文章&#xff1a;進程調度&#xff08;2a&#xff09;&#xff1a;SJF&#xff08;短任務優先&#xff09; 算法 原理與實踐 1 前提鋪墊 與上一篇同。 2 STCF 原理 STCF&#xff08;Shortest Time-to-Completion First&#xff09;最短完成時間優先。 2.1…

【操作系統】進程調度(3):RR(輪轉) 算法 原理與實踐

0 前言 接上一篇文章&#xff1a;進程調度&#xff08;2b&#xff09;&#xff1a;STCF&#xff08;最短完成時間優先&#xff09; 算法 原理與實踐 1 前提鋪墊 除了與上一篇相同的&#xff0c;這里介紹新的基礎知識。 1.1 三種類型的程序 計算密集型&#xff08;CPU導向&…

【操作系統】進程調度(4):I/O、不可預測的運行時間

0 前言 上一篇文章&#xff1a;進程調度&#xff08;3&#xff09;&#xff1a;RR&#xff08;輪轉&#xff09; 算法 原理與實踐 1 前提鋪墊 與上一篇同。 2 引入I/O操作 之前我們一直提及的是計算密集型程序&#xff0c;現在我們的程序可以進行I/O交互了&#xff0c;它會…