.
.
Core Java
Technologies Technical Tips
.
 
2004³â 3¿ù 25ÀÏ  


Core Java Technologies Tech Tips¿¡ ¿À½Å ¿©·¯ºÐÀ» ȯ¿µÇÕ´Ï´Ù. Java 2 Platform, Standard Edition (J2SE)¿¡ ±â¹ÝÇÑ core Java technologies ¿Í APIsÀÇ »ç¿ë¿¡ °üÇÑ ÃֽŠÁ¤º¸¸¦ ¾ò¾î °¡½Ã±â ¹Ù¶ø´Ï´Ù. ÀÌ ±Û¿¡¼­´Â Java 2 SDK, Standard Edition, v 1.4¸¦ »ç¿ëÇÕ´Ï´Ù.

À̹ø È£¿¡¼­´Â,

-JFILECHOOSER »ç¿ëÀÚ Á¤ÀÇÇϱâ
-¿¹¿Ü ó¸®ÀÇ BEST PRACTICES

À» ´Ù·ç°Ô µË´Ï´Ù.

ÀúÀÚ John Zukowski

.
.

JFILECHOOSER »ç¿ëÀÚ Á¤ÀÇÇϱâ

½ºÀ®¿¡¼­´Â ¿ÜÇüÀÌ »ç¿ëÀÚÀÇ ¸¾¿¡ µéÁö ¾ÊÀ¸¸é ´Ü¼øÈ÷ º¯°æÇÒ ¼ö ÀÖ¾ú´Ù. À̹ø ÆÁ¿¡¼­´Â JFileChooserÄÄÆ÷³ÍÆ®ÀÇ ¿ÜÇü°ú ±×°ÍÀÇ ¼Ó¼ºÀ» »ç¿ëÀÚ Á¤ÀÇÇÏ´Â ¹æ¹ýÀ» ¹è¿ì°Ô µÉ °ÍÀÌ´Ù. ¸ÕÀú JFileChooserÀÇ »ç¿ë¹ýÀ» º¹½ÀÇØº¸ÀÚ. ±×¸®°í ÄÄÆ÷³ÍÆ®¸¦ ÀÌ¿ëÇÑ ´ÜÀÏ/´ÙÁß ¼±Åðú ÆÄÀÏ/µð·ºÅ丮ÀÇ ¼±ÅÃ, ÆÄÀÏÀÇ ¼¼ÆÃ°ú ÇöÀç ¼±ÅÃµÈ ÄÁÅÙÃ÷¸¦ ¹Ì¸® º¸±âÇÒ ¶§ ÇÊ¿äÇÑ ¾×¼¼¼­¸®¸¦ Ãß°¡ÇÏ´Â °úÁ¤, ¸¶Áö¸·À¸·Î ÆÄÀÏ ¸®½ºÆ® ºä ¿µ¿ªÀ» ¾÷µ¥ÀÌÆ®ÇÏ´Â °ÍÀ» °øºÎÇϱâ·Î ÇϰڴÙ.

±âº»ÀûÀÎ »ç¿ë¹ý

JFileChooser ÄÄÆ÷³ÍÆ®´Â ½Ã½ºÅÛ¿¡¼­ »ç¿ëÇϰíÀÚ ÇÏ´Â ÆÄÀϰú µð·ºÅ丮¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» Á¦°øÇÑ´Ù. ÀÌ ÄÄÆ÷³ÍÆ®´Â Çϳª ÀÌ»óÀÇ ÆÄÀÏÀ̳ª µð·ºÅ丮¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ´Â ´ÙÀ̾˷α׸¦ Á¦°øÇÑ´Ù. JFileChooser ÄÄÆ÷³ÍÆ®¿¡ Æ÷ÇÔµÈ °ÍµéÀº ´ÙÀ̾˷α×ÀÇ ¸ð´Þ ¹öÀüÀ» º¸¿©ÁÖ±â À§ÇÑ ¸Þ¼ÒµåµéÀÇ ÁýÇÕÀÌ´Ù. ¸ð´ÞÀ̶õ, »ç¿ëÀÚ°¡ ¾î¶² Ç׸ñÀ» ¼±ÅÃÇÏÁö ¾Ê´Â ÇÑ ¸Þ¼Òµå°¡ °ªÀ» ¸®ÅÏÇÏÁö ¾Ê´Â °ÍÀ» ¸»ÇÑ´Ù. ÀÌ·¯ÇÑ ¸Þ¼Òµå·Î´Â showOpenDialog, showSaveDialog, showDialog °¡ ÀÖ´Ù. ÀÌ 3°³ÀÇ ¸Þ¼Òµå´Â ½ÂÀÎ ¹öư¿¡ ¾î¶² ÅØ½ºÆ®°¡ ³ªÅ¸³¯ °ÍÀÎÁö¸¦ Á¶ÀýÇÑ´Ù. (Áï, ÀÌ ÅØ½ºÆ®´Â ´ÙÀ̾ó·Î±×¸¦ ÀÌ¿ëÇÑ ÀÛ¾÷ÀÌ ³¡³µÀ» ¶§ »ç¿ëÀÚ°¡ ¼±ÅÃÇÑ »çÇ×ÀÌ´Ù.) Open °ú Save ¿Í °°Àº ÀϹÝÀûÀÎ ¿É¼Ç¿¡ °üÇØ¼­´Â ¹°·Ð ºôÆ®ÀÎ(built-in) ¸Þ¼Òµå°¡ Á¸ÀçÇÑ´Ù. µð½ºÇ÷¹À̵Ǵ ÆÄÀÏ ¼±ÅÃâ ´ÙÀ̾˷α״ ÇöÀçÀÇ ·è¾ØÇÊ ¼¼ÆÃ¿¡ ÀûÀýÇÏ°Ô ¸ÂÃçÁ® ÀÖ´Ù. ÀϹÝÀûÀ¸·Î ´ÙÀ̾˷α״ »ç¿ëÀÚÀÇ Ç÷§Æû¿¡ ÀûÇÕÇÑ ÆÄÀÏ ´ÙÀ̾˷α׷Πº¸À̰í, Ưº°È÷ ¼³Á¤µÈ »çÇ×ÀÌ ¾ø´Ù¸é Å©·Î½º Ç÷§ÆûÀÇ Metal ·è¾ØÇÊ·Î ¼³Á¤µÈ´Ù.

