import java.io.PrintStream;
import java.io.PrintWriter;
public class ApplicationException extends Exception {
      /** A wrapped Throwable */
      protected Throwable cause;
      public ApplicationException() {
          super("Error occurred in application.");
      }
      public ApplicationException(String message)  {
          super(message);
      }
      public ApplicationException(String message, Throwable cause)  {
          super(message);
          this.cause = cause;
      }
      // Created to match the JDK 1.4 Throwable method.
      public Throwable initCause(Throwable cause)  {
          this.cause = cause;
          return cause;
      }
      public String getMessage() {
          // Get this exception's message.
          String msg = super.getMessage();
          Throwable parent = this;
          Throwable child;
          // Look for nested exceptions.
          while((child = getNestedException(parent)) != null) {
              // Get the child's message.
              String msg2 = child.getMessage();
              // If we found a message for the child exception,
              // we append it.
              if (msg2 != null) {
                  if (msg != null) {
                      msg += ": " + msg2;
                  } else {
                      msg = msg2;
                  }
              }
              // Any nested ApplicationException will append its own
              // children, so we need to break out of here.
              if (child instanceof ApplicationException) {
                  break;
              }
              parent = child;
          }
          // Return the completed message.
          return msg;
      }
      public void printStackTrace() {
          // Print the stack trace for this exception.
          super.printStackTrace();
          Throwable parent = this;
          Throwable child;
          // Print the stack trace for each nested exception.
          while((child = getNestedException(parent)) != null) {
              if (child != null) {
                  System.err.print("Caused by: ");
                  child.printStackTrace();
                  if (child instanceof ApplicationException) {
                      break;
                  }
                  parent = child;
              }
          }
      }
      public void printStackTrace(PrintStream s) {
          // Print the stack trace for this exception.
          super.printStackTrace(s);
          Throwable parent = this;
          Throwable child;
          // Print the stack trace for each nested exception.
          while((child = getNestedException(parent)) != null) {
              if (child != null) {
                  s.print("Caused by: ");
                  child.printStackTrace(s);
                  if (child instanceof ApplicationException) {
                      break;
                  }
                  parent = child;
              }
          }
      }
      public void printStackTrace(PrintWriter w) {
          // Print the stack trace for this exception.
          super.printStackTrace(w);
          Throwable parent = this;
          Throwable child;
          // Print the stack trace for each nested exception.
          while((child = getNestedException(parent)) != null) {
              if (child != null) {
                  w.print("Caused by: ");
                  child.printStackTrace(w);
                  if (child instanceof ApplicationException) {
                      break;
                  }
                  parent = child;
              }
          }
      }
      public Throwable getCause()  {
          return cause;
      }
}
import com.ibm.ApplicationException;
public class NoSuchBookException extends ApplicationException {
      public NoSuchBookException(String bookName, String libraryName) {
        super("The book '" + bookName + "' was not found in the '" +
            libraryName + "' library.");
    }
}
å…ç§å¼‚常处ç†çš„陋ä¹?/font>
ä½ è§‰å¾—è‡ªå·±æ˜¯ä¸€ä¸ªJava专家å—?是å¦è‚¯å®šè‡ªå·±å·²ç»å…¨é¢æŽŒæ¡äº†Javaçš„å¼‚å¸¸å¤„ç†æœºåˆÓž¼Ÿåœ¨ä¸‹é¢è¿™ŒDµä»£ç ä¸åQŒä½ 能够˜q…速找出异常处ç†çš„å…个问题å—?
1 OutputStreamWriter out = ... 2 java.sql.Connection conn = ... 3 try { // â‘? 4  Statement stat = conn.createStatement(); 5  ResultSet rs = stat.executeQuery( 6   "select uid, name from user"); 7  while (rs.next()) 8  { 9   out.println("IDåQ? + rs.getString("uid") // â‘? 10    "åQŒå§“å:" + rs.getString("name")); 11  } 12  conn.close(); // â‘? 13  out.close(); 14 } 15 catch(Exception ex) // â‘? 16 { 17  ex.printStackTrace(); //â‘ß_¼Œâ‘? 18 } |
ã€€ã€€ä½œäØ“ä¸€ä¸ªJava½E‹åºå‘˜ï¼Œä½ 至ž®‘应该能够找å‡ÞZ¸¤ä¸ªé—®é¢˜ã€‚ä½†æ˜¯ï¼Œå¦‚æžœä½ ä¸èƒ½æ‰¾å‡ºå…¨éƒ¨å…个问题,è¯ïL‘ô¾l阅è¯ÀLœ¬æ–‡ã€?
ã€€ã€€æœ¬æ–‡è®¨è®ºçš„ä¸æ˜¯Java异常处ç†çš„ä¸€èˆ¬æ€§åŽŸåˆ™ï¼Œå› äØ“˜q™äº›åŽŸåˆ™å·²ç»è¢«å¤§å¤šæ•°äººç†ŸçŸ¥ã€‚我们è¦åšçš„æ˜¯åˆ†æžå„¿U寿UîCؓ“å例â€ï¼ˆanti-patternåQ‰çš„˜q背优秀¾~–ç 规范的常è§åä¹ æƒ¯åQŒå¸®åŠ©è¯»è€…ç†Ÿæ‚‰è¿™äº›å…¸åž‹çš„åé¢ä¾‹ååQŒä»Žè€Œèƒ½å¤Ÿåœ¨å®žé™…å·¥ä½œä¸æ•é”地察觉和é¿å…这些问题ã€?
  å例之一åQšä¸¢å¼ƒå¼‚å¸?
  代ç åQ?5è¡?18行ã€?
  ˜q™æ®µä»£ç æ•获了异常å´ä¸ä½œä»ÖM½•处ç†åQŒå¯ä»¥ç®—得上Java¾~–程ä¸çš„æ€æ‰‹ã€‚ä»Žé—®é¢˜å‡ºçŽ°çš„é¢‘¾J程度和¼œ¸å®³½E‹åº¦æ¥çœ‹åQŒå®ƒä¹Ÿè®¸å¯ä»¥å’ŒC/C++½E‹åºçš„一个æ¶å远æ’的问题相æòq¶è®º??䏿£€æŸ¥ç¼“冲区是å¦å·²æ»¡ã€‚å¦‚æžœä½ çœ‹åˆ°äº†è¿™¿Uä¸¢å¼ƒï¼ˆè€Œä¸æ˜¯æŠ›å‡ºï¼‰å¼‚常的情况,å¯ä»¥ç™‘Öˆ†ä¹‹ä¹åä¹åœ°è‚¯å®šä»£ç å˜åœ¨é—®é¢˜ï¼ˆåœ¨æžž®‘数情况下,˜q™æ®µä»£ç 有å˜åœ¨çš„ç†ç”±åQŒä½†æœ€å¥½åŠ ä¸Šå®Œæ•´çš„æ³¨é‡ŠåQŒä»¥å…å¼•èµ·åˆ«äºø™¯¯è§£ï¼‰ã€?
  ˜q™æ®µä»£ç 的错误在于,异常åQˆå‡ 乎)æ€ÀL˜¯æ„å‘³ç€æŸäº›äº‹æƒ…ä¸å¯¹åŠ²äº†åQŒæˆ–者说臛_°‘å‘生了æŸäº›ä¸å¯Õd¸¸çš„事情,我们ä¸åº”该对½E‹åºå‘出的求救信å·ä¿æŒæ²‰é»˜å’Œæ— 动于衷。调用一下printStackTrace½Ž—ä¸ä¸Šâ€œå¤„ç†å¼‚常â€ã€‚ä¸é”™ï¼Œè°ƒç”¨printStackTraceå¯¹è°ƒè¯•ç¨‹åºæœ‰å¸®åŠ©åQŒä½†½E‹åºè°ƒè¯•阶段¾l“æŸä¹‹åŽåQŒprintStackTracež®×ƒ¸åº”å†åœ¨å¼‚å¸¸å¤„ç†æ¨¡å—䏿‹…负主è¦è´£ä“Q了ã€?
  丢弃异常的情形éžå¸¸æ™®é。打开JDKçš„ThreadDeath¾cÈš„文档åQŒå¯ä»¥çœ‹åˆîC¸‹é¢è¿™ŒDµè¯´æ˜Žï¼šâ€œç‰¹åˆ«åœ°åQŒè™½ç„¶å‡ºçްThreadDeath是一¿U‘æ£å¸¸çš„æƒ…åŞ’,但ThreadDeath¾cÀL˜¯Errorè€Œä¸æ˜¯Exceptionçš„å¾c»ï¼Œå› äØ“è®¸å¤šåº”ç”¨ä¼šæ•èŽäh‰€æœ‰çš„Exceptionç„¶åŽä¸¢å¼ƒå®ƒä¸å†ç†ç¬ã€‚â€è¿™ŒDµè¯çš„æ„æ€æ˜¯åQŒè™½ç„¶ThreadDeath代表的是一¿U普通的问题åQŒä½†é‰´äºŽè®¸å¤šåº”用会试图æ•èŽäh‰€æœ‰å¼‚常然åŽä¸äºˆä»¥é€‚当的处ç†ï¼Œæ‰€ä»¥JDK把ThreadDeath定义æˆäº†Errorçš„å¾c»ï¼Œå› 䨓Error¾cÖM»£è¡¨çš„æ˜¯ä¸€èˆ¬çš„应用ä¸åº”该去æ•获的严é‡é—®é¢˜ã€‚å¯è§ï¼Œä¸¢å¼ƒå¼‚常˜q™ä¸€åä¹ æƒ¯æ˜¯å¦‚æ¤å¸¸è§åQŒå®ƒç”šè‡³å·²ç»å½±å“åˆîCº†Java本èín的设计ã€?
  那么åQŒåº”è¯¥æ€Žæ ·æ”ÒŽ£å‘¢ï¼Ÿä¸»è¦æœ‰å››ä¸ªé€‰æ‹©åQ?
  1ã€å¤„ç†å¼‚常。针对该异常采å–一些行动,例如修æ£é—®é¢˜ã€æé†’æŸä¸ªäh或进行其他一些处ç†ï¼Œè¦æ ¹æ®å…·ä½“的情åÅž¼‹®å®šåº”该采å–的动作。冋ơ说明,调用printStackTrace½Ž—ä¸ä¸Šå·²¾l“处ç†å¥½äº†å¼‚常â€ã€?
  2ã€é‡æ–°æŠ›å‡ºå¼‚常。处ç†å¼‚常的代ç 在分æžå¼‚叿€¹‹åŽï¼Œè®¤äؓ自己ä¸èƒ½å¤„ç†å®ƒï¼Œé‡æ–°æŠ›å‡ºå¼‚常也ä¸å¤×ƒØ“一¿U选择ã€?
  3ã€æŠŠè¯¥å¼‚å¸¸è{æ¢æˆå¦ä¸€¿U异常。大多数情况下,˜q™æ˜¯æŒ‡æŠŠä¸€ä¸ªä½Ž¾U§çš„å¼‚å¸¸è½¬æ¢æˆåº”用çñ”的异常(其å«ä¹‰æ›´å®ÒŽ˜“被用户了解的异常åQ‰ã€?
  4ã€ä¸è¦æ•获异常ã€?
  ¾l“论一åQšæ—¢ç„¶æ•获了异常åQŒå°±è¦å¯¹å®ƒè¿›è¡Œé€‚当的处ç†ã€‚ä¸è¦æ•èŽ·å¼‚å¸æ€¹‹åŽåˆæŠŠå®ƒä¸¢å¼ƒåQŒä¸äºˆç†ç¬ã€?
  å例之二åQšä¸æŒ‡å®šå…·ä½“的异å¸?
  代ç åQ?5行ã€?
  许多时候ähä»¬ä¼šè¢«è¿™æ ·ä¸€¿Uâ€œç¾Žå¦™çš„â€æƒ³æ³•å¸å¼•:用一个catchè¯å¥æ•获所有的异常。最常è§çš„æƒ…形就是ä‹É用catch(Exception ex)è¯å¥ã€‚但实际上,在ç»å¤§å¤šæ•°æƒ…况下åQŒè¿™¿Uåšæ³•ä¸å€¼å¾—æå€¡ã€‚äØ“ä»€ä¹ˆå‘¢åQ?
  è¦ç†è§£å…¶åŽŸå› åQŒæˆ‘们必™åÕd›ž™å¾ä¸€ä¸‹catchè¯å¥çš„用途。catchè¯å¥è¡¨ç¤ºæˆ‘们预期会出现柿U异常,而且希望能够处ç†è¯¥å¼‚常。异常类的作用就是告诉Java¾~–译器我们想è¦å¤„ç†çš„æ˜¯å“ªä¸€¿U异常。由于ç»å¤§å¤šæ•°å¼‚帔Rƒ½ç›´æŽ¥æˆ–间接从java.lang.Exception‹z„¡”ŸåQŒcatch(Exception ex)ž®Þq›¸å½“于说我们想è¦å¤„ç†å‡ 乎所有的异常ã€?
ã€€ã€€å†æ¥çœ‹çœ‹å‰é¢çš„代ç 例åã€‚æˆ‘ä»¬çœŸæ£æƒ³è¦æ•èŽïLš„异常是什么呢åQŸæœ€æ˜Žæ˜¾çš„一个是SQLExceptionåQŒè¿™æ˜¯JDBCæ“作ä¸å¸¸è§çš„异常。å¦ä¸€ä¸ªå¯èƒ½çš„异常是IOExceptionåQŒå› ä¸ºå®ƒè¦æ“作OutputStreamWriter。显ç„Óž¼Œåœ¨åŒä¸€ä¸ªcatchå—ä¸å¤„熘q™ä¸¤¿U截然ä¸åŒçš„异常是ä¸åˆé€‚的。如果用两个catchå—分别æ•获SQLExceptionå’ŒIOExceptionž®Þp¦å¥½å¤šäº†ã€‚è¿™ž®±æ˜¯è¯ß_¼Œcatchè¯å¥åº”当ž®½é‡æŒ‡å®šå…·ä½“的异常类型,而ä¸åº”该指定æ¶ëŠ›–范围太广的Exception¾c…R€?
  å¦ä¸€æ–šw¢åQŒé™¤äº†è¿™ä¸¤ä¸ªç‰¹å®šçš„异常,˜q˜æœ‰å…¶ä»–许多异常也å¯èƒ½å‡ºçŽ°ã€‚ä¾‹å¦‚ï¼Œå¦‚æžœç”׃ºŽæŸç§åŽŸå› åQŒexecuteQuery˜q”回了nullåQŒè¯¥æ€Žä¹ˆåŠžï¼Ÿ½{”案是让它们¾l§ç®‹æŠ›å‡ºåQŒå³ä¸å¿…æ•获也ä¸å¿…处ç†ã€‚实际上åQŒæˆ‘们ä¸èƒ½ä¹Ÿä¸åº”该去æ•获å¯èƒ½å‡ºçŽ°çš„æ‰€æœ‰å¼‚å¸¸ï¼Œ½E‹åºçš„其他地方还有æ•获异常的æœÞZ¼š??直至最åŽç”±JVM处ç†ã€?
  ¾l“论二:在catchè¯å¥ä¸å°½å¯èƒ½æŒ‡å®šå…·ä½“çš„å¼‚å¸¸ç±»åž‹ï¼Œå¿…è¦æ—¶ä‹É用多个catch。ä¸è¦è¯•囑֤„ç†æ‰€æœ‰å¯èƒ½å‡ºçŽ°çš„å¼‚å¸¸ã€?
  å例之三åQšå 用资æºä¸é‡Šæ”¾
  代ç åQ?è¡?14行ã€?
  异常改å˜äº†ç¨‹åºæ£å¸¸çš„æ‰§è¡Œ‹¹ç¨‹ã€‚这个é“ç†è™½ç„¶ç®€å•,å´å¸¸å¸¸è¢«äºÞZ»¬å¿½è§†ã€‚如果程åºç”¨åˆîCº†æ–‡äšgã€Socketã€JDBC˜qžæŽ¥ä¹‹ç±»çš„资æºï¼Œå³ä‹Éé‡åˆ°äº†å¼‚å¸¸ï¼Œä¹Ÿè¦æ£ç¡®é‡Šæ”¾å 用的资æºã€‚䨓æ¤ï¼ŒJavaæä¾›äº†ä¸€ä¸ªç®€åŒ–è¿™¾cÀL“作的关键è¯finallyã€?
  finallyæ˜¯æ ·å¥½ä¸œè¥¿ï¼šä¸ç®¡æ˜¯å¦å‡ºçŽ°äº†å¼‚å¸¸ï¼ŒFinallyä¿è¯åœ¨try/catch/finallyå—结æŸä¹‹å‰ï¼Œæ‰§è¡Œæ¸…ç†ä»ÕdŠ¡çš„ä»£ç æ€ÀL˜¯æœ‰æœºä¼šæ‰§è¡Œã€‚é—æ†„¡š„是有些ähå´ä¸ä¹ 惯使用finallyã€?
  当然åQŒç¼–写finallyå—åº”å½“å¤šåŠ å°å¿ƒï¼Œç‰¹åˆ«æ˜¯è¦æ³¨æ„在finallyå—之内抛出的异常??˜q™æ˜¯æ‰§è¡Œæ¸…ç†ä»ÕdŠ¡çš„æœ€åŽæœºä¼šï¼Œž®½é‡ä¸è¦å†æœ‰éš¾ä»¥å¤„ç†çš„错误ã€?
  ¾l“论三:ä¿è¯æ‰€æœ‰èµ„æºéƒ½è¢«æ£¼‹®é‡Šæ”¾ã€‚充分è¿ç”¨finally关键è¯ã€?/font>
å例之四åQšä¸è¯´æ˜Žå¼‚常的详¾l†ä¿¡æ?
  代ç åQ?è¡?18行ã€?
  仔细观察˜q™æ®µä»£ç åQšå¦‚æžœåó@环内部出çŽîCº†å¼‚常åQŒä¼šå‘生什么事情?我们å¯ä»¥å¾—到‘›_¤Ÿçš„ä¿¡æ¯åˆ¤æ–åó@çŽ¯å†…éƒ¨å‡ºé”™çš„åŽŸå› å—?ä¸èƒ½ã€‚我们åªèƒ½çŸ¥é“当剿£åœ¨å¤„ç†çš„¾cÕd‘生了æŸç§é”™è¯¯åQŒä½†å´ä¸èƒ½èŽ·å¾—ä“Q何信æ¯åˆ¤æ–导致当å‰é”™è¯¯çš„åŽŸå› ã€?
  printStackTraceçš„å †æ ˆè·ŸítªåŠŸèƒ½æ˜¾½Cºå‡º½E‹åº˜q行到当å‰ç±»çš„æ‰§è¡Œæµ½E‹ï¼Œä½†åªæä¾›äº†ä¸€äº›æœ€åŸºæœ¬çš„ä¿¡æ¯ï¼Œæœªèƒ½è¯´æ˜Žå®žé™…坯D‡´é”™è¯¯çš„åŽŸå› ï¼ŒåŒæ—¶ä¹Ÿä¸æ˜“解诅R€?
ã€€ã€€å› æ¤åQŒåœ¨å‡ºçް异叏æ—Óž¼Œæœ€å¥½èƒ½å¤Ÿæä¾›ä¸€äº›æ–‡å—ä¿¡æ¯ï¼Œä¾‹å¦‚当剿£åœ¨æ‰§è¡Œçš„ç±»ã€æ–¹æ³•和其他状æ€ä¿¡æ¯ï¼ŒåŒ…括以一¿U更适åˆé˜…è¯»çš„æ–¹å¼æ•´ç†å’Œ¾l„织printStackTraceæä¾›çš„ä¿¡æ¯ã€?
  ¾l“è®ºå››ï¼šåœ¨å¼‚å¸¸å¤„ç†æ¨¡å—䏿供适é‡çš„é”™è¯¯åŽŸå› ä¿¡æ¯ï¼Œ¾l„织错误信æ¯ä½¿å…¶æ˜“于ç†è§£å’Œé˜…诅R€?
  å例之五åQšè¿‡äºŽåºžå¤§çš„tryå?
  代ç åQ?è¡?14行ã€?
  ¾l常å¯ä»¥çœ‹åˆ°æœ‰äh把大é‡çš„ä»£ç æ”‘Ö…¥å•个tryå—ï¼Œå®žé™…ä¸Šè¿™ä¸æ˜¯å¥½ä¹ 惯。这¿U现象之所以常è§ï¼ŒåŽŸå› ž®±åœ¨äºŽæœ‰äº›äh囄¡œäº‹ï¼Œä¸æ„¿èŠ±æ—¶é—´åˆ†æžä¸€å¤§å—代ç ä¸å“ªå‡ 行代ç 会抛出异常ã€å¼‚常的具体¾cÕdž‹æ˜¯ä»€ä¹ˆã€‚把大é‡çš„è¯å¥è£…å…¥å•个巨大的tryå—就象是出门旅游时把所有日常用å“塞入一个大½Ž±ååQŒè™½ç„¶ä¸œè¥¿æ˜¯å¸¦ä¸Šäº†ï¼Œä½†è¦æ‰‘Ö‡ºæ¥å¯ä¸å®¹æ˜“ã€?
  一些新手常常把大é‡çš„ä»£ç æ”¾å…¥å•个tryå—,然åŽå†åœ¨catchè¯å¥ä¸å£°æ˜ŽExceptionåQŒè€Œä¸æ˜¯åˆ†¼›Õd„个å¯èƒ½å‡ºçŽ°å¼‚å¸¸çš„ŒDµè½òq¶åˆ†åˆ«æ•获其异常。这¿Uåšæ³•äØ“åˆ†æž½E‹åºæŠ›å‡ºå¼‚å¸¸çš„åŽŸå› å¸¦æ¥äº†å›°éš¾åQŒå› ä¸ÞZ¸€å¤§æ®µä»£ç 䏿œ‰å¤ªå¤šçš„地方å¯èƒ½æŠ›å‡ºExceptionã€?
  ¾l“论五:ž®½é‡å‡å°tryå—的体积ã€?
  å例之å…åQšè¾“出数æ®ä¸å®Œæ•´
  代ç åQ?è¡?11行ã€?
  ä¸å®Œæ•´çš„æ•°æ®æ˜¯Java½E‹åºçš„éšå½¢æ€æ‰‹ã€‚ä»”¾l†è§‚察这ŒDµä»£ç ,考虑一下如果åó@环的ä¸é—´æŠ›å‡ºäº†å¼‚常,会å‘生什么事情。åó@环的执行当然是è¦è¢«æ‰“æ–çš„åQŒå…¶‹Æ¡ï¼Œcatchå—会执行??ž®Þp¿™äº›ï¼Œå†ä¹Ÿæ²¡æœ‰å…¶ä»–动作了。已¾lè¾“å‡ºçš„æ•°æ®æ€Žä¹ˆåŠžï¼Ÿä½¿ç”¨˜q™äº›æ•°æ®çš„äh或设备将收到一份ä¸å®Œæ•´çš„ï¼ˆå› è€Œä¹Ÿæ˜¯é”™è¯¯çš„åQ‰æ•°æ®ï¼Œå´å¾—ä¸åˆ°ä»ÖM½•有关˜q™ä†¾æ•°æ®æ˜¯å¦å®Œæ•´çš„æ½Cºã€‚对于有些系¾lŸæ¥è¯ß_¼Œæ•°æ®ä¸å®Œæ•´å¯èƒ½æ¯”¾pÈ»Ÿåœæ¢˜qè¡Œå¸¦æ¥æ›´å¤§çš„æŸå¤±ã€?
ã€€ã€€è¾ƒäØ“ç†æƒ³çš„处¾|®åŠžæ³•æ˜¯å‘è¾“å‡ø™®¾å¤‡å†™ä¸€äº›ä¿¡æ¯ï¼Œå£°æ˜Žæ•°æ®çš„ä¸å®Œæ•´æ€§ï¼›å¦ä¸€¿Uå¯èƒ½æœ‰æ•ˆçš„办法是,先缓冲è¦è¾“出的数æ®ï¼Œå‡†å¤‡å¥½å…¨éƒ¨æ•°æ®ä¹‹åŽå†ä¸€‹Æ¡æ€§è¾“出ã€?
  ¾l“论å…:全é¢è€ƒè™‘å¯èƒ½å‡ºçŽ°çš„å¼‚å¸æ€»¥åŠè¿™äº›å¼‚常对执行‹¹ç¨‹çš„媄å“ã€?
  改写åŽçš„代ç
  æ ÒŽ®ä¸Šé¢çš„讨论,下颾l™å‡ºæ”¹å†™åŽçš„代ç 。也许有äºÞZ¼šè¯´å®ƒ½E微有点?å—¦ï¼Œä½†æ˜¯å®ƒæœ‰äº†æ¯”è¾ƒå®Œå¤‡çš„å¼‚å¸¸å¤„ç†æœºåˆ¶ã€?
OutputStreamWriter out = ... java.sql.Connection conn = ... try {  Statement stat = conn.createStatement();  ResultSet rs = stat.executeQuery(   "select uid, name from user");  while (rs.next())  {   out.println("IDåQ? + rs.getString("uid") + "åQŒå§“å? " + rs.getString("name"));  } } catch(SQLException sqlex) {  out.println("è¦å‘ŠåQšæ•°æ®ä¸å®Œæ•´");  throw new ApplicationException("è¯Õd–æ•°æ®æ—¶å‡ºçްSQL错误", sqlex); } catch(IOException ioex) {  throw new ApplicationException("å†™å…¥æ•°æ®æ—¶å‡ºçްIO错误", ioex); } finally {  if (conn != null) {   try {    conn.close();   }   catch(SQLException sqlex2)   {    System.err(this.getClass().getName() + ".mymethod - ä¸èƒ½å…³é—æ•°æ®åº“连æŽ? " + sqlex2.toString());   }  }  if (out != null) {   try {    out.close();   }   catch(IOException ioex2)   {    System.err(this.getClass().getName() + ".mymethod - ä¸èƒ½å…³é—输出文äšg" + ioex2.toString());   }  } } |