Jump to content






Photo

Java :: มาดูการเปลี่ยนแปลงเรื่อง Try-catch ของ JDK7 กันดู

Posted by up1 , 25 November 2011 · 1507 views

หลังจากที่ไม่ได้ update ความรู้เกี่ยวกับภาษา Java มานานพอสมควร วันนี้เลยขอมาสรุป  feature ที่น่าสนใจและใกล้ตัวของ JDK 7 สักหน่อย นั่นคือ Exception Handler หรือ การจัดการเรื่อง error ต่างๆ นั่นเอง  มาดุกันว่ามีการเปลี่ยนแปลงอย่างไร และมันเข้ามาช่วยเหลือบรรดา programmer อย่างผมยังไงกันบ้าง ซึ่งขอแนะนำ 2 ตัวคือ

1. Multi-Catch Exceptions
อธิบายสั้นๆ คือ สามารถดัก Exception ได้มากกว่า 1 ตัวใน catch block เดียวนั่นเอง โดยใช้
เครื่องหมาย pipe ( | ) ดังตัวอย่าง

try {
	
} catch ( Exception1 | Exception2 exception ) {
}

2. Try-with-Resources
ปัญหาหลักๆ ที่ programmer/developer ใหม่ๆ หรือ เก่าๆ มักจะเจอหรือถูกถามก็คือ ทำไม java มันกิน resources เยอะจัง แถมไม่ยอมคืน resources ต่างๆ เหล่านั้นอีก

โดยส่วนใหญ่จะเกิดจากความมักง่ายหรือสะเพร่าของ programmer/developer นั่นแหละ ยกตัวอย่างเช่น

BufferedReader reader = null;
   
try {
	URL url = new URL("http://www.yoursimpledate.server/");
	reader = new BufferedReader(new 
	InputStreamReader(url.openStream()));
	String line = reader.readLine();
	SimpleDateFormat format = new SimpleDateFormat("MM/DD/YY");
	Date date = format.parse(line);
}catch (MalformedURLException exception) {
}

การแก้ปัญหานี้ก็ทำง่ายๆ ด้วยการคืน resources ใน finally block ไปดังนี้

BufferedReader reader = null;
   
try {
	URL url = new URL("http://www.yoursimpledate.server/");
	reader = new BufferedReader(new 
			InputStreamReader(url.openStream()));
	String line = reader.readLine();
	SimpleDateFormat format = new SimpleDateFormat("MM/DD/YY");
	Date date = format.parse(line);
} catch (MalformedURLException exception) {
	// handle passing in the wrong type of URL.
} catch (IOException exception) {
	// handle I/O problems.
} catch (ParseException exception) {
	// handle date parse problems.
} finally {
	if (reader != null) {
		try {
			reader.close();
			 } catch (IOException ex) {
			ex.printStackTrace();
		}
	}
}

แต่ใน JDK 7 นั้นได้เสนอทางเลือกที่ง่ายกว่านั้น คือ การจัดการ resource ใน try () กันไปเลย

try (BufferedReader reader = new BufferedReader(
   	new InputStreamReader(
   	new URL("http://www.yoursimpledate.server/").openStream())))
{
	String line = reader.readLine();
	SimpleDateFormat format = new SimpleDateFormat("MM/DD/YY");
	Date date = format.parse(line);
} catch (ParseException | IOException exception) {
	// handle I/O problems.
}

จะสังเกตได้ว่า เราไม่จำเป็นต้องใช้ finally block อีกแล้ว และไม่ต้องมาเขียน code เพื่อคืน resources กลับไปยังระบบเองอีก เนื่องจากมันจะทำให้ในระดับ runtime เอง
ซึ่งทำให้ code ดูสะอาดและง่ายมากยิ่งขึ้น

แต่ข้อควรจำก็คือ try( ... ) block นี้ใช้ได้กับ class/interface ที่ทำการ implement interface java.lang.AutoCloseable เท่านั้นนะครับ ซึ่งสามารถดูเพิ่มเติมได้ที่นี่
http://docs.oracle.c...oCloseable.html

Web Reference
http://giddyplanet.c...-autocloseable/
Working with Java SE 7 Exception Changes




เรื่อง การจัดการ resource ใน try () กันไปเลย นี่เหมือน using ใน C# เลยนะครับ นำข้อดีของแต่ละภาษามารวมๆ กันซะ ห่าง จาวามาสักหลายเดือนมาเขียน C# เหมือนมันจะให้ความสุขกับผมมากเหมือนกัน บางอย่างค่อนข้างออกแบบมาดี และทำงานง่าย
  • Report

Search My Blog

October 2014

S M T W T F S
   1234
567891011
12131415161718
19202122232425
2627282930 31