»ç¿ëÀÚ´Â ´ÙÀ̾˷α׿¡¼­ Ç׸ñÀ» ¼±ÅÃÇϰí Open À̳ª Save ¹öưÀ» Ŭ¸¯Çϰųª ¼±ÅÃµÈ Ç׸ñÀ» ´õºí Ŭ¸¯ÇÑ´Ù. ±×·¯¸é Show ¸Þ¼Òµå´Â ½ÂÀÎ ¹öưÀÌ ¼±ÅÃµÈ °ÍÀÎÁö, ¾Æ´Ï¸é »ç¿ëÀÚ°¡ Ç׸ñÀ» ¼±ÅÃÇÏÁö ¾Ê°í ´ÙÀ̾˷α׸¦ ´Ý¾Æ¹ö·È´ÂÁö(»ç¿ëÀÚ°¡ Cancel ¹öưÀ̳ª À©µµ¿ì »óÀ§ ÄÚ³ÊÀÇ x ¹öưÀ» Ŭ¸¯ÇßÀ» ¶§)¸¦ ³ªÅ¸³»´Â »óŰªÀ» ¸®ÅÏÇÑ´Ù. ¸®Å쵃 ¼ö ÀÖ´Â °¡´ÉÇÑ »óÅ´ CANCEL_OPTION, APPROVE_OPTION, ȤÀº ERROR_OPTION ¿Í °°Àº Ŭ·¡½º »ó¼ö¿¡ ÀÇÇØ ÁöÁ¤µÈ´Ù. JFileChooserÀÇ ¿¹Á¦¸¦ º¸ÀÚ.

   import java.io.File;
   import javax.swing.*;

   public class Basics {

     public static void main(String args[]) {
       SwingUtilities.invokeLater(new Runnable() {
         public void run() {
           JFileChooser fileChooser =
                  new JFileChooser(".");
           int status = fileChooser.showOpenDialog(null);
           if (status == JFileChooser.APPROVE_OPTION) {
             File selectedFile = 
                  fileChooser.getSelectedFile();
             System.out.println("Selected: " 
                    + selectedFile.getParent() 
                    + " --- " 
                    + selectedFile.getName());
           }
           System.exit(0);
         }
       });
     }
   }

ÀÌ ÇÁ·Î±×·¥Àº ÆÄÀÏ ¼±ÅÃâ ´ÙÀ̾˷α׸¦ µð½ºÇ÷¹ÀÌÇÑ´Ù. »ç¿ëÀÚ°¡ µð·ºÅ丮¿Í ÆÄÀÏÀ» ¼±ÅÃÇÏ¸é ´ÙÀ̾˷α״ µð·ºÅ丮¸¦ ÀνÄÇÏ°í ÆÄÀÏÀ̸§À» µð½ºÇ÷¹ÀÌÇÑ´Ù.

´ÜÀÏ/´ÙÁß ¼±ÅÃ

JFileChooser´Â ´ÜÀÏ ¼±Åà ¸ðµå¸¦ µðÆúÆ® °ªÀ¸·Î ÇÑ´Ù. ÀÌ´Â »ç¿ëÀÚ°¡ Çѹø¿¡ ÇϳªÀÇ µð·ºÅ丮³ª ÆÄÀϸ¸ ¼±ÅÃÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ¸¸¾à Çѹø¿¡ ¿©·¯ °³ÀÇ Ç׸ñÀ» ¼±ÅÃÇÒ ¼ö ÀÖ´Â °ÍÀ» Çã¿ëÇÑ´Ù¸é, multiSelectionEnabled ¸¦ true·Î ¼³Á¤ÇØ¾ß ÇÑ´Ù. ¿¹Á¦¸¦ º¸ÀÚ.

   import java.io.File;
   import javax.swing.*;

   public class Multi {

     public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            JFileChooser fileChooser 
                   = new JFileChooser(".");
            fileChooser.setMultiSelectionEnabled(true);
            int status = fileChooser.showOpenDialog(null);
            if (status == JFileChooser.APPROVE_OPTION) {
                   File selectedFiles[] = 
                        fileChooser.getSelectedFiles();
               for (int i=0, 
                    n=selectedFiles.length; i<n; i++) {
                         System.out.println("Selected: " 
                         + selectedFiles[i].getParent() 
                         + " --- " 
                         + selectedFiles[i].getName());
               }
            }
            System.exit(0);
          }
       });
     }
   }

selection setÀ» °Ë»öÇϱâ À§Çؼ­´Â getSelectedFile()°¡ ¾Æ´Ñ getSelectedFiles() ¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù´Â °ÍÀ» ±â¾ïÇÏÀÚ.

J2SE SDK version 1.4ÀÌÀü¿¡´Â, ¸ðµç ·è¾ØÇÊÀÌ ´ÙÁß ¼±ÅÃÀ» Áö¿øÇÏÁö ¾Ê¾ÒÁö¸¸ ÇöÀç´Â ¸ðµç ½Ã½ºÅÛÀÌ Á¦°øÇÏ´Â ·è¾ØÇÊÀ» ´ÙÁß ¼±Åÿ¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

ÆÄÀϰú µð·ºÅ丮ÀÇ ¼±ÅÃ

ÀϹÝÀûÀ¸·Î »ç¿ëÀÚ´Â ÆÄÀÏ ¼±ÅÃ⸦ ÀÌ¿ëÇØ¼­ ÆÄÀÏÀ» ¼±ÅÃÇÏÁö¸¸, µð·ºÅ丮¸¦ ¼±ÅÃÇÒ ¼ö ÀÖµµ·Ï ÇÒ ¼öµµ ÀÖ´Ù. °£´ÜÇÏ°Ô setFileSelectionMode¸Þ¼Òµå¸¦ È£ÃâÇÏ¸é µÈ´Ù. ´Ù¸¸ È£Ãâ½Ã ´ÙÀ½ »ó¼ö ÁßÀÇ Çϳª¸¦ ÁöÁ¤ÇØ¾ß ÇÑ´Ù.

  • JFileChooser_ONLY
  • JFileChooser.DIRECTORIES_ONLY
  • JFileChooser_AND_DIRECTORIES

°¢°¢ÀÇ »ó¼ö´Â ÆÄÀÏ ¼±ÅÃ⸦ À§ÇÑ ¸ðµå¸¦ ÁöÁ¤ÇÑ´Ù. ¿¹¸¦ µé¸é, JFileChooser_AND_DIRECTORIES »ó¼ö´Â ÆÄÀÏ ¼±ÅÃâ¿¡¼­ ÆÄÀÏÀ̳ª µð·ºÅ丮 ¸ðµÎ ¼±Åð¡´É Çϵµ·Ï ¼³Á¤ÇÑ´Ù. ´Ù½Ã ¸»Çϸé, »ç¿ëÀÚ°¡ µ¿ÀÏÇÑ ¼±ÅÃâ¿¡¼­ ÆÄÀÏÀ̳ª µð·ºÅ丮¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ´Ù´Â ¸»ÀÌ´Ù.

»ç¿ëÀÚ´Â µð·ºÅ丮¸¦ ¼±ÅÃÇÒ ¶§ ´ÙÁß ¼±ÅÃÀ» ÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â ÇϳªÀÇ ¼±ÅÃâ¿¡¼­ ¿©·¯ °³ÀÇ µð·ºÅ丮¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ¸»ÇÑ´Ù. ´ÙÀ½ ÇÁ·Î±×·¥ÀÌ À̸¦ ³ªÅ¸³½´Ù.

   import java.io.File;
   import javax.swing.*;

   public class Dirs {

     public static void main(String args[]) {
       SwingUtilities.invokeLater(new Runnable() {
         public void run() {
           JFileChooser fileChooser = 
                  new JFileChooser(".");
           fileChooser.setMultiSelectionEnabled(true);
           fileChooser.setFileSelectionMode(
                  JFileChooser.DIRECTORIES_ONLY);
           int status = fileChooser.showOpenDialog(null);
           if (status == JFileChooser.APPROVE_OPTION) {
             File selectedFiles[] = 
                 fileChooser.getSelectedFiles();
             for 
               (int i=0, n=selectedFiles.length; i<n; i++) {
                     System.out.println("Selected: " 
                        + selectedFiles[i].getParent() 
                        + " --- " 
                        + selectedFiles[i].getName());
             }
           }
           System.exit(0);
         }
       });
     }
   }

