細細講述Java技術開發的那些不為人知的規則

来源:https://www.cnblogs.com/Java-no-1/archive/2019/07/23/11234577.html
-Advertisement-
Play Games

本文介紹的Java規則的說明分為3個主要級別,中級是平時開發用的比較多的級別,在今後將陸續寫出其他的規則。遵守了這些規則可以提高程式的效率、使代碼又更好的可讀性等。 一、在finally方法里關掉input或者output資源 方法體裡面定義了input或者output流的話,需要在finally里 ...


本文介紹的Java規則的說明分為3個主要級別,中級是平時開發用的比較多的級別,在今後將陸續寫出其他的規則。遵守了這些規則可以提高程式的效率、使代碼又更好的可讀性等。

一、在finally方法里關掉input或者output資源

方法體裡面定義了input或者output流的話,需要在finally裡面把它關掉。以下這幾種調用不需要遵守這條規則,因為colse()方法不起作用:

java.io.StringWriter 
java.io.ByteArrayOutputStream 
java.io.ByteArrayInputStream

如果再方法返回的時候沒有調用close()方法來釋放input()和output()的資源的話,會導致一個系統資源泄漏。而且在任何情況下都要確定在返回全調用了close()方法,包括出現異常的時候。所以需要在finally方法裡面加入這個方法。這樣就保證了在任何情況下都會關閉資源。

錯誤示例:

public class CIO 
{
    public void method (java.io.File f)
    {
        java.io.FileInputStream fis = null;
        try 
        {
            fis = new java.io.FileInputStream (f);
            fis.read ();
            fis.close ();
        }
        catch (java.io.FileNotFoundException e1)
        {
            System.out.println("File not found");
        }
        catch (java.io.IOException e2) 
        {
            System.out.println("I/O Exception");
        }
        // 如果出現異常,這裡就不能保證關閉資源。
    }
}

修正後的代碼:

public class CIOFixed
{
    public void method (java.io.File f)
    {
        java.io.FileInputStream fis = null;
        try {
            fis = new java.io.FileInputStream
            (f);
            fis.read ();
        }
        catch (java.io.FileNotFoundException e1)
        {
            System.out.println("File not found");
        }
        catch (java.io.IOException e2) 
        {
            System.out.println("I/O Exception");
        }
        finally
        {
            if (fis != null)
            {
                try 
                {
                    fis.close ();
                }
                catch (java.io.IOException e) 
                {
                    System.out.println("I/O Exception");
                }
            }
        }
    }
}

二、else的註意問題

一般總認為如果if語句只有一句的話,那麼{}就是可要可不要的了。可是如果if有else嵌套的話,就不一樣了,{}是必需的

錯誤示例:

if (i < 5) 
if (i < 2)
i++; else
i--;

修改後:

if (i < 5) 
{
    if (i < 2)
    i++;
} else 
{
    i--;
}

三、不要再catch()塊里什麼代碼也不放

在catch()塊裡面放入一些錯誤處理代碼是一個好的習慣。但是如果catch()裡面有有關javadoc 的代碼,那也是可以的。

錯誤示例:

try {
    System.in.read ();
}
catch (java.io.IOException e) 
{
    // 錯誤
}

正確:

try {
    System.in.read ();
}
catch (java.io.IOException e) 
{
    System.out.println("Descriptive error");
}

四、不要在if條件裡面附值

如果這樣做的話,系統會報告錯誤。在java的很多條件聲明裡面用附值是很不明智的,而且系統也會報告錯誤。很容易引起異常。遵守這條規者能夠使維護簡單,避免不一致。

錯誤示例:

if (b = true)
正確的:
if (b == true)

五、for語句需要迴圈體。

如果沒有{}的話,for語句只會執行一次!錯誤示例:

for (i = 0; i < 10; i++);
System.out.println (i);

這裡print() 只會執行一次。正確:

for (i = 0; i < 10; i++) 
{
    // FIXED
    System.out.println (i);
}

六、不要把方法定義成main()

在java里,main()方法是一個特別的方法。所以在自己定義方法的時候不要定義這樣的名字,以免引起混擾。

七、不要直接或者間接的定義'Error'和'Throwable'的子類

java.lang.Error只在JVM出現反常的時候覆蓋這個方法,如果你定義了直接或者不直接的類繼承了類'Error',也就指出了這個錯誤是JVM內部的,而不是這個類的。所以對於java編譯器來說是不可見的,這樣就不能檢查錯誤的異常處理了。

java.lang.Throwable'是'java.lang.Exceptionjava.lang.Error的上級類,用戶如果象定義異常類的話應該繼承java.lang.Exception

錯誤示例:

public class ABC extends Error
正確:
public class ABC extends Exception

八、有關"switch"語句裡面的"case"問題

最好在每一個 “case”里都定義一個”return”或者“break”來控制不要走到下麵的

“case”里去。如果一個”case”語句在代碼的最後沒有一個”break”或者”return”句,程式就會走到下一個”case”。如果這個”case”是最後一個的話,那就沒什麼問題,如果後面還有”case” 的話,看起來就不太安全了。

錯誤示例:

