java代碼小tips記錄

最近寫java代碼學到的一些point,主要是我在公司實習的時候,本身碰到的一些問題,總結一下。會持續更新。html

1.知識點

1.解決dao層頻繁訪問數據庫問題

問題:日常寫java的都常常會有功能點:service.getElementByID(id),之前我在寫的時候,好比從前端接收到對象的list-》根據list中某個對象的id查詢數據庫的某張表的其餘屬性name-》第一反應是直接for循環遍歷獲取對象id,而後根據id調用service中的getnameByID方法。前端

這個作法其實是能夠的,可是若是數據量很大的狀況下,屢次訪問數據庫IO消耗巨大。

複製代碼

解決:先select * from 數據中的某張表A,獲取所有須要的數據,而後把你須要查找的一列name與ID一一對應存入map。而後for循環list中的id時,直接從map中查找。java

這樣操做的話就至關於只訪問了一次數據庫。同時由於map的get操做的時間複雜度在理想的狀況下爲O(1)。
複製代碼

代碼程序員

//定義map list爲一次從數據庫獲取全部數據
    Map<String,Object> map = new HashMap<>();
    List<Object> lists = service.findAll();
    if(lists!=null && !lists.isEmpty()){
        //將list中全部數據存入map
        lists.forEach(bean->{
            map.put(bean.getID(),bean);
        });
    }
    //在操做的時候,若是map中存在對應的key,直接get
   if(map.containsKey(bean.getID()) ){
          System.out.println(bean.getName());          
    }


複製代碼

2.異常捕捉

2.0 異常關鍵詞

異常關鍵字
1:try catch
try catch是這之間所包含的代碼若是出現異常時捕獲他,並進行處理的,若是代碼之間有錯誤,不會影響程序繼續執行下去,程序會繼續日後執行。
2:throw
是在程序中明確拋出引起的異常,好比throw new Exception();
3:throws
代表方法可能會引起異常,在方法內部並不處理這個異常,想要獲得異常的話,調用者使用try catch語句便可獲得
4:finally
無論有沒有異常程序段中都會被執行的代碼 
複製代碼

2.1 for循環異常捕捉

問題:其實咱們在學校本身作項目的時候,幾乎不會去主動catch異常,不少異常狀況都不能很規範的考慮到。而在公司中業務則要求:某一個塊碰到什麼問題,必定要以日誌的形式打印出來,碰到什麼異常捕獲並返回jsonMap說明異常狀況。面試

解決:養成異常捕獲的習慣。數據庫

站在用戶的角度去思考業務,而不是站在代碼的角度。
複製代碼

咱們在寫一個業務的時候, 不要理所固然的以爲按照咱們的邏輯是不會出現問題的,可是用戶是小白,他們在操做的時候不徹底按照咱們的邏輯。json

代碼後端

private Map<String,Object> getRes(String A) {
        Map<String, Object> jsonMap = new HashMap<>();
        try {
            List<Object> a = service.getByA(A);//這個方法可能拋異常
            Map<String, Object> map = new HashMap<>();
            for(Object p:a){
                if(StringUtils.isBlank(p.getBootStatus())){
                    continue;//過濾異常狀況,避免拋異常
                }
                if(StringUtils.isNotBlank(p.getId())&&StringUtils.isNotBlank(p.getIp())){
                    map.put(p.getName(),p.getIp());
                }
            }
            jsonMap.put("success", true);
            jsonMap.put("data",map);
        } catch (Exception e) {
            jsonMap.put("success", false);
            jsonMap.put("errorMsg", "A = " + A + " 訪問 api 發生異常!");
            log.error("exception:{} ",e);
        }
        return jsonMap;
    }
複製代碼

備註:對於異常的處理,不少公司都會比較重視。api

  • 某次面試,被面試官問:用過或者遇到過哪些異常?

對於我來講,常見的異常有NullPointerException,ArrayIndexOutOfBoundsException,SQLException,IOException。bash

2.2 新建一個異常類

偶然看到一段代碼是本身自定義的異常,不明白爲何須要本身定義異常而且拋異常?因此去查閱了一些資料。

爲何要自定義異常
大的項目業務線比較多,不一樣功能模塊的異常類型不同,若是不自定義的區分的話,對於捕獲異常來就沒有區別性。全部通常業務中不一樣場景拋不一樣的異常,便於統一捕捉而且根據類型作進一步的處理。 可是自定義異常通常會增長工做量,須要本身權衡是否自定義異常類。