µð·ºÅ丮 ¼±Åà ¸ðµå¿¡¼­, File Name ºÎºÐ¿¡ ³ªÅ¸³ª´Â ÃÖÃÊÀÇ ÅØ½ºÆ®´Â ÇöÀç ¼±ÅÃµÈ µð·ºÅ丮ÀÌ´Ù. ÆÄÀÏ ¼±Åà ¸ðµå¿¡¼­´Â ÀÌ Çʵå´Â ºñ¾îÀÖ´Ù.

File Filters

ÆÄÀÏ ÇÊÅÍ´Â ¼±ÅÃâ¿¡¼­ ¼±ÅÃµÉ ¼ö ÀÖ´Â ÆÄÀÏÀ» Á¦ÇÑÇÑ´Ù. °¡·É, »ç¿ëÀÚ°¡ .java¼Ò½º ÆÄÀϸ¸À» º¸±â¸¦ ¿øÇÑ´Ù¸é, .javaÈ®ÀåÀÚ¸¸À» À§ÇÑ ÆÄÀÏ ÇÊÅÍ( FileFilter Ŭ·¡½ºÀÇ ¼­ºêŬ·¡½º)¸¦ Çü¼ºÇÒ ¼ö ÀÖ´Ù. µðÆúÆ® ÆÄÀÏ ÇÊÅÍ´Â ÆÄÀÏ ¼±ÅÃâ¿¡ ÀÖ´Â ¸ðµç ÆÄÀÏÀ» ¿­°ÅÇÏ´Â "accept all"·Î ¼³Á¤µÇ¾î ÀÖ´Ù. ¼±ÅÃâ¿¡ ÆÄÀÏ ÇÊÅ͸¦ Ãß°¡Çϸé, ±× ÇÊÅÍ´Â ÀûÀýÇÑ µå·Ó ´Ù¿î ¸®½ºÆ®¿¡ ³ªÅ¸³ª°Ô µÈ´Ù. ¼±ÅÃâÀÇ Motif ¹öÀü¿¡¼­´Â Folders ¸®½ºÆ®ÀÇ À­ºÎºÐ¿¡, Windows ¿Í Metal ¹öÀü¿¡¼­´Â À©µµ¿ìÀÇ Çϴܺο¡ À§Ä¡ÇÑ´Ù.

ÆÄÀÏ ÇÊÅ͸¦ ÆÄÀÏ ¼±ÅÃâ¿¡ Ãß°¡Çϱâ À§Çؼ­´Â, javax.swing.filechooser ÆÐŰÁö¿¡¼­ FileFilter ÀνºÅϽº¸¦ »ý¼ºÇØ¾ß ÇÑ´Ù. ±×¸®°í´Â »õ·Î¿î ÇÊÅ͸¦ ÀÔ·ÂÇÑ addChooseableFileFilter ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. ±×·¯¸é ÀÌ ÇÊÅÍ´Â µåµð¾î µå·Ó ´Ù¿î ÇÊÅÍ ¸®½ºÆ®¿¡¼­ ÀÌ¿ë °¡´ÉÇÏ°Ô µÈ´Ù. ȤÀº setFileFilter ¸Þ¼Òµå¸¦ È£ÃâÇØ¼­ ÇÊÅ͸¦ ¼±ÅÃÇÒ ¼öµµ ÀÖ´Ù. ÀÌ °æ¿ì, ¼±ÅÃâÀÌ ÃÖÃÊ·Î µð½ºÇ÷¹ÀÌµÉ ¶§, 'all' ¿·¿¡ ÇÊÅÍ ¼¼Æ®¸¦ º¼ ¼ö ÀÖ´Ù. ÆÄÀÏ ÇÊÅ͸¦ ¸í½ÃÀûÀ¸·Î ¼³Á¤ÇÏÁö ¾Ê¾Ò´Ù¸é ¸¶Áö¸·À¸·Î Ãß°¡µÈ °ÍÀÌ ÃÖÃÊ ¼±ÅðªÀÌ´Ù.

JFileChooser¸¦ À§ÇÑ ÆÄÀÏ ÇÊÅÍ¿Í Java I/O ÆÐŰÁöÀÇ ÇÊÅ͸¦ È¥µ¿ÇÏÁö ¸»ÀÚ. À̸§ÀÌ µ¿ÀÏÇϱä ÇÏÁö¸¸, ±×°ÍµéÀÇ ÆÐŰÁö¿Í »ç¿ë¹ýÀº ´Ù¸£´Ù.

´ÙÀ½ Filters ÇÁ·Î±×·¥Àº ÆÄÀÏ ÇÊÅÍÀÇ »ç¿ëÀ» º¸¿©ÁØ´Ù. ÇÁ·Î±×·¥À» ½ÇÇàÇϱâ À§Çؼ­´Â SDK µ¥¸ð¿¡ Æ÷ÇÔµÈ ExampleFileFilter Ŭ·¡½º°¡ ÇÊ¿äÇÏ´Ù. SDKÀÇ demo/jfc/FileChooserDemo/src µð·ºÅ丮¸¦ »ìÆìº¸ÀÚ.( À©µµ¿ì¿¡¼­´Â ¹°·Ð ¿ª½½·¡½¬¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. ) ExampleFileFilter Ŭ·¡½º´Â ¸ðµç Çü½ÄÀÇ È®ÀåÀÚ¸¦ À§ÇÑ ÇÊÅ͸¦ »ý¼ºÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù. ÀûÀýÇÑ ÆÄÀÏ È®ÀåÀÚ¸¦ Ãß°¡Çϰí, ¼±ÅÃâ¿¡ °¢°¢ÀÇ ÇÊÅ͸¦ Ãß°¡ÇÏÀÚ.

   import java.io.File;
   import javax.swing.*;

   public class Filters {

     public static void main(String args[]) {
       SwingUtilities.invokeLater(new Runnable() {
         public void run() {
           JFileChooser fileChooser = 
                  new JFileChooser(".");
           ExampleFileFilter filter = 
                  new ExampleFileFilter("java");
           filter.setDescription("Java Source Files");
           fileChooser.addChoosableFileFilter(filter);

           filter = new ExampleFileFilter("class");
           filter.setDescription("Class Files");
           fileChooser.addChoosableFileFilter(filter);

           filter = new ExampleFileFilter("java");
           filter.addExtension("class");
           filter.setDescription("Source and Class Files");
           fileChooser.addChoosableFileFilter(filter);

           int status = fileChooser.showOpenDialog(null);
           if (status == JFileChooser.APPROVE_OPTION) {
             File selectedFile = 
                    fileChooser.getSelectedFile();
             System.out.println("Selected: " 
                    + selectedFile.getParent() 
                    + " --- " 
                    + selectedFile.getName());
           }
           System.exit(0);
         }
       });
     }
   }

