Handling Exceptions & database
Chapter Objectives See how a try/catch block is used to handle exceptions Discover how to throw and rethrow an exception Learn how to handle events in a program
Exception Exception คือ ความผิดพลาดที่เกิดขึ้นในขณะที่โปรแกรมกำลังทำงานซึ่งสามารถตรวจสอบความผิดพลาดที่เกิดขึ้นได้ เช่น การหารตัวเลขใด ๆ ด้วยศูนย์ เช่น 3/0 พยายามเปิดไฟล์ที่ไม่มีในโฟล์เดอร์ของเรา อ้างอิงถึงข้อมูลใน Array ที่อยู่นอกเหนือจากที่มีอยู่
Java’s Exception Class Exception Class คือ class ที่ใช้ในการตรวจสอบความผิดพลาดในการทำงานในระหว่างที่ execute-time ซึ่งสามารถแบ่งความผิดพลาดได้หลายอย่างดังนี้ I/O exceptions Number format exceptions File not found exceptions Array index out of bounds exceptions ในขณะที่ java กำลังทำงาน หากมีความผิดพลาดเกิดขึ้น java ก็จะสร้าง instance ของ class Exception แล้วโยน (throw) ความผิดพลาดนั้นไปยังตำแหน่งที่เกิดความผิดพลาด
ตัวอย่าง Exception Classes
Exception ที่สําคัญและพบบอยในการเขียนโปรแกรมภาษาจาวา มีดังนี้ NullPointerException เปนขอผิดพลาดที่เกิดจากการเรียกใชออบเจกตที่ยังไมไดถูกสราง (ออบเจกตมีคาเปน null) ArithmeticException เปนขอผิดพลาดที่เกิดจากการหารจํานวนต็มดวย 0 ArrayIndexOutOfBoundsException เปนขอผิดพลาดที่เกิดจากการอางอิงสมาชิกในอะเรยไมถูกตอง (นอยกวา 0 หรือเกินกวาสมชิกของอะเรยที่มีอยู)
NumberFormatException เปนขอผิดพลาดที่เกิดจากรูปแบบตัวเลขที่ใชไมถูกตอง FileNotFoundException เปนการระบุวาไมพบไฟลที่ตองการ EOFException เปนการระบุวาตําแหนงสิ้นสุดของไฟลผานมาแลว IOException เปนขอผิดพลาดที่เกิดจากการรับและสงขอมูล
Example Exception Throw public class ExceptionDemo { public static void main(String args[]) int a,b,c; a = 5; b = 0; c = a/b; System.out.println(c); }
Example Exception Throw (cont.) public class ExceptionDemo { public static void main(String args[]) int a[] = {1,2,3}; System.out.println(a[-1]); }
การจัดการกับขอผิดพลาดที่เกิดขึ้น (Exception Handling) ในภาษาจาวามีชุดคําสั่งในการจัดการขอผิดพลาด • try-catch • throw
try-catch • รูปแบบ try-catch บล็อก try คือการจัดการกลุมคําสั่งที่อาจเกิดขอผิดพลาด จะทําการสงออบเจกต Exception เพื่อสงไปจัดการตอไป บล็อก catch คือคําสั่งภายในบล็อกจะทําการจัดการกับขอผิดพลาดที่เกิดขึ้น โดยจะตองระบุชนิดออบเจกตของคลาส Exception ที่ตองการจัดการ
[statements] ที่อยูในบล็อก try คือประโยคคําสั่งที่อาจเกิดขอผิดพลาด ExceptionType คือคลาสประเภท Exception ที่ตองจัดการเมื่อมีขอผิดพลาดเกิดขึ้น parameterExceptionName คือชื่อออบเจกตที่เปนพารามิเตอร ที่ใชจัดการขอผิดพลาดในบล็อก catch [statements] ที่อยูในบล็อก catch คือประโยคคําสั่งที่จัดการกับขอผิดพลาดของออบเจกตชื่อ parameterExceptionName
การจัดการ Exceptions ด้วย Java การดักจับ exception ต้องใช้คำสั่ง try-catch block ดังนี้ try{ //statements } catch(ExceptionClassName1 objRef1){ //exception handler code catch(ExceptionClassName2 objRef2){ ... catch(ExceptionClassNameN objRefN){ finally{
ตัวอย่างการใช้ try-catch block public class ExceptionDemo { public static void main(String args[]){ int a,b,c; a = 5; b = 0; try{ c = a/b; System.out.println(c); } catch(ArithmeticException e){ System.out.println(e); finally{ System.out.println("End");
ตัวอย่างการใช้ try-catch block (cont.) public class ExceptionDemo { public static void main(String args[]) int a[] = {1,2,3}; try{ System.out.println(a[4]); } catch(ArithmeticException e){ System.out.println(e); catch(ArrayIndexOutOfBoundsException e){ finally{ System.out.println("End");
ตัวอย่างการใช้ try-catch block (cont.) ถ้าเราไม่ทราบชื่อหรือจำชื่อคลาสของ exception ที่ดักจับไม่ได้เราก็ใช้ Exception เป็นพารามิเตอร์ของ Catch block แทนได้ public class ExceptionDemo { public static void main(String args[]) int a[] = {1,2,3}; try{ System.out.println(a[4]); } catch(Exception e){ System.out.println(e); finally{ System.out.println("End");
Finally Block โดยปกติโปรแกรมจะดำเนินงานใน try block หรือ catch block แล้วจะต้องดำเนินคำสั่งสุดท้ายเสมอก็คือ finally block เพื่อการทำงานบางอย่างเช่น ปิดไฟล์ หรือ คืนหน่วยความจำให้กับระบบ เป็นต้น
ตัวอย่าง finally block public class ExceptionDemo { public static void main(String args[]){ for(int i = -2;i <= 2 ;i++) try{ System.out.println(10/i); } catch(Exception e){ System.out.println("Catch Block"); break; finally{ System.out.println("Finally Block");
ตัวอย่างประยุกต์ใช้กับ database ศึกษา slide เกี่ยวกับการติดต่อฐานข้อมูลและการใช้ JDBC ประกอบพร้อมฟังอธิบายประกอบ การเชื่อมต่อฐานข้อมูล import java.sql.*; public class AlumniCreate { public static void main(String[] args) { String DBUrl = "jdbc:mysql:///test"; try { Class.forName("org.gjt.mm.mysql.Driver"); Connection conn = DriverManager.getConnection(DBUrl); Statement stmt = conn.createStatement(); stmt.executeUpdate("CREATE TABLE alumni" + " (id varchar(8), name varchar(40), addr varchar(100), grad_year int)"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }
import java.sql.*; public class AlumniCreate { public static void main(String[] args) { String DBUrl = "jdbc:mysql:///test"; try { Class.forName("org.gjt.mm.mysql.Driver"); Connection conn = DriverManager.getConnection(DBUrl); Statement stmt = conn.createStatement(); stmt.executeUpdate("CREATE TABLE alumni" + " (id varchar(8), name varchar(40), addr varchar(100), grad_year int)"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }
import java.sql.*; import javax.swing.JOptionPane; public class AlumniInsert { public static void main(String[] args) { String DBUrl = "jdbc:mysql:///test"; String name, id, addr, year; boolean stop=true; while(stop){ id = JOptionPane.showInputDialog(null,"Enter: id "); if ( id.equals("STOP") ) { stop = false; break; } int checkend = Integer.parseInt(id); if ( checkend ==0) {stop = false; break; } name = JOptionPane.showInputDialog(null,"Enter: Name "); addr = JOptionPane.showInputDialog(null,"Enter: Address "); year = JOptionPane.showInputDialog(null,"Enter: year ");
try { Class.forName("org.gjt.mm.mysql.Driver"); Connection conn = DriverManager.getConnection(DBUrl); String cmd = "INSERT INTO Alumni (id, name, addr, grad_year) " + " VALUES ('"+ id + "','" + name + "','" + addr + "', " + year+ " ) "; Statement stmt = conn.createStatement(); stmt.executeUpdate(cmd); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { } } //end while System.exit(0);
import java.sql.*; import javax.swing.JOptionPane; public class Alumniedit { public static void main(String[] args) { String DBUrl = "jdbc:mysql:///test"; String name2edit , id2del, addr, year; boolean stop=true; while(stop){ id2del = JOptionPane.showInputDialog(null,"Enter: id to edit: "); int checkend = Integer.parseInt(id2del); if ( checkend ==0) {stop = false; break; } name2edit = JOptionPane.showInputDialog(null,"Enter: Name to edit: "); try { Class.forName("org.gjt.mm.mysql.Driver"); Connection conn = DriverManager.getConnection(DBUrl); String cmd = "UPDATE alumni SET name ='"+name2edit+"' WHERE id="+id2del; Statement stmt = conn.createStatement(); int result = stmt.executeUpdate(cmd); stmt.executeUpdate(cmd); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { } } //end while System.exit(0);
import java.sql.*; import javax.swing.JOptionPane; public class Alumnidelete { public static void main(String[] args) { String DBUrl = "jdbc:mysql:///test"; String name, id2del, addr, year; boolean stop=true; while(stop){ id2del = JOptionPane.showInputDialog(null,"Enter: id to delete "); int checkend = Integer.parseInt(id2del); if ( checkend ==0) {stop = false; break; } try { Class.forName("org.gjt.mm.mysql.Driver"); Connection conn = DriverManager.getConnection(DBUrl); String cmd = "DELETE FROM alumni WHERE id = " +id2del; Statement stmt = conn.createStatement(); int result = stmt.executeUpdate(cmd); stmt.executeUpdate(cmd); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { } } //end while System.exit(0);
import java.sql.*; import javax.swing.JOptionPane; public class Alumnioutfile { public static void main(String[] args) { String DBUrl = "jdbc:mysql:///test"; try { Class.forName("org.gjt.mm.mysql.Driver"); Connection conn = DriverManager.getConnection(DBUrl); String message2 = JOptionPane.showInputDialog(null,"INPUT FILE"); String message = JOptionPane.showInputDialog(null,"OUTPUT 'FILENAME.txt "); // String message = " \"alumni.txt\" "; String cmd = "select * into outfile "+message+" from "+message2+" " ; Statement stmt = conn.createStatement(); stmt.execute(cmd); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { } System.exit(0);
import java.sql.*; public class AlumniRetrieval { public static void main(String[] args) { String DBUrl = "jdbc:mysql:///test"; try { Class.forName("org.gjt.mm.mysql.Driver"); Connection conn = DriverManager.getConnection(DBUrl); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM alumni"); while (rs.next()) { System.out.print("ID: " + rs.getString(1)); System.out.print(" Name: " + rs.getString(2)); System.out.println(" Graduation: " + rs.getInt(4)); System.out.println(""); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) {
The End