|
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" ¸¦ Âü°íÇϱ⠹ٶõ´Ù.
º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù. °ü·Ã¹®ÀÇ : SunKorea@sun.com
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϽ÷Á¸é ¼ö½Å°ÅºÎ¸¦
Ŭ¸¯ÇØ ÁÖ¼¼¿ä.
Copyright 2004 Sun Korea, Inc. All rights reserved.
|