item 75 jihoon - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

[item75] μ˜ˆμ™Έμ˜ 상세 λ©”μ‹œμ§€μ— μ‹€νŒ¨ κ΄€λ ¨ 정보λ₯Ό λ‹΄μœΌλΌ

μŠ€νƒ 좔적(stack strace)

  • μ˜ˆμ™Έλ₯Ό μž‘μ§€ λͺ»ν•΄ ν”„λ‘œκ·Έλž¨μ΄ μ‹€νŒ¨ν•˜λ©΄ μžλ°” μ‹œμŠ€ν…œμ€ κ·Έ μ˜ˆμ™Έμ˜ μŠ€νƒ 좔적(stack trace) 정보λ₯Ό μžλ™μœΌλ‘œ 좜λ ₯
  • μŠ€νƒ 좔적은 μ˜ˆμ™Έ 객체의 toString λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄ μ–»λŠ” λ¬Έμžμ—΄λ‘œ, μ˜ˆμ™Έμ˜ 클래슀 이름 뒀에 상세 λ©”μ‹œμ§€κ°€ λΆ™λŠ” ν˜•νƒœ
    • toString λ©”μ„œλ“œμ— μ‹€νŒ¨ 원인에 λŒ€ν•œ 정보λ₯Ό μ΅œλŒ€ν•œ λ‹΄λŠ” 것이 μ€‘μš”(μ‹€νŒ¨ μˆœκ°„μ˜ 상황을 μ •ν™•νžˆ 포착)

μ‹€νŒ¨ λ©”μ‹œμ§€ μž‘μ„± 방법 및 주의 사항

  • λ°œμƒν•œ μ˜ˆμ™Έμ— κ΄€μ—¬λœ λͺ¨λ“  λ§€κ°œλ³€μˆ˜μ™€ ν•„λ“œμ˜ 값을 μ‹€νŒ¨ λ©”μ‹œμ§€μ— λ‹΄μ•„μ•Ό ν•œλ‹€. μ–΄λ–€ λΆ€λΆ„μ—μ„œ λ¬Έμ œκ°€ λ°œμƒν–ˆλŠ”μ§€λ₯Ό μ•Œ 수 μžˆλ‹€.
    • IndexOutOfBoundsException의 상세 λ©”μ‹œμ§€λŠ” λ²”μœ„μ˜ μ΅œμ†Ÿκ°’κ³Ό μ΅œλŒ“κ°’, 그리고 λ²”μœ„λ₯Ό λ²—μ–΄λ‚¬λ‹€λŠ” 인덱슀 값을 λ‹΄μ•„μ•Ό ν•œλ‹€.
  • μŠ€νƒ μΆ”μ • μ •λ³΄λŠ” λ§Žμ€ μ‚¬λžŒμ΄ λ³Ό 수 μžˆμ–΄, 상세 λ©”μ‹œμ§€μ— λ³΄μ•ˆ κ΄€λ ¨ 정보(E.g λΉ„λ°€λ²ˆν˜Έ, μ•”ν˜Έ ν‚€)λ₯Ό λ‹΄μ•„μ„œλŠ” μ•ˆ λœλ‹€.
  • λ¬Έμ„œμ™€ μ†ŒμŠ€μ½”λ“œμ— λŒ€ν•œ μ •λ³΄λŠ” λ„£μ§€ μ•ŠλŠ” 게 μ’‹λ‹€.
    • μŠ€νƒ μΆ”μ μ—λŠ” μ˜ˆμ™Έ λ°œμƒν•œ 파일 이름과 μ€„λ²ˆν˜Έ, μŠ€νƒμ—μ„œ ν˜ΈμΆœν•œ λ‹€λ₯Έ λ©”μ„œλ“œλ“€μ˜ 파일 이름과 μ€„λ²ˆν˜ΈκΉŒμ§€ μ •ν™•νžˆ κΈ°λ‘λ˜μ–΄ μžˆλ‹€.
  • μ΅œμ’… μ‚¬μš©μžμ—κ²ŒλŠ” μΉœμ ˆν•œ μ•ˆλ‚΄ λ©”μ‹œμ§€λ₯Ό λ³΄μ—¬μ£ΌλŠ” 반면, μ˜ˆμ™Έ λ©”μ‹œμ§€λŠ” 가독성보단 λ‹΄κΈ΄ λ‚΄μš©μ΄ 훨씬 μ€‘μš”ν•˜λ‹€.
  • ν•„μš”ν•œ 정보λ₯Ό μ˜ˆμ™Έ μƒμ„±μžμ—μ„œ λͺ¨λ‘ λ°›μ•„ 상세 λ©”μ‹œμ§€κΉŒμ§€ 미리 μƒμ„±ν•΄λ†“λŠ” 방법도 μ’‹λ‹€.
    // κΈ°μ‘΄ μ½”λ“œ
    public class IndexOutOfBoundsException extends RuntimeException {
      private static final long serialVersionUID = 234122996006267687L;
    
      public IndexOutOfBoundsException() {
      }
    
      public IndexOutOfBoundsException(String s) {
        super(s);
      }
    
      // Since Java9
      public IndexOutOfBoundsException(int index) {
        super("Index out of range: " + index);
      }
    }
    
    // μž‘κ°€μ— μ˜ν•΄ μˆ˜μ •λœ μ½”λ“œ
    public class IndexOutOfBoundsException extends RuntimeException {
    
      private final int lowerBound;
      private final int upperBound;
      private final int index;
    
      /**
       * IndexOutOfBoundsException을 μƒμ„±ν•œλ‹€.
       *
       * @param lowerBound 인덱슀의 μ΅œμ†Ÿκ°’
       * @param upperBound 인덱슀의 μ΅œλŒ“κ°’ + 1
       * @param index 인덱슀의 μ‹€μ ―κ°’
       */
      public IndexOutOfBoundsException(int lowerBound, int upperBound, int index) {
        // μ‹€νŒ¨λ₯Ό ν¬μ°©ν•˜λŠ” 상세 λ©”μ‹œμ§€λ₯Ό μƒμ„±ν•œλ‹€.
        // κ³ ν’ˆμ§ˆ 상세 λ©”μ‹œμ§€ 생성 μ½”λ“œλ₯Ό μ˜ˆμ™Έ 클래슀 μ•ˆμœΌλ‘œ λͺ¨μ•„μ£Όμ–΄, λ©”μ‹œμ§€ 생성 μž‘μ—…μ„ μ€‘λ³΅ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.
        super(String.format("μ΅œμ†Ÿκ°’: %d, μ΅œλŒ“κ°’: %d, 인덱슀: %d",
                            lowerBound, upperBound, index));
    
        // ν”„λ‘œκ·Έλž¨μ—μ„œ μ΄μš©ν•  수 μžˆλ„λ‘ μ‹€νŒ¨ 정보λ₯Ό μ €μž₯ν•΄λ‘”λ‹€.
        this.lowerBound = lowerBound;
        this.upperBound = upperBound;
        this.index = index;
      }
    }
    
  • μ˜ˆμ™ΈλŠ” μ‹€νŒ¨μ™€ κ΄€λ ¨λœ 정보λ₯Ό 얻을 수 μžˆλŠ” μ ‘κ·Όμž λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜λŠ” 것이 μ’‹λ‹€(E.g. lowerBound, upperBound, index).
    • ν¬μ°©ν•œ μ‹€νŒ¨ μ •λ³΄λŠ” μ˜ˆμ™Έ 상황 볡ꡬ에 μœ μš©ν•˜μ—¬ 특히 검사 μ˜ˆμ™Έμ—μ„œ 빛을 λ°œν•œλ‹€.