switch (i) {
    case 1:
    x = 10;
    break;
    case 2: 
    x = 20;
    default:
    a = 40;
    break;

正確:

switch (i) {
    case 1:
    x = 10;
    break;
    case 2: // VIOLATION
    x = 20;
    break;
    default:
    x = 40;
    break;

九、建議不要使用'System.getenv ()'

不建議使用'System.getenv()',這個方法看起來很好用,不過並不是所有的系統都有環境變數的。不用這個方法也可能帶來一些不方便。

錯誤示例:

void method (String name) 
{
    System.getenv (name);
    // 可以用其他方法來代替
}

如果不用這個方法,我們可以用其它的方法來代替。比如:'System.getProperty()’,'getTypeName ()'等,這也可以找到java的系統屬性。

十、不要使用’\n’或者'\r'來分行

這兩個標記看來很普遍,特別是’\n’。我們經常用來作為分行用。但是不同的系統用不同的分行字元,所以這些字元在某些意義上違背了java的平臺無關性。

錯誤示例:

System.out.println("Hello\n" + name);
我們可以用其它的一些方法來代替,比如println(),這個方法在不同的系統平臺上都起到相同的作用。後者推薦大家用這個方法:
System.getProperty("line.separator")

十一、使所有的內部類"private"

Java允許一個類包含另外一個類,帶是Java byte code沒有這個概念。類被編譯器解釋成package-private類。從更深的程度來說,包含類的任何內部私有對象能被內部類訪問的也能被同一個包內的其他類訪問。

錯誤示例:

public class INNER 
{
    class INNER_Class 
    {
        void setValue(int i)
        {
            _value = i;
            // 現在包就可以訪問了
        }
    }
    private int _value;
}

所以需要加上private class INNER_Class

十二、不要使介面序列化

如果一個位元組數組包含了一個被序列化的對象。攻擊者就能讀到這個對象的內部狀態合欄位(包括private的)。

錯誤示例:

public interface sample extends
java.io.Serializable

 

————END————


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 手把手教你破解文件密碼、wifi密碼、網頁密碼 1、破解文件密碼: 有時候我們在網上下載一個壓縮包後,必須要關註或者支付一定費用才給你解壓密碼,實屬比較噁心。在這裡手把手叫你實現破解文件解壓密碼。 1、首先我們要導入模塊拿到能解壓的文件包 1 import zipfile 2、拿到你需要解壓的文件( ...
  • 一、 1.連續列印舉例 #打開文件,三個字元一組讀出來內容,然後顯示在屏幕上,每讀一次,停一秒 2.tell函數 (1)用法:用來顯示文件讀寫指針的當前位置 (2)格式:文件.tell() (3)舉例: (4)註意:上面的例子說明瞭:tell返回數字的單位是byte;read是以字元為單位的 3.文 ...
  • 第十章 實戰:ELK日誌分析系統 ElasticSearch、Logstash、Kibana簡稱ELK系統,主要用於日誌的收集與分析。 一個完整的大型分散式系統,會有很多與業務不相關的系統,其中日誌系統是不可或缺的一個,集中式日誌系統需要收集來自不同服務的日誌,對它進行集中管理存儲以及分析。ELK就 ...
  • Java中鎖的概念 自旋鎖 : 是指當一個線程在獲取鎖的時候,如果鎖已經被其他線程獲取,那麼該線程將迴圈等待,然後不斷判斷鎖是否能夠被成功獲取,直到獲取到鎖才會退出迴圈。 樂觀鎖 : 假定沒有衝突,在修改數據時如果發現數據和之前獲取的不一致,則讀最新數據,修改後重試修改 悲觀鎖 :假定會發生併發衝突 ...
  • 一、 函數list (1)定義:用打開的文件作為參數,把文件內的每一行內容作為一個元素 (2)格式:list(文件) (3)例子: 2.函數read (1)作用:按照字元進行讀取文件內容 (2)格式:文件.read(數字) 如果數字預設,那麼代表把所有的字元全都讀出來;如果裡面含有數字那麼代表一次性 ...
  • 9.9 線程理論 1、什麼是線程 線程指的是一條流水線的工作過程 進程根本就不是一個執行單位,進程其實是一個資源單位,一個進程內自帶一個線程,線程才是執行單位 2、進程VS線程 同一進程內的線程們共用該進程內資源,不同進程內的線程資源肯定是隔離的 創建線程的開銷比創建進程要小的多 同一進程內的線程們 ...
  • 本文介紹如何利用Python+uiautomator2 每日自動賺取支付寶積分。 支付寶的積分有啥用?誘惑誘惑你: 可以兌換視頻網站的VIP會員。 可以兌換各種優惠券。 可以在年底活動中兌換蘋果手機。 其他,一言難盡... 比如,我喜歡買知識課堂的課程。(知識付費時代,我用積分買知識) 好了,有了動 ...
  • 一、 cookie 1. 定義:保存在瀏覽器本地上的一組組鍵值對 2. 特點: 由伺服器讓瀏覽器進行設置的 瀏覽器保存在瀏覽器本地 下次訪問時自動攜帶 3. 應用: 登錄 保存瀏覽習慣 簡單的投票 4. 使用cookie的原因:因為HTTP是無狀態的,用cookie來保存狀態 5. 在django中 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...