Java-07 StringBuilder谴返、異常

StringBuilder

在進行大量字符串改動時(比如拼接、替換)咧织,使用String會非常消耗內(nèi)存嗓袱,降低程序性能,使用StringBuilder可以節(jié)省內(nèi)存习绢,提高程序性能

    String s1 = "";
    s1 += "123";
    s1 += "456";

    StringBuilder s2 = new StringBuilder();
    s2.append("123").append("456");

由于String的不可變性渠抹,所以每次給s1賦值的時候,都是新創(chuàng)建了一個新的對象闪萄,s1指向這個新的對象梧却。所以導致String的性能較差。

  • 注意败去, StringBuilder并不是String的子類放航。不過StringBuilder和String都實現(xiàn)了CharSequence接口

StringBuilder的常用方法有appendinsert,delete圆裕,replace,reverse

StringBuilder的 append原理

StringBuilder的append內(nèi)部使用的是一個動態(tài)數(shù)組广鳍。默認容量是16,當容量滿時吓妆,會對數(shù)組進行擴容赊时。擴容后的新容量是原來容量的2倍加2

 private int newCapacity(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = value.length >> coder;
        // 擴容 左移一位加上2就是新的容量
        int newCapacity = (oldCapacity << 1) + 2;
        if (newCapacity - minCapacity < 0) {
            newCapacity = minCapacity;
        }
        int SAFE_BOUND = MAX_ARRAY_SIZE >> coder;
        return (newCapacity <= 0 || SAFE_BOUND - newCapacity < 0)
            ? hugeCapacity(minCapacity)
            : newCapacity;
    }

異常(Exception)

java中所有的異常最終都繼承自java.lang.Throwable

檢查型異常(Checked Exception)

  • 這類異常一般難以避免,編譯器會進行檢查
    • 如果開發(fā)者沒有處理這類異常行拢,編譯器會報錯
  • 哪些異常是檢查型異常祖秒?
    • 除Error、RuntimeException以外的異常

非檢查型異常(Uncheck Exception)

  • 這類異常一般可以避免,編譯器不會進行檢查
    • 如果開發(fā)者沒有處理這種異常竭缝,編譯器不會報錯
  • 非檢查型異常:Error狐胎,RuntimeException

異常的處理

不管是檢查型異常,還是非檢查型異常歌馍,只有沒有主動處理它,都會導致java程序終止運行

異常的處理有兩種方式

  • try-catch 捕獲異常
  • throws 將異常往上拋
public static void main(String[] args) throws FileNotFoundException {
// 如果沒有處理異常 就會報錯
    FileOutputStream fos = new FileOutputStream("F:/1.txt");
  }
  public static void main(String[] args) {
    Integer[] nums = {11, null, 22};
    for (Integer i : nums) {
      System.out.println(i);
    }
    // 11  null  22
    
    // 這里打印會拋出異常
    for (int i : nums) {
      System.out.println(i);
    }
    // 11
    // Exception in thread "main" java.lang.NullPointerException

  }
  • Integer在自動拆箱為int時晕鹊,會調(diào)用Integer對象的intValue()方法,由于nums[1]為null松却,使用null調(diào)用方法會拋出異常:java.lang.NullPointerException
finally

finally語句中的代碼一定會執(zhí)行

細節(jié): 如果在執(zhí)行try catch時,如果jvm推出或者當前線程被中斷溅话、殺死晓锻,finally可能不會執(zhí)行

  • 如果trycatch中有return飞几、continue砚哆、break等結(jié)束語句,finally會在結(jié)束語句之前執(zhí)行
    try {
      System.out.println("1");
      return;
    } finally {
    // 會在return之前執(zhí)行
      System.out.println("2");
    }
    // 1 2
    for (int i = 0; i < 3; i++) {
      try {
        System.out.println(i + "_try_1");
        if (i == 2) {
          continue;
        }
        System.out.println(i+ "_try_2");
      } finally {
        System.out.println(i+ "_finally");
      }
    }

打印

0_try_1
0_try_2
0_finally
1_try_1
1_try_2
1_finally
2_try_1
2_finally

throws處理異常

我們還可以使用throws來拋出異常屑墨,讓上層來處理異常,如果上層不愿意處理躁锁,也可以繼續(xù)往上拋。

當拋出到jvm還沒有處理時卵史,程序就會退出

  public static void main(String[] args) throws ClassNotFoundException {
    test1();
  }
  static void test1() throws ClassNotFoundException {
    test2();
  }
  // 拋給上層來處理異常
  static void test2() throws ClassNotFoundException {
    Class.forName("Abc");
  }

也可以一部分異常使用try-catch處理战转,一部分使用throws來處理

細節(jié):

  • 當父類的方法沒有throws異常

    • 子類的重寫方法也不能throws異常
  • 當父類的方法有throws異常

    • 子類方法可以沒有throws異常
    • 子類型throws跟父類相同類型的異常
    • 也可以throws父類異常的子類型

throw

使用throw可以拋出一個新建的異常

public class Person {
  private int age;

  public void setAge(int age) throws Exception {
    if (age <= 0) {
      throw new Exception("age 必須大于0");
    } else {
      this.age = age;
    }
  }
}

自定義異常

開發(fā)中自定義異常,基本都是以下兩種做法

  1. 繼承自Exception(檢查型異常)
    • 使用代碼復雜一些
    • 希望開發(fā)者重視這個異常以躯,認真處理這個異常
  2. 繼承自RuntimeException(非檢查型異常)
    • 使用起來比較簡潔
    • 不嚴格要求開發(fā)者去處理這個異常
public class EmptyNameException extends RuntimeException {
    public EmptyNameException(){
      super("name must be not empty");
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末槐秧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子忧设,更是在濱河造成了極大的恐慌刁标,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件址晕,死亡現(xiàn)場離奇詭異膀懈,居然都是意外死亡,警方通過查閱死者的電腦和手機斩箫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門吏砂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人乘客,你說我怎么就攤上這事狐血。” “怎么了易核?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵匈织,是天一觀的道長。 經(jīng)常有香客問我,道長缀匕,這世上最難降的妖魔是什么纳决? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮乡小,結(jié)果婚禮上阔加,老公的妹妹穿的比我還像新娘。我一直安慰自己满钟,他們只是感情好胜榔,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著湃番,像睡著了一般夭织。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吠撮,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天尊惰,我揣著相機與錄音,去河邊找鬼泥兰。 笑死弄屡,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的逾条。 我是一名探鬼主播琢岩,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼师脂!你這毒婦竟也來了担孔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤吃警,失蹤者是張志新(化名)和其女友劉穎糕篇,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酌心,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡拌消,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了安券。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墩崩。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖侯勉,靈堂內(nèi)的尸體忽然破棺而出鹦筹,到底是詐尸還是另有隱情,我是刑警寧澤址貌,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布铐拐,位于F島的核電站徘键,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏遍蟋。R本人自食惡果不足惜吹害,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望虚青。 院中可真熱鬧它呀,春花似錦、人聲如沸棒厘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绊谭。三九已至,卻和暖如春汪拥,著一層夾襖步出監(jiān)牢的瞬間达传,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工迫筑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宪赶,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓脯燃,卻偏偏與公主長得像搂妻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辕棚,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345