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.
_
翻譯:防御性編程是防御性設(shè)計(jì)的一種形式,它能夠保證軟件產(chǎn)品在不可預(yù)測(cè)的環(huán)境中持續(xù)運(yùn)行。
我們可以看到,防御性編程只是防御性設(shè)計(jì)的分支,對(duì)于防御性設(shè)計(jì),可以布滿我們生活的任何角落,尤其是設(shè)計(jì)行業(yè)和制造業(yè),因此,理解和應(yīng)用防御性編程,讓我們更好地懂得“防御”,也能將其應(yīng)用于自己的生活。
防御性編程的重要思想[2]
所有的外部因素(輸入?yún)?shù)、環(huán)境變量、上下文)都是“邪惡”的,都存在著企圖摧毀程序的罪惡本源,為了抵制它,我們要在程序中處處檢驗(yàn),滿地設(shè)卡,不滿足條件就不再執(zhí)行后續(xù)程序,以保護(hù)主程序的正確性
簡(jiǎn)單來(lái)說(shuō)就是,不管別人如何使用程序,它都能做出相應(yīng)的處理,因此我們需要預(yù)測(cè)可能出現(xiàn)的錯(cuò)誤并阻止它。
注意,不要濫用Defensive Programming,這可能讓你的程序消耗過多資源,犧牲本不必犧牲的性能(可以在文章最底部的參考資料中進(jìn)一步學(xué)習(xí))。
JDBC代碼示例
防御性編程在Java異常中的應(yīng)用情況
例如使用JDBC連接云端Mysql的時(shí)候,可能會(huì)斷網(wǎng)導(dǎo)致無(wú)法連接,這個(gè)時(shí)候,連登錄賬戶都不行,就需要用戶
給出示例代碼,注釋已經(jīng)足夠清楚,不再過多解釋(代碼是基于簡(jiǎn)單的控制臺(tái)程序)
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;/*** 執(zhí)行連接數(shù)據(jù)庫(kù)操作的類** <p>* 創(chuàng)建日期:2020-08-04 20:44** @author 作者* @version 1.0.0* @since 1.0.0*/public class DatabaseOperating {/*** 供其他程序連接數(shù)據(jù)庫(kù)使用** <p>* 方法保證了返回值一定是非空的 Connection對(duì)象* </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("恭喜您,網(wǎng)絡(luò)連接成功!");}return connection;}System.out.println("是否嘗試重新連接?");System.out.println("1. 是 2. 否");Scanner scanner = new Scanner(System.in);System.out.print("請(qǐng)輸入序號(hào):");int choose = scanner.nextInt();if(choose != 1){break;}}if (i == 5) {System.err.println("超過重連次數(shù),請(qǐng)聯(lián)系相關(guān)運(yùn)營(yíng)商檢查您的網(wǎng)絡(luò)!");}for (int j = 5; j > 0; j--) {System.err.print("\r" + j + "秒后將自動(dòng)退出程序");Thread.sleep(1000);}System.err.print("\r程序退出!");System.exit(0);return null;}/*** 連接本地(或云端)的Mysql數(shù)據(jù)庫(kù)** @return Connection實(shí)例*/private static Connection createDatabase() throws InterruptedException {try {String url = "jdbc:mysql://主機(jī):端口/數(shù)據(jù)庫(kù)";String user = "用戶名";String password = "密碼";return DriverManager.getConnection(url, user, password);} catch (CommunicationsException communicationsException) {System.err.println("網(wǎng)絡(luò)連接錯(cuò)誤!");return null;} catch (SQLException throwable) {// throwable.printStackTrace();System.err.println("遠(yuǎn)程服務(wù)器連接失敗");for (int i = 5; i > 0; i--) {System.err.print("\r" + i + "秒后將自動(dòng)退出程序");Thread.sleep(1000);}System.err.print("\r程序退出!");System.exit(0);}return null;} }方法的調(diào)用,能夠保證,connection一定不是null,也就能夠保證后面的一些步驟避免一些問題,例如NullPointerException。
舉例如下(部分代碼):
String sql = "sql語(yǔ)句";try (Connection connection = DatabaseOperating.createDatabaseLink();PreparedStatement preparedStatement = connection.prepareStatement(sql) ) {// <代碼部分> } catch (SQLException | InterruptedException throwable) {throwable.printStackTrace(); }思考點(diǎn)
以下是我的思考,對(duì)于初學(xué)者,我想暫時(shí)我暫時(shí)沒有必要花精力于此處,目前這些也沒有搜集專業(yè)資料,僅供思考,這一小節(jié)可以忽略掉。
參考資料
[1] Wikipedia: Defensive Programming
[2] 防御性編程的核心思想
總結(jié)
以上是生活随笔為你收集整理的JDBC 防御性编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 永劫无间体力是什么
- 下一篇: 【计算机思维】面向人的开发 站在巨人的