如何自定義異常類

//1.自定義異常類:繼承RuntimeException(運行時異常) 或 Exception
public class MyException extends Exception { 
  private static final long serialVersionUID = 1L; 
  // 提供無參數的構造方法
  public MyException() { 
  } 
  // 提供一個有參數的構造方法,可自動生成
  public MyException(String message) { 
    super(message);// 把參數傳遞給Throwable的帶String參數的構造方法 
  } 
} 
//2.拋異常類
public class CheckScore { 
  // 檢查分數合法性的方法check() 若是定義的是運行時異常就不用拋異常了 
  public void check(int score) throws MyException {// 拋出本身的異常類 
    if (score > 120 || score < 0) { 
      // 分數不合法時拋出異常 
      throw new MyException("分數不合法,分數應該是0--120之間");// new一個本身的異常類 
    } else { 
      System.out.println("分數合法,你的分數是" + score); 
    } 
  } 
} 

//3.捕獲異常
import java.util.Scanner; 
 
/* 
 * 自定義的異常測試類 
 */ 
public class Student { 
  public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 
    int score = sc.nextInt(); 
    CheckScore check = new CheckScore(); 
    try { 
      check.check(score); 
    } catch (MyException e) {// 用本身的異常類來捕獲異常 
      e.printStackTrace(); 
    } 
  } 
 
} 

複製代碼

備註: 異常分類方便捕捉不一樣的異常類型,並進行對應的操做。在稍微複雜的業務系統中,僅僅使用Java自身的異常類是不夠的,好比常見的NPE/IAE等。

  1. 有時候須要對參數進行各類檢查,NPE不足以清晰的說明異常的具體內容。好比有多個參數,對每一個參數進行自定義的校驗規則,能夠經過IAE(message: String)來讓調試過程更加友好。
  2. 自定義參數,好比數據解析異常,可能中間多處可能拋出,這裏能夠定義一個MyParseException,針對此類異常一般使用相同的善後操做。
  3. 自定義異常能夠定義層次結構,即某個業務系統中的全部異常統一頂一個根類,而後再定義一些子類異常,分類進行鍼對性的操做。好比定義一個MyRootException,而後對網絡通訊解析的異常MyParseException,對數據訪問的異常MyDataException等,這些異常都表明了不一樣的類型,操做句柄也都是不同的。

參考連接:www.cnblogs.com/yanggb/p/10…

3.@Value註解使用

做用:讀取配置文件的屬性
註解方式

定義(map類型): 
    property.key = {"A":"a","B":"b"}   
 使用:
    @Value("#{${property.key}}")
    private Map<String, String> propertykey;
    
    propertykey.get(A);
複製代碼

2.開發工具

1.mybatis-generator

這是一款逆向工程工具,針對數據庫表自動生成mybatis執行所須要的代碼,通常有三種用法:命令行,eclipse插件,maven插件。比較通用的就是maven插件。
具體使用方法比較常見:
(1)在pom.xml導入依賴的包
(2)generatorConfig.xml文件
(3)IDEA中直接點擊插件執行

至此,其中的pojo dao mapper xml等文件都會自動生成。
想起之前搭建框架的時候,每次都是手動建立

2.postman測試工具

上手仍是很快的,對於接口測試很是有用

3.IDEA debug

debug的一方面是爲了調試代碼,找到問題。另外一方面也能夠幫助咱們理解新代碼。
做爲一個實習生,剛到公司,每次寫一個業務以前,必定是要熟悉別人的代碼。而熟悉代碼最快路徑第一步是找一個接口測試這個功能點,第二步是在代碼中打斷點調試,看每一個函數調用的返回值的變化。

1.斷點儘可能打在有返回值的語句、if斷定條件語句
2.F9跳轉斷點,快捷。代碼修改以後,可重複發送請求繼續調試
3.80%的問題均可以用debug解決
複製代碼

4.熱部署Jrebel

這是一個很是實用的後端項目熱部署插件。由於idea沒有集成熱部署工具,因此只能安裝插件使用,可讓你效率加倍。衆所周知,Spring項目若是很大的話,每修改一點代碼就要重啓Tomcat,耗時長。

n.總結

  • 公司的大佬仍是不少的,某天看到小組老大寫的代碼,驚歎:這就是架構師和程序員的區別啊!! 好好學習。
相關文章
相關標籤/搜索