¾×¼¼¼­¸® ÆÐ³Î

JFileChooserÀÇ ´õ¿í Àç¹ÌÀִ Ư¡Àº ±×°ÍÀÇ ¾×¼¼¼­¸® ÆÐ³Î¿¡ ÀÖ´Ù. ¾×¼¼¼­¸® ÆÐ³Î¿¡´Â ÇöÀç ¼±Å𪿡 °ü·ÃµÈ Á¤º¸¸¦ º¸¿©ÁÖ´Â ÄÄÆ÷³ÍÆ®°¡ À§Ä¡ÇÒ ¼ö ÀÖ´Ù. °¡·É, ÇöÀç ¼±ÅðªÀÌ À̹ÌÁö ŸÀÔÀ̶ó¸é ÄÄÆ÷³ÍÆ®´Â À̹ÌÁö ÇÁ¸®ºä¾î°¡ µÉ ¼ö ÀÖ°í, ¿Àµð¿À ÆÄÀÏÀ̶ó¸é »ç¿îµå Ç÷¹À̾ µÉ ¼ö ÀÖ´Ù. ÆÄÀÏ ¼±Åÿ¡¼­ °ªÀÌ ¹Ù²ð ¶§¸¶´Ù ´Ù¸¥ Á¤º¸°¡ ¾×¼¼¼­¸® ÆÐ³Î¿¡ ¿¬°áµÈ´Ù.

¾×¼¼¼­¸® ÆÐ³ÎÀ» ¸¸µé±â À§Çؼ­´Â, ÀûÀýÇÑ ÄÄÆ÷³ÍÆ®¸¦ »ý¼ºÇϰí setAccessory¸¦ È£ÃâÇØ¼­ ±× ÄÄÆ÷³ÍÆ®¸¦ JFileChooser¿¡ ÷°¡ÇØ¾ß ÇÑ´Ù. ¾×¼¼¼­¸® ÆÐ³ÎÀº PropertyChangeListener·Î¼­ JFileChooser¿¡ ÷ºÎÇÑ´Ù. ÁÖ¸ñÇØ¾ß ÇÒ ¼Ó¼ºÀº SELECTED_FILE_CHANGED_PROPERTYÀÌ´Ù. SELECTED_FILE_CHANGED_PROPERTYÀÇ ¼Ó¼ºÀÌ ¹Ù²î¸é, ¾×¼¼¼­¸® ÄÄÆ÷³ÍÆ®´Â ±×°ÍÀÇ »óŸ¦ º¯°æÇÒ ¼ö ÀÖ´Ù.

¿¹Á¦¸¦ º¸ÀÚ. ´ÙÀ½ LabelAccessory´Â À̹ÌÁö ÇÁ¸®ºä¾î·Î ÀÛµ¿ÇÑ´Ù.

   import javax.swing.*;
   import java.beans.*;
   import java.awt.*;
   import java.io.*;

   public class LabelAccessory extends JLabel
           implements PropertyChangeListener {
     private static final int PREFERRED_WIDTH = 125;
     private static final int PREFERRED_HEIGHT = 100;

     public LabelAccessory(JFileChooser chooser) {
       setVerticalAlignment(JLabel.CENTER);
       setHorizontalAlignment(JLabel.CENTER);
       chooser.addPropertyChangeListener(this);
       setPreferredSize(new Dimension
               (PREFERRED_WIDTH, PREFERRED_HEIGHT));
     }   
     public void propertyChange(
       PropertyChangeEvent changeEvent) {
        String changeName = 
          changeEvent.getPropertyName();
        if (changeName.equals
            (JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)) {
                File file = (File)changeEvent.getNewValue();
                if (file != null) {
                        ImageIcon icon = 
                        new ImageIcon(file.getPath());
                if (icon.getIconWidth() 
                    > PREFERRED_WIDTH) {
                        icon = new ImageIcon(
                        icon.getImage().getScaledInstance
                        (PREFERRED_WIDTH, -1, 
                         Image.SCALE_DEFAULT));
                if (icon.getIconHeight() 
                    > PREFERRED_HEIGHT) {
                        icon = new ImageIcon(
                        icon.getImage().getScaledInstance
                        (-1, PREFERRED_HEIGHT, 
                         Image.SCALE_DEFAULT));
                }
          }
          setIcon(icon);
         }
       }
     }
   }

¸¶Áö¸·À¸·Î, ´ÙÀ½ Accessories ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄÑ º¸ÀÚ. À̸¦ ½ÇÇàÇÏ¸é ¾×¼¼¼­¸® ÆÐ³ÎÀ» º¼ ¼ö ÀÖ´Ù. ÇÁ·Î±×·¥À» ½ÇÇàÇÒ ¶§, À̹ÌÁö¸¦ Æ÷ÇÔÇÏ´Â µð·ºÅ丮¸¦ ¼±ÅÃÇØ¾ß ÇÑ´Ù´Â °ÍÀ» ÀØÁö ¸»ÀÚ. ÇÁ¸®ºä ÆÐ³Î¿¡¼­ À̹ÌÁö¸¦ º¼ ¼ö ÀÖ´Ù. ÇöÀç ¼±ÅðªÀÌ À̹ÌÁö°¡ ¾Æ´Ï¸é ÇÁ¸®ºä ÆÐ³Î¿¡´Â ¾Æ¹«°Íµµ ³ªÅ¸³ªÁö ¾Ê´Â´Ù.

   import java.io.File;
   import javax.swing.*;

   public class Accessories {

     public static void main(String args[]) {
       SwingUtilities.invokeLater(new Runnable() {
         public void run() {
           JFileChooser fileChooser = 
                 new JFileChooser(".");
           LabelAccessory accessory = 
                 new LabelAccessory(fileChooser);
           fileChooser.setAccessory(accessory);
           fileChooser.addPropertyChangeListener
               (JFileChooser.SELECTED_FILE_CHANGED_PROPERTY, 
                accessory);
           int status = fileChooser.showOpenDialog(null);
           if (status == JFileChooser.APPROVE_OPTION) {
             File selectedFile = 
                    fileChooser.getSelectedFile();
             System.out.println("Selected: " 
                    + selectedFile.getParent() 
                    + " --- " 
                    + selectedFile.getName());
           }
           System.exit(0);
         }
       });
     }
   }

FileView

