예외처리(Exception)
1. 프로그램 실행시 발생하는 오류를 붙잡아주는 기능.
오류 - 문법적인 오류(컴파일 단계에서 체크). 실행 오류(실행 단계에서 체크). 예외(실행 단계에서 체크).
예외 - 탐색기에서 CD드라이브를 더블클릭하는 경우 CD의 내용을 나타나기도 하고(예상 결과), CD를 넣으라는 메시지가 나타나기도(예외 상황) 한다.
예외 처리를 하지 않았다면 CD를 넣지 않은 경우 오류 발생하면서 프로그램이 종료되버린다.
2. Exception 클래스
- ArithmeticException
- ArrayStoreException
- IndexOutOfBoundsException
- ClassCastException
- NullPointerException
3. 예외 처리 형식
try {
//오류 발생 가능성이 있는 실행문;
} catch(예외종류) {
//처리 방법
}
//Exception 처리 없는 경우
//Sample01.java
package com.test;
public class Sample01 {
public static void main(String[] args) {
//Exception 처리 없는 경우
int[] arr = {1, 2, 3, 4, 5};
//오류를 인위적으로 발생시키기 위해서
// a<=arr.length 형태로 코딩함.
for (int a=0; a<=arr.length; a++) {
System.out.println(arr[a]); //오류 발생 위치
}
//아래 문장이 실행 가능한지 여부 확인
System.out.println("오류 발생 위치 이후에 있는 문장");
//->실행 불가
}
}
//Exception 처리 있는 경우
//Sample02.java
package com.test;
public class Sample02 {
public static void main(String[] args) {
//Exception 처리 있는 경우
int[] arr = {1, 2, 3, 4, 5};
try {
//오류를 인위적으로 발생시키기 위해서
// a<=arr.length 형태로 코딩함.
for (int a=0; a<=arr.length; a++) {
System.out.println(arr[a]); //오류 발생 위치
}
} catch(Exception e) {
System.out.println(e.toString());
}
//아래 문장이 실행 가능한지 여부 확인
System.out.println("오류 발생 위치 이후에 있는 문장");
//->실행 가능
}
}
try~catch 구문
1. 예외처리를 담당하는 구문. 예외가 발생할 수 있는 부분을 try 블럭으로 감싸주면 예외처리를 할 수 있다.
2. 형식
형식1 -------
try {
//실행문;
} catch(예외종류) {
//예외처리
}
형식2 -------
try {
//실행문;
} [catch(하위예외) { //예를들어, FileNotFoundException
//예외처리
} catch(하위예외) { //예를들어, IOException
//예외처리
}] catch(상위예외) { //예를들어, Exception
//예외처리
}
형식3 -------
try {
//실행문;
} catch(예외종류) {
//예외처리
} [finally {
//예외 발생과 관련없이 항상 실행되는 부분;
}]
//예외가 발생해도 프로그램이 중지되지 않도록 하는 방법-예외 처리
//Sample03.java
package com.test;
import java.util.Scanner;
public class Sample03 {
public static void main(String[] args) {
//무한 실행
do {
Scanner sc = new Scanner(System.in);
try {
//입력
System.out.print("숫자1 연산자 숫자2?");
int n1 = sc.nextInt();
if (n1 == -1) {
break;
}
String op = sc.next();
int n2 = sc.nextInt();
//처리
String result = "";
//연산 과정 추가할 것.
//연산자 종류별로 연산하고 그 결과를
//String형으로 변환해서 result에 저장.
//출력
System.out.printf("%d %s %d = %s %n"
, n1, op, n2, result);
} catch(Exception e) {
System.out.println("숫자1 연산자 숫자2 형태로만 입력하세요!");
}
}while(true);
}
}
예외 발생 가능성 확인
-> 메소드 원형에서 예외 가능성과 종류를 확인할 수 있다.
//Integer.parseInt() 메소드에서 예외 종류 확인
//Sample04.java
package com.test;
import java.util.Scanner;
public class Sample04 {
public static void main(String[] args) {
//무한 실행
do {
Scanner sc = new Scanner(System.in);
try {
//입력
System.out.print("숫자1 연산자 숫자2?");
String num1 = sc.next();
//Integer.parseInt() 메소드 원형 확인
//public static int parseInt(String s) throws NumberFormatException
//메소드 이름 끝에 있는
//throws NumberFormatException 부분이
//예외 발생 가능성과 종류를 표시한 부분
int n1 = Integer.parseInt(num1);
if (n1 == -1) {
break;
}
String op = sc.next();
String num2 = sc.next();
int n2 = Integer.parseInt(num2);
//처리
String result = "";
//연산 과정 추가할 것.
//연산자 종류별로 연산하고 그 결과를
//String형으로 변환해서 result에 저장.
//출력
System.out.printf("%d %s %d = %s %n"
, n1, op, n2, result);
} catch(Exception e) {
System.out.println("숫자1 연산자 숫자2 형태로만 입력하세요!");
}
}while(true);
}
}
throws 구문
1. 예외처리를 담당하는 구문. try~catch는 예외 발생시 try~catch 구문이 처리하지만, throws는 예외 발생시 외부에 예외를 넘기게 된다.
2. 형식
접근지정자 반환자료형 메소드이름(매개변수 리스트) throws 예외종류 {
//실행문;
//예외 발생 가능성이 있는 문장;
return 값;
}
//예외 처리를 throws 구문으로 처리하는 경우
package com.test;
import java.util.Scanner;
public class Sample05 {
// throws Exception 부분 추가할 것
//인스턴스 멤버
private String calc() throws Exception {
String msg = "";
//입력
Scanner sc = new Scanner(System.in);
System.out.print("숫자1 연산자 숫자2?");
int n1 = sc.nextInt();
if (n1 == -1) {
return null;
}
String op = sc.next();
int n2 = sc.nextInt();
//처리
String result = "";
//연산 과정 추가할 것.
msg = String.format("%d %s %d = %s %n"
, n1, op, n2, result);
return msg;
}
//스태틱 멤버
public static void main(String[] args) {
//객체 생성
Sample05 obj = new Sample05();
//무한 실행
do {
try {
//출력
//인스턴스 멤버 호출
String msg = obj.calc(); //입력, 처리
if (msg == null) {
break;
}
System.out.print(msg);
} catch(Exception e) {
System.out.println(e.toString());
}
}while(true);
}
}
JDBC (Java DataBase Connectivity)
1. 자바 프로그램이 DBMS에 일관된 방식으로 접근할 수 있도록 제공하는 API.
2. JDBC는 데이터베이스에 접속하기 위해서 한 개의 클래스(java.sql.DriverManager)와 두 개의 인터페이스(java.sql.Driver, java.sql.Connection)을 사용한다.
3. 오라클용 JDBC 드라이버(ojdbc14.jar)를 Java/jdk1.7.XX/jre/lib/ext 폴더와 Java/jre7/lib/ext 폴더에 복사할 것. ojdbc14.jar 파일은 오라클 설치 폴더에서 복사할 수 있음.
//오라클 연결 테스트
//Oracle01.java
package com.test;
import java.sql.*;
public class Oracle01 {
public static void main(String[] args) {
//오라클 연결 테스트
//오라클 서버 위치(IP주소, 포트번호, SID), 계정이름, 암호
//IP주소 - localhost
//포트번호 - 1521
//SID - xe
//계정이름 - hr
//암호 - lion
try {
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "hr";
String pw = "lion";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(url, user, pw);
System.out.println("오라클 데이터베이스에 연결되었습니다.");
} catch(Exception e) {
System.out.println(e.toString());
}
}
}
//연결 전용 클래스 작성
//DBConn.java
package com.test;
import java.sql.*;
public class DBConn {
//Singleton pattern
private static Connection dbConn;
public static Connection getConnection()
throws SQLException, ClassNotFoundException {
if (dbConn == null) {
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "scott";
String pw = "tiger";
Class.forName("oracle.jdbc.driver.OracleDriver");
dbConn = DriverManager.getConnection(url, user, pw);
}
return dbConn;
}
public static void close()
throws SQLException {
if (dbConn != null) {
if (!dbConn.isClosed()) {
dbConn.close();
}
}
dbConn = null;
}
}
//Oracle02.java
package com.test;
import java.sql.*;
public class Oracle02 {
public static void main(String[] args) {
//DBConn 클래스를 이용한 오라클 연결 테스트
try {
Connection conn = DBConn.getConnection();
System.out.println("오라클 데이터베이스에 연결되었습니다.");
}catch(Exception e){
System.out.println(e.toString());
}
}
}
SQL 쿼리 전송 테스트1 (scott 계정)
//회원 테이블 생성. 회원번호, 이름, 전화번호. 시퀀스 객체 생성.
CREATE TABLE member (
mid NUMBER --PK
,name VARCHAR2(10)
,tel VARCHAR2(20)
);
ALTER TABLE member
ADD CONSTRAINT member_mid_pk PRIMARY KEY(mid);
CREATE SEQUENCE memberSeq;
//회원 테이블에 자료 입력. INSERT 쿼리.
//쿼리문의 끝에 ; 표시하지 말것.
//INSERT INTO member (mid, name, tel) VALUES (memberSeq.nextval, 'hong', '111-1111')
//Oracle03.java
package com.test;
import java.sql.*;
public class Oracle03 {
public static void main(String[] args) {
try {
//연결
Connection conn = DBConn.getConnection();
//쿼리 준비
//쿼리 작성시 끝에 ; 표시하지 말것.
String sql = String.format("INSERT INTO member (mid, name, tel) VALUES (memberSeq.nextval, 'hong', '111-1111')");
//쿼리 실행
//Java에서 쿼리를 실행하면
//내부적으로 COMMIT은 자동 실행됨.
//executeUpdate() 메소드는 DML문인 경우만 실행.
Statement stmt = conn.createStatement();
int count = stmt.executeUpdate(sql);
//결과 출력
System.out.printf("%d개의 행이 입력되었습니다. %n"
, count);
}catch(Exception e) {
System.out.println(e.toString());
}
}
}
//회원 테이블 자료 출력. SELECT 쿼리.
//쿼리문의 끝에 ; 표시하지 말것.
//SELECT mid, name, tel FROM member
//Oracle04.java
package com.test;
import java.sql.*;
public class Oracle04 {
public static void main(String[] args) {
try {
//연결
Connection conn = DBConn.getConnection();
//쿼리 준비
//쿼리 작성시 끝에 ; 표시하지 말것.
String sql = String.format("SELECT mid, name, tel FROM member");
//쿼리 실행
//executeQuery() 메소드는 DQL문인 경우만 실행.
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql); //결과집합
//결과 출력
while(rs.next()) { //row 단위 접근
int mid = rs.getInt("mid"); //column 단위 접근
String name = rs.getString("name");
String tel = rs.getString("tel");
System.out.printf("%d %s %s %n"
, mid, name, tel);
}
//ResultSet 객체 소멸->필수
rs.close();
}catch(Exception e) {
System.out.println(e.toString());
}
}
}
문제) member 테이블의 회원수를 출력하는 프로그램 작성.
//SELECT COUNT(*) AS count FROM member
//Oracle05.java
package com.test;
import java.sql.*;
public class Oracle05 {
public static void main(String[] args) {
try {
//연결
Connection conn = DBConn.getConnection();
//쿼리 준비
//쿼리 작성시 끝에 ; 표시하지 말것.
String sql = String.format("SELECT COUNT(*) AS count FROM member");
//쿼리 실행
//executeQuery() 메소드는 DQL문인 경우만 실행.
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql); //결과집합
//결과 출력
while(rs.next()) { //row 단위 접근
int count = rs.getInt("count"); //column 단위 접근
System.out.printf("회원수 : %d명 %n"
, count);
}
//ResultSet 객체 소멸->필수
rs.close();
}catch(Exception e) {
System.out.println(e.toString());
}
}
}
문제) 이름과 전화번호를 저장하는 JDBC 프로그램 작성. 오라클 이용.
데이터 입력과 INSERT 쿼리 실행을 반복 실행. 입력이 끝나면 SELECT 쿼리와 출력문 실행.
실행 예)
이름 전화번호(1)?홍길동 010-123-1234
이름 전화번호(2)?김길동 010-222-3333
이름 전화번호(3)?-1
----------------------------
전체 회원수 : 2명
----------------------------
회원번호 이름 전화번호
----------------------------
1 홍길동 010-123-1234
2 김길동 010-222-3333
----------------------------
//DBConn.java
package com.test;
import java.sql.*;
public class DBConn {
//Singleton pattern
private static Connection dbConn;
public static Connection getConnection()
throws SQLException, ClassNotFoundException {
if (dbConn == null) {
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "scott";
String pw = "tiger";
Class.forName("oracle.jdbc.driver.OracleDriver");
dbConn = DriverManager.getConnection(url, user, pw);
}
return dbConn;
}
public static void close()
throws SQLException {
if (dbConn != null) {
if (!dbConn.isClosed()) {
dbConn.close();
}
}
dbConn = null;
}
}
//Oracle06.java
package com.test;
import java.sql.*;
import java.util.*;
public class Oracle06 {
private static Connection conn;
private static int count() throws SQLException {
int count = 0;
String sql = String.format("SELECT COUNT(*) AS count FROM member");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()) {
count = rs.getInt("count");
}
rs.close();
return count;
}
public static void main(String[] args) {
try {
//1단계. 연결
conn = DBConn.getConnection();
//2단계. 입력
Scanner sc = new Scanner(System.in);
int a= count()+1;
do {
System.out.printf("이름 전화번호(%d)?", a++);
String name = sc.next(); //이름
if (name.equals("-1")) {
break;
}
String tel = sc.next(); //전화번호
//쿼리 준비
String sql = String.format("INSERT INTO member (mid, name, tel) VALUES (memberSeq.nextval, '%s', '%s')", name, tel);
//쿼리 실행
Statement stmt = conn.createStatement();
stmt.executeUpdate(sql);
}while(true);
//3단계. 결과 출력
StringBuilder sb = new StringBuilder();
String sql = String.format("SELECT mid, name, tel FROM member");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()) {
int mid = rs.getInt("mid");
String name = rs.getString("name");
String tel = rs.getString("tel");
sb.append(String.format("%d %s %s %n"
, mid, name, tel));
}
rs.close();
System.out.println("----------------------");
System.out.printf("전체 회원수 : %d명 %n"
, count());
System.out.println("----------------------");
System.out.println("이름 전화번호");
System.out.print(sb.toString());
System.out.println("----------------------");
} catch(Exception e) {
System.out.println(e.toString());
}
}
}