ÆÄÀÏ À̸§ÀÌ ¿­°ÅµÇ¾î ÀÖ´Â ÆÄÀÏ ¼±ÅÃâ ³»ÀÇ ¿µ¿ªÀº Ãß»ó Ŭ·¡½º FileView¿¡ ÀÇÇØ Á¶Á¤µÈ´Ù. Ä¿½ºÅÒ ¼­ºêŬ·¡½º¸¦ »ý¼ºÇÔÀ¸·Î½á ÆÄÀÏÀ» ¿­°ÅÇÏ´Â ¹æ¹ýÀ» »ç¿ëÀÚ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. ÀÌ Å¬·¡½º´Â ¾ÆÀÌÄÜÀ̳ª À̸§À» ã±â À§ÇÑ 5°³ÀÇ ¸Þ¼Òµå¸¦ °®Áö¸¸, ¼Ó¼ºÀ» ¸ðµÎ »ç¿ëÀÚ Á¤ÀÇÇÒ ÇÊ¿ä´Â ¾ø´Ù. ¸Þ¼Òµå ÁßÀÇ Çϳª¶óµµ null°ªÀ» ¸®ÅÏÇϸé, ÄÄÆ÷³ÍÆ®´Â µðÆúÆ® °ªÀ» ã¾Æ³»±â À§ÇØ ·è¾ØÇÊÀÇ Æ¯Á¤ÇÑ ¼Ó¼ºÀ» ÄÄÅäÇÏ°Ô µÈ´Ù.

À̸¦ ½ÇÇà½Ãų ¶§¿¡´Â ÀÚ¹Ù °ü·Ã ÆÄÀϵé, Áï .java files¿¡´Â ÆÄ¶õ»ö ¾ÆÀÌÄÜ, .class files¿¡´Â ÃÊ·Ï»ö ¾ÆÀÌÄܰú °°Àº Ưº°ÇÑ ¾ÆÀÌÄܵéÀ» ¸¸µé±â À§ÇØ JFileChooser ¸¦ »ý¼ºÇØ¾ß ÇÑ´Ù. .java ÆÄÀÏ¿¡´Â ÆÄÀÏ À̸§¿¡ ÆÄÀÏ »çÀÌÁ µ¡ºÙÀÌÀÚ.

¾ÆÀÌÄÜÀ» Á¤ÀÇÇϰí ÀÖ´Â ¿¹Á¦ÀÌ´Ù.

   import javax.swing.*;
   import java.awt.*;
   
   public class DiamondIcon implements Icon {
     private Color color;
     private boolean selected;
     private int width;
     private int height;
     private Polygon poly;
     private static final int DEFAULT_WIDTH = 10;
     private static final int DEFAULT_HEIGHT = 10;
     public DiamondIcon(Color color) {
             this(color, true, DEFAULT_WIDTH, 
                  DEFAULT_HEIGHT);
     }
     public DiamondIcon(Color color, boolean selected) {
             this(color, selected, DEFAULT_WIDTH, 
                  DEFAULT_HEIGHT);
     }
     public DiamondIcon(Color color, boolean selected, 
                        int width, int height) {
       this.color = color;
       this.selected = selected;
       this.width = width;
       this.height = height;
       initPolygon();
     }
     private void initPolygon() {
       poly = new Polygon();
       int halfWidth = width/2;
       int halfHeight = height/2;
       poly.addPoint(0, halfHeight);
       poly.addPoint(halfWidth, 0);
       poly.addPoint(width, halfHeight);
       poly.addPoint(halfWidth, height);
     }
     public int getIconHeight() {
       return height;
     }
     public int getIconWidth() {
       return width;
     }
     public void paintIcon(
      Component c, Graphics g, int x, int y) {
       g.setColor(color);
       g.translate(x, y);
       if (selected) {
         g.fillPolygon(poly);
       } else {
         g.drawPolygon(poly);
       }
       g.translate(-x, -y);
     }
   }

À§¿Í °°Àº Ưº°ÇÑ ¾ÆÀÌÄܵéÀ» º¸¿©ÁÖ´Â JFileChooser¸¦ »ý¼ºÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù. ¿øÇÑ´Ù¸é µðÆúÆ® ¼Ó¼ºÀ» º¸±â À§ÇØ setFileView ¶óÀÎÀ» ÄÚ¸àÆ®Ã³¸®ÇÒ ¼ö ÀÖ´Ù. ±×¸®°í ÆÄ¶õ»ö°ú ÃÊ·Ï»ö ¾ÆÀÌÄÜÀ» ÀÌ¿ëÇØ¼­ »ç¿ëÀÚ Á¤ÀÇµÈ FileView¸¦ º¼ ¼ö ÀÖµµ·Ï ÄÚ¸àÆ®¸¦ ´Ù½Ã Ȱ¼ºÈ­ ½Ãų ¼ö ÀÖ´Ù.(ÀÌ ¶§ »ç¿ëÀÚÀÇ À§Ä¡´Â ¼Ò½º¿Í ÄÄÆÄÀÏ µÈ ¼Ò½º ÆÄÀÏÀ» Æ÷ÇÔÇÏ´Â µð·ºÅ丮 ¾ÈÀ¸·Î °¡Á¤ÇÑ´Ù.)

   import java.io.File;
   import java.awt.*;
   import javax.swing.*;
   import javax.swing.filechooser.*;

   public class JavaFileView extends FileView {
     Icon javaIcon = new DiamondIcon(Color.blue);
     Icon classIcon = new DiamondIcon(Color.green);

     /**
      * If .java file, add length to name
      */
     public String getName(File file) {
       String filename = file.getName();
       if (filename.endsWith(".java")) {
               filename += " : " + file.length();
               return filename;
       }
       return null;
     }

     /**
      * Return special icons for .java and .class files
      */
     public Icon getIcon(File file) {
       // default icons for all directories
       if (file.isDirectory()) {
               return null;
       }
       String filename = file.getName();
       if (filename.endsWith(".java")) {
               return javaIcon;
       } else if (filename.endsWith(".class")) {
         return classIcon;
     }
     return null;
     }

     public static void main(String args[]) {
       SwingUtilities.invokeLater(new Runnable() {
         public void run() {
           JFileChooser fileChooser = 
                  new JFileChooser(".");
           FileView view = new JavaFileView();
           fileChooser.setFileView(view);
           int status = fileChooser.showOpenDialog(null);
           System.exit(0);
         }
       });
     }
   }

JFileChooser ¿¡ °üÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â "see the javadoc"À» Âü°íÇÑ´Ù. ¶ÇÇÑ ÀÚ¹Ù Æ©Å丮¾óÀÇ "How to Use File Choosers"¸¦ Âü°íÇÏÀÚ. ¸ÖƼ½º·¹µù°ú ½ºÀ®¿¡ °üÇØ¼­´Â ÀÚ¹Ù Æ©Å丮¾óÀÇ "How to Use Threads" ¸¦ Âü°íÇϱ⠹ٶõ´Ù.

.
.

¿¹¿Ü ó¸®ÀÇ BEST PRACTICES

¿¹¿Ü󸮴 ÀÚ¹Ù ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡ º»·¡ºÎÅÍ Æ÷ÇÔµÈ ºÎºÐÀÌ´Ù. ¿¡·¯¸¦ ¿¹¿Ü·Î ó¸®ÇÏ´Â ÀÌÀ¯´Â Äڵ带 Á» ´õ ½±°Ô Àаí À¯ÁöÇÒ ¼ö ÀÖ°Ô Çϱâ À§Çؼ­ ÀÌ´Ù. ÀÌ ÆÁÀº ¿¹¿Ü 󸮿¡ ÀÖ¾î ¸î °¡Áö ¸ð¹ü »ç·Ê¸¦ º¸¿©ÁÖ°í ÀÖ´Ù.

ºü¸¥ ÀÌÇØ¸¦ À§ÇØ ¿¹¿Ü 󸮸¦ º¸¿©ÁÖ´Â ÀüüÀûÀÎ ±¸Á¶¸¦ »ìÆìº¸ÀÚ.

   try {

     // code which could potentially
     // throw an exception

   } catch (TheException1 e) {

     // code to handle exceptional condition

   } catch (TheException2 e) {

     // code to handle next exceptional condition

   } finally {

     // code to run whether an exceptional 
    // condition happened or not
    
   }

±âº»ÀûÀ¸·Î ¿¹¿Ü¸¦ ¹ß»ýÇÒ ¼ö ÀÖ´Â ÄÚµå´Â try ºí·Ï ¾È¿¡ 󸮵Ǿî¾ß ÇÑ´Ù. ƯÁ¤ catch ºí·Ï ÄÚµå´Â ÄÚµåºí·Ï ³»¿¡¼­ ½Äº°µÇ´Â ¿¹¿Ü°¡ ¹ß»ýÇÏ´Â °æ¿ì¿¡¸¸ ½ÇÇàÇÑ´Ù. ¹Ý¸é, finally ºí·ÏÀÇ ÄÚµå´Â ¸ðµç °æ¿ì¿¡ ½ÇÇàµÈ´Ù. ½ÉÁö¾î´Â try-catch Äڵ尡 ÇöÀç ¸Þ¼Òµå¿¡¼­ ºüÁ®³ª¿À¶ó´Â È£ÃâÀ» ÇÒ °æ¿ì¿¡µµ ½ÇÇàµÈ´Ù.

try ºí·ÏÀÌ ÇÊ¿äÇϰí, catch ȤÀº finally ºí·Ï Áß Çϳª´Â ¹Ýµå½Ã Á¸ÀçÇØ¾ß ÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é ÄÄÆÄÀÏ·¯´Â ÄÄÆÄÀÏ ¿¡·¯¸¦ ¹ß»ý½ÃŲ´Ù.

¸¸¾à ¿©·¯ °³ÀÇ catch ±¸¸¦ °®´Â´Ù¸é, ½Ã½ºÅÛÀº ¿¹¿ÜÀûÀÎ »óȲ¿¡ ¸Â´Â ù¹øÂ° °ÍÀ» ã¾Æ ³½´Ù. µû¶ó¼­, IOException¸¦ À§ÇÑ catch ºí·ÏÀ» °®°í Àִµ¥ FileNotFoundException °¡ ¹ß»ýÇß´Ù¸é, ÀÌ´Â ÀϹÝÀûÀÎ IOException catch ±¸¿¡ ÀÇÇØ 󸮵ȴÙ.

Ç×»ó ÀÚ¼¼Çϸé ÀÚ¼¼ÇÒ¼ö·Ï ÁÁ´Ù´Â ±³ÈÆÀ» ¾òÀ» ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î¼­, FileNotFoundException ¸¦ »ý¼ºÇÏ´Â ¸Þ¼Òµå¸¦ »ý¼ºÇÒ ¶§, ±× ¸Þ¼Òµå°¡ IOException ¸¦ ¹ß»ýÇϵµ·Ï ¼±¾ðÇÏÁö´Â ¸»¾Æ¾ß ÇÑ´Ù. IOException ¸¦ ¹ß»ýÇϵµ·Ï ¼±¾ðÇϸé, È£ÃâÀÚ(caller)´Â FileNotFoundExceptions ¸¸ÀÌ ¾Æ´Ï¶ó °¡´ÉÇÑ ¸ðµç IOExceptionsÀ» ó¸®ÇϰԲû °­¿äµÈ´Ù. ÇÏÁö¸¸ ³Ê¹« ÀÚ¼¼È÷ ¼³¸íµÇ´Â °Íµµ ÁÁÁö ¾Ê´Ù. ƯÈ÷, ¸Þ¼Òµå¿¡ ÀÇÇØ ¹ß»ýµÇ´Â ¼±¾ðµÈ ¿¹¿Ü´Â ±¸Çö »ó¼¼¿¡ ´ëÇÑ ³»¿ëÀ» Àý´ë ³ªÅ¸³¾ ¼ö ¾ø´Ù.

¶Ç ´Ù¸¥ ÆÁÀº ºñ¾îÀÖ´Â catchºí·ÏÀÇ »ç¿ëÀ» ÇÇÇÏ´Â °ÍÀÌ´Ù. ´Ù½Ã ¸»Çϸé, ¿¹¿Ü°¡ ¹ß»ýÇßÀ» ¶§ À̸¦ ¹«½ÃÇÏÁö ¾Ê´Â °ÍÀÌ´Ù.

   // This code is bad

   try {
     ...
   } catch (AnException e) {
   }

½Ã½ºÅÛ ¶óÀ̺귯¸®ÀÇ µðÀÚÀ̳ʵéÀº »ç¿ëÀÚ¿¡°Ô ¾î¶² ¿¹¿ÜÀûÀÎ »óȲÀÌ ¹ß»ýÇß´Ù´Â °ÍÀ» ¾Ë·ÁÁÖ±â À§ÇØ ¿¹¿Ü¸¦ ¹ß»ý½ÃŲ´Ù. ÀÌ¿¡ ´ëÇÑ ÀÀ´äÀ¸·Î ´Ü¼øÈ÷ ±× ¹®Á¦¿¡ Á¢±ÙÇÏ´Â ¼öÁØÀ̶ó°í ÇÒ Áö¶óµµ ¹«¾ùÀΰ¡¸¦ ÇØº¸´Â °ÍÀº ÁÁÀº ½À°üÀÌ´Ù. ¸Å ÀÏ/À̺и¶´Ù ¹ß»ýÇÏ´Â ÀÚµ¿ Àç½Ãµµ°¡ ±ÍÂú¾Æ¼­ ¿¹¿Ü¸¦ ¹«½ÃÇÏ±æ ¿øÇÑ´Ù¸é, ¿¹¿Ü »óȲÀÌ ¹«½ÃµÇ´Â ÀÌÀ¯¸¦ ¸í½ÃÀûÀ¸·Î ¼³¸íÇÏ´Â ÄÚ¸àÆ®¸¦ catch ºí·Ï ¾È¿¡ °£´ÜÈ÷ ½áÁÖ¸é µÈ´Ù.

   // Better
   try {
     ...
   } catch (AnException ignored) {

     // System automatically retries every minute
     // Nothing to really do until retry

   }

¿¹¿Ü¿Í °ü·ÃµÈ ¸Å¿ì Áß¿äÇÑ ½À°üÀº ÀÌÀÇ ¹®¼­È­ÀÌ´Ù. ¸Þ¼Òµå¿¡ ÀÇÇØ ¾î¶² ¿¹¿Ü°¡ ¹ß»ýµÈ °ÍÀÎÁö¸¦ ¹®¼­È­Çϱâ À§Çؼ­´Â javadoc ű×ÀÎ @throws¸¦ ÀÌ¿ëÇÑ´Ù. °¡Àå ÁÁÀº ½À°üÀº ¹®¼­È­µÇ¾î¾ß ÇÏ´Â ¸ðµç ¿¹¿Ü¸¦ È£ÃâÇÏ´Â °ÍÀÌ´Ù. ÀϹÝÀûÀÎ ·±Å¸ÀÓ ¿¹¿Ü ¶ÇÇÑ ¹®¼­È­µÇ¾î¾ß ÇÑ´Ù. °¡·É, ´ÙÀ½ÀÇ ¸Þ¼Òµå ¼±¾ð¿¡¼­, ¹ß»ýµÈ ¿¹¿Ü¿Í ±× ¿¹¿Ü°¡ ¹ß»ýµÈ ÀÌÀ¯ ¸ðµÎ ¹®¼­È­µÇ¾ú´Ù. ´Ü¼øÈ÷ @throws ExceptionNameÀ¸·Î ³¡³»Áö ¸»ÀÚ. ±×°ÍÀº ¸Þ¼Òµå ¼±¾ðÀ» Ãß°¡ÇÏ´Â °Í À̿ܿ¡ ¾î¶² Àǹ̵µ °®Áö ¾Ê´Â´Ù.

    /**
     * Loads the class
     *
     * @param  name
     *         Class name
     *
     * @return  Resulting <tt>Class</tt> object
     *
     * @throws  ClassNotFoundException
     *          If class not found
     */
    public Class loadClass(String name) 
            throws ClassNotFoundException {
        ...
    }

·±Å¸ÀÓ ¿¹¿Ü¸¦ À§Çؼ­´Â ´ÙÀ½ IntegerÀÇ parseInt ¸Þ¼Òµå¸¦ º¸ÀÚ. À̰ÍÀº NumberFormatException ¸¦ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. (ÀÌ´Â ¸Þ¼Òµå ¼±¾ðÀÇ ÀϺηΠ¼±¾ðµÈ´Ù.) ÇÏÁö¸¸ RuntimeExceptionÀ̱⠶§¹®¿¡ ±»ÀÌ ¼±¾ðµÉ ÇÊ¿ä´Â ¾ø´Ù. »ç½Ç ¼±¾ðµÉ Çʿ䰡 ¾øÀ» »Ó¸¸ ¾Æ´Ï¶ó üũµÉ Çʿ䵵 ¾ø´Ù. ¸ðµç ¹è¿­ ¾×¼¼½º(array access)´Â ArrayIndexOutOfBoundsException¸¦ ¹ß»ýÇÒ ¼ö Àֱ⠶§¹®¿¡ ¸ðµç ¹è¿­ ¾×¼¼½º Äڵ带 try-catch ºí·Ï ¾È¿¡ ·¡ÇÎÇÏ´Â °ÍÀº ÁÁÀº ¿¹°¡ ¾Æ´Ï´Ù. ÀÌ´Â Äڵ带 Àаí À¯ÁöÇÏ´Â °ÍÀ» ¾î·Æ°Ô ¸¸µç´Ù.

   // This is bad, don't do it:
   try {
     for (int i=0, n=args.length; i<n; i++) {
        System.out.println(args[i]);
     }
   } catch (ArrayIndexOutOfBoundsException e) {
     System.err.println("Ooops");
   }

º¹±¸ °¡´ÉÇÑ »óŸ¦ ¸¸µé±â À§Çؼ­´Â ¿¬°üµÈ ¾×¼Ç°ú ÇÔ²² catch ±¸¸¦ °®´Â °ÍÀÌ ÁÁ´Ù. ¹°·Ð ·±Å¸ÀÓ ¿¹¿Ü¿¡¼­µµ °¡´ÉÇϱä ÇÏÁö¸¸ ÀϹÝÀûÀ¸·Î À̰͵éÀº ÀÌ¹Ì Ã¼Å©µÈ ¿¹¿ÜÀÌ´Ù. Àû¿ë »ç·Ê: ¾Õ¼­ ¾ð±ÞÇÑ Integer ÀÇ parseInt ¸Þ¼Òµå. ¸¸¾à parseInt ¸Þ¼Òµå¸¦ ÀÌ¿ëÇØ¼­ »ç¿ëÀÚ ÀԷ°ªÀ» È®ÀÎÇÑ´Ù¸é, ÀÌ´Â ºÐ¸íÈ÷ º¹±¸ °¡´ÉÇÑ µ¿ÀÛÀÌ´Ù. (»ç¿ëÀÚ°¡ ¿©ÀüÈ÷ À¯È¿ÇÏ´Ù´Â °¡Á¤ÇÏ¿¡.)

°íÀ¯ÀÇ Ä¿½ºÅÒ ¿¹¿Ü Ŭ·¡½º¸¦ »ý¼ºÇÏ´Â °ÍÀÌ °¡´ÉÇϱä ÇÏÁö¸¸, ½Ã½ºÅÛ ¿¹¿Ü Ŭ·¡½ºµéÀ» Àç»ç¿ëÇÏ´Â °ÍÀÌ Á» ´õ ÀϹÝÀûÀÌ´Ù. ÀÌ´Â ¹°·Ð ¸ðµç ¿ä±¸¸¦ ÃæÁ·½ÃŰÁö´Â ¸øÇÏÁö¸¸ ´ëºÎºÐÀÇ ¿ä±¸¿¡´Â ÃæºÐÇÏ´Ù.

»ç¿ëÇÒ ¼ö ÀÖ´Â ·±Å¸ÀÓ ¿¹¿Ü´Â ´ÙÀ½°ú °°´Ù.

  • NullPointerException - ¿ì¿¬È÷ ¹ß»ýÇϱⰡ ½±´Ù. ÀÌ ¿¹¿Ü°¡ ³Ê¹« ÀÚÁÖ ¹ß»ýÇÑ´Ù¸é, µ¿·á¿Í ÇÔ²² ´Ù½Ã »ìÆìº¼ Çʿ䰡 ÀÖ´Ù.

  • IllegalArgumentException - ¸Þ¼ÒµåÀÇ ÀμöÀÇ À¯È¿¼ºÀ» °Ë»çÇÒ ¶§ Á¾Á¾ ¹ß»ýÇÑ´Ù. ¸î¸îÀÇ °æ¿ì¿¡¼­´Â, ¸Þ¼Òµå°¡ ½ÃÀ۵Ǵ ÁöÁ¡¿¡¼­ ÀϹÝÀûÀÎ ¸í½ÃÀû üũ¿¡ ÀÇÇØ ¹ß»ýÇÑ´Ù. ȤÀº ¿©·¯ µ¿ÀÛÀÌ ½ÇÇàµÈ ÈÄ¿¡ ¹ß»ýÇÒ ¼öµµ ÀÖ´Ù. ¼­ºêŬ·¡½ºµéÀº NumberFormatException ¿Í PatternSyntaxException¸¦ Æ÷ÇÔÇÑ´Ù.

  • IndexOutOfBoundsException - ArrayIndexOutOfBoundsException Ŭ·¡½º´Â ¼­ºêŬ·¡½ºÀÌ´Ù. µû¶ó¼­ StringIndexOutOfBoundsExceptionÀÌ´Ù. ÀÌ·¯ÇÑ ¿¹¿ÜµéÀº »ç¿ëÀÚÀÇ µ¥ÀÌÅÍ ±¸Á¶ÀÇ ¹ÛÀ» ¹þ¾î³ª´Â Á¤¼ö°ªÀ» Àü´ÞÇÏ´Â °ÍÀ» È®ÀÎÇϱâ À§Çؼ­ »ç¿ëµÉ ¼ö ÀÖ´Ù.

  • UnsupportedOperationException - ¿äûµÈ µ¿ÀÛÀÌ Áö¿øµÇÁö ¾Ê´Â´Ù´Â °ÍÀ» ÁöÀûÇϱâ À§ÇØ ÀϹÝÀûÀ¸·Î Collections Framework¿¡ ÀÇÇØ »ç¿ëµÈ´Ù. À¯»çÇÑ »ç¿ë»óÀÇ ¹®Á¦¸¦ ³ªÅ¸³»±â À§Çؼ­µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

ÀÌ¹Ì Á¸ÀçÇÏ´Â ¿¹¿Ü Ŭ·¡½º¸¦ Àç»ç¿ëÇÏ´Â °ÍÀº °³¹ßÀÚµéÀÌ ±×µéÀÇ ÄÚµåÀÇ ¾çÀ» ÀÛ°Ô À¯ÁöÇÒ ¼ö ÀÖÀ» »Ó ¾Æ´Ï¶ó, ÀÌ¹Ì Á¸ÀçÇϰí ÀÖ´Â ¿¹¿Ü Ŭ·¡½º °èÃþ¿¡ Àͼ÷ÇÑ ÀÌÁ¡À» ÃëÇÒ ¼ö Àֱ⠶§¹®¿¡ ÁÁ´Ù.

¸¶Áö¸·À¸·Î »ìÆìº¼ ¿¹¿Ü ó¸®ÀÇ Æ¯Â¡Àº exception chaining ÀÌ´Ù. Java 2 Platform, Standard EditionÀÇ 1.4¹öÀü¿¡¼­ ¼Ò°³µÇ¾ú´ø °Í°ú °°ÀÌ exception chainingÀº ¼û°ÜÁ® ÀÖ´Â ¹®Á¦ÀÇ ¿øÀÎÀ» ¹ß»ýµÈ ¿¹¿Ü¿¡ ÷ºÎÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù. ÇÏÁö¸¸ chaining¶õ Ç×»ó ¿£µåÀ¯Àú°¡ º¼ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÏÁö´Â ¾Ê´Â´Ù. ´ë½Å µð¹ö±ëÇÏ´Â »ç¶÷ÀÌ ÀÌ ¼û°ÜÁø ¹®Á¦°¡ ¹ß»ýµÈ ¿øÀÎÀ» º¼ ¼ö ÀÖ°Ô´Â ÇÑ´Ù.

°¡·É, µ¥ÀÌÅͺ£À̽º¿¡¼­´Â(ƯÈ÷ JDBC ¶óÀ̺귯¸®¿¡¼­´Â) SQLException¸¦ À§ÇØ catch±¸¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÀϹÝÀûÀÌ´Ù. exception chaining¿¡ ¾Õ¼­, SQLException±¸´Â exception chaining¸¦ Çã¿ëÇÏ´Â getNextException ¸Þ¼Òµå¸¦ °®´Â´Ù. SQLException ÀÇ ¸ðµç ¼û°ÜÁø ¿øÀÎÀ» ã¾Æ³»±â À§Çؼ­´Â ´ÙÀ½°ú °°Àº ·çÇÁ¹®À» »ç¿ëÇÒ ¼ö ÀÖ´Ù.

   try {

     // JDBC code

   } catch (SQLException ex) {

     while (ex != null) {
       System.err.println(
         "SQLState: " + ex.getSQLState());
       System.err.println(
         "Message:  " + ex.getMessage());
       System.err.println(
         "Vendor:   " + ex.getErrorCode());
       System.err.println("-----");
       ex = ex.getNextException();
     }
   }

¿¬¼âÀÇ JDBC¹öÀüÀ» ÀÌ¿ëÇÏ´Â °Íº¸´Ù´Â, ´ÙÀ½°ú °°Àº Á¢±Ù¹æ¹ýÀÌ Ç¥ÁØÀûÀÌ´Ù. SQL »óÅÂ, ¸Þ½ÃÁö, ¿¡·¯ Äڵ带 ÇÁ¸°Æ®ÇÏ´Â ´ë½Å, ¿¹¿ÜÀÇ Å¸ÀÔ°ú ¸Þ½ÃÁö¸¸ µð½ºÇ÷¹À̵ȴÙ.

   try {

     // Normal code

   } catch (AnException ex) {

     Throwable t = ex;
     while (t != null) {
       System.err.println(
         "Type: " + t.getClass().getName());
       System.err.println(
         "Message: " + t.getMessage());
       System.err.println("-----");
       t = t.getCause();
     }
   } 

¿¹¿Ü¿¡ °üÇÑ ³»¿ëÀº ÈξÀ ¸¹´Ù. ÀÌ ±Û¿¡¼­ ¼³¸íÇÑ ¿¹Á¦µéÀÌ ¾ÕÀ¸·ÎÀÇ ¿¹¿Ü¿¡ °üÇÑ ÀÌÇØ¿Í »ç¿ë¿¡ ¸¹Àº µµ¿òÀÌ µÉ °ÍÀ̶ó°í ±â´ëÇÑ´Ù. ¿¹¿Ü󸮿¡ °üÇÑ ºÎ°¡ÀûÀÎ Á¤º¸´Â "Effective Java Programming Language Guide"ÀÇ "Exceptions" ¸¦ Âü°íÇϱ⠹ٶõ´Ù.

.
.
.

Reader Feedback

  ¸Å¿ì ÁÁ´Ù    ÁÁ´Ù    ±×Àú ±×·¸´Ù 

 

ÀÚ¹Ù ÇÁ·Î±×·¡¹ÖÀÌ ±Ã±ÝÇϼ¼¿ä? Java Online SupportÀ» Âü°íÇϼ¼¿ä.

.
.

º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù. °ü·Ã¹®ÀÇ : SunKorea@sun.com
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϽ÷Á¸é ¼ö½Å°ÅºÎ¸¦ Ŭ¸¯ÇØ ÁÖ¼¼¿ä.

Copyright 2004 Sun Korea, Inc. All rights reserved.

Sun Microsystems, Inc.
.
.