예외 처리
예외
프로그램이 진행하는 과정에서 만나게 되는 오류
예외 처리 목적
프로그램 진행시 발생할 수 있는 상황들을 미리 정해놓고, 해당하는 예외가 발생했을 경우 적절한 조치를 취해서 프로그램이 정상적으로 작동하도록 하기 위함
예외 처리 방법
1) Handle하는 방법 - try ~catch절을 이용
2) Declatre(선언)gksms qkdqjq - throws절을 이용
try - catch
package day18;
public class ExceptionTest1 {
public static void main(String[] args) {
String [] fruits = {"사과","배","포도"};
try {
for(int i=0;i<5;i++) {
System.out.println(fruits[i]);
}
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println("배열 인덱스 범위 초과됐어요");
}
System.out.println("반드시 실행되어야 할 코드");
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
package day18;
public class ExceptionTest2 {
public static void main(String[] args) {
try {
for(int i=1;i<=5;i++) {
int k=50/(i-3);
System.out.println(k);
}
}catch(ArithmeticException e) {
System.out.println("산술 오류");
}
System.out.println("The end!");
}
}
-25 -50 산술오류
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
package day18;
public class ExceptionTest3 {
public static void main(String[] args) {
for(int i=1;i<=5;i++) {
try {
int k=50/(i-3);
System.out.println(k);
}catch(ArithmeticException e) {
System.out.println("산술오류");
}
}
System.out.println("the end!");
}
}
-25 -50 산술오류 50 25
여러 개의 예외가 발생할 경우
try{}블럭은 하나에 catch 절은 여러 개 올 수 있따.
그러나 이떄 catch 순서에 주의해야 한다.
-부모와 자식의 상속관계가 있는 예외일 경우
자식 예외를 먼저 catch하고 부모 예외를 나중에 catch한다.
Exception
- ArighmeticException
- NullPointerException
- NumberFormatException
반드시 수행하고 지나가야하는 절은 finally로 감싼다.
finally는 제대로 수행해도 가므로 조심
package day18;
import javax.swing.*;
/*
* 여러 개의 예외가 발생할 경우
* try{}블럭은 하나에 catch 절은 여러 개 올 수 있따.
* 그러나 이떄 catch 순서에 주의해야 한다.
* -부모와 자식의 상속관계가 있는 예외일 경우
* 자식 예외를 먼저 catch하고 부모 예외를 나중에 catch한다.
* */
public class ExceptionTest4 {
public static void main(String[] args) {
String str =JOptionPane.showInputDialog("정수");
try {
int num = Integer.parseInt(str);
int k=50/num;
System.out.println(k);
String s = null;
System.out.println(s.toUpperCase());
}catch(NumberFormatException e) {
System.out.println("input 오류");
}catch(ArithmeticException e) {
System.out.println("계산 오류");
return;
}catch(Exception e) {
System.out.println("모든 exception의 부모"+e);
}finally {
//finally절은 반드시 한번은 수행하는 블럭이다.
//System.exit(0);이 위에 오면 finally가 적용되지 않는다.
}
System.out.println("반드시 수행해야 할 코드");
System.out.println("the end");
}
}
template 만들기
드래그 복사 - Windows - preference - template - java - Editor - Templates
- new - (template 이름) - Pattern에 붙여 넣기 - apply and close
- template 이름 + ctrl + space 하면 사용 가능
이벤트 복습
* 이벤트 소스 : JButton
* 이벤트 : ActionEvent
* 이벤트 핸들러 : ActionListener (인터페이스)
* 1)이벤트 패키지 import
* 2)XXXListener를 상속받는다
* 3)추상메소드 재정의(빈블럭)
* 4)이벤트 소스에 addXXXListener (핸들러객체)를 이용해 리스너 부착
* 5)재정의한 메소드에 이벤트 처리 코드 구현
버튼 단축키 설정, 풍선말 띄우기,
package day18;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import day16.MyJPanel;
public class AlignEvent2 extends JFrame implements ActionListener{
JPanel p = new MyJPanel(10,10,10,10);
JButton b1, b2;
JTextField t1,t2,t3;
JLabel jl1, jl2, jl3;
public AlignEvent2() {
super("::AlignEvent::");
Container cp = getContentPane();
cp.add(p, "Center");
p.setBackground(Color.white);
p.setLayout(new GridLayout(4,2,10,10));
jl1 = new JLabel("First Input : ");
jl2 = new JLabel("Second Input : ");
jl3 = new JLabel("Result");
b1 = new JButton("Plus", new ImageIcon("images/11.PNG"));
b2 = new JButton("Reset",new ImageIcon("images/22.PNG"));
//버튼 단축키 설정
b1.setMnemonic('P'); //단축키 설정 Alt + P
b2.setMnemonic('R'); //Alt + R
t1 = new JTextField();
t2 = new JTextField();
t3 = new JTextField();
//풍선말 띄우기
b1.setToolTipText("더하기 버튼");
b2.setToolTipText("초기화 버튼");
//편집 불가능하도록
t3.setEditable(false);
p.add(jl1);
p.add(t1);
p.add(jl2);
p.add(t2);
p.add(jl3);
p.add(t3);
p.add(b1);
p.add(b2);
b1.addActionListener(this);
b2.addActionListener(this);
//폰트설정
t1.setFont(new Font("sans-serif",Font.BOLD,22));
t2.setFont(new Font("sans-serif",Font.BOLD,22));
t3.setFont(new Font("sans-serif",Font.BOLD,22));
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if(obj==b1) {
try {
int a1 = Integer.parseInt(t1.getText());
int a2 = Integer.parseInt(t2.getText());
t3.setText(String.valueOf(a1+a2));
t3.setText(""+(a1+a2));
}catch(NumberFormatException a) {
t1.setText("");
t2.setText("");
t1.requestFocus();
t3.setText("정수를 입력");
}
}else if(obj==b2) {
t1.setText("");
t2.setText("");
t3.setText("");
//t1에 입력 포커스 주기
t1.requestFocus();
}
t1.validate();
t2.validate();
t3.validate();
}
public static void main(String[] args) {
AlignEvent2 ae = new AlignEvent2();
ae.setSize(500, 500);
ae.setVisible(true);
}
}
Oracle함수
DUAL table은
oracle이 가지고 있는 dummy table
1행 1열만 가지고 있음
SQL 함수
#함수의 특징 및 이점
1) 데이터에 연산을 수행할 수 있다.
2) 개별적인 데이터 항목을 수정할 수 있다.
3) 행의 그룹에 대해 결과를 조작할 수 있다.
4) 출력을 위한 날짜와 숫자형식을 조절할 수 있따.
5) 열의 자료형을 변환할 수 있다.
# 함수 종류
1) 단일행 함수
2) 그룹 함수
3) 기타 함수
# 단일행 함수######################################################
- 단일 행에 대해서만 적용 가능하고 행별로 하나의 결과를 반환한다.
CF> 그룹 함수
- 단일행 함수와 달리 그룹함수는 여러 행 또는 테이블 전체에 대해
함수가 적용되어 하나의 결과를 가져오는 함수를 말한다.
함수명 (컬럼|표현식[arg1,arg2....])
- 단일행 함수 종류
1) 문자형 함수: 문자를 입력받고 문자와 숫자 모두를 반환할 수 있다.
2) 숫자형 함수: 숫자를 입력받고 숫자를 반환한다.
3) 날짜형 함수: 날짜형에 대해 수행하고 숫자를 반환하는 MONTHS_BETWEEN
함수를 제외하고 모두 날짜 데이터형의 값을 반환한다.
4) 변환형 함수: 어떤 데이터형의 값을 다른 데이터형으로 변환한다.
5) 일반적인 함수: NVL, DECODE
- 단일행 함수의 특징
1) 질의에서 반환되는 각각의 행에 대해 수행
2) 행별로 하나의 결과를 반환
3) 참조시 사용한 데이터형과 다른 데이터형으로 결과를 반환할 수 있다.
4) 하나 이상의 인수를 필요로 한다.
5) SELECT,WHERE,ORDER BY 절에서 사용할 수 있다.
6) 함수를 중첩할 수 있다.
단일행 함수들은 여러 레벨에 걸쳐 중첩사용이 가능하다.
중첩된 함수들은 가장 하위 레벨에서 가장 상위 레벨
순으로 진행된다.
1. 문자형 함수
------------------------------------------------------
종류 함수 사용목적
------------------------------------------------------
변환함수 LOWER 알파벳을 소문자로 변환
UPPER 알파벳을 대문자로...
INITCAP 첫번째 글자만 대문자로 변환
------------------------------------------------------
문자조작함수 CONCAT 두 문자열을 연결
SUBSTR 문자열 중 특정 문자 또는 문자열의
일부분을 선택
LENGTH 문자열의 길이를 구함
LPAD 왼쪽 문자 자리채움
RPAD 오른쪽 문자 자리 채움
LTRIM 왼쪽 문자를 자름
RTRIM 오른쪽 문자를 자름
REPLACE 특정 문자열을 대신
------------------------------------------------------
LOWER/UPPER
-LOWER는 대문자를 소문자로, UPPER는 소문자를 대문자로
바꿔서 출력하는 함수
select lower('HAPPY BIRTHDAY') from daul;==>happy birthday
select upper('happy birthday') from daul;==>HAPPY BIRTHDAY
[잠깐!] **dual테이블은 무엇?*****************************************
연산이나 날짜 등에 대한 정보를 보기 위해 사용하는 테이블
한개의 행으로 구성되어 있다.
가령 2*4의 결과를 알고 싶다면...
select 2*4 from dual;
만약 select 2*4 from student; 한다면 학생테이블이 갖는 행의 수만큼 결과가 나옴
그러나 dual로 하면 한개의 행만 있으므로 동일 결과를 한개의 행으로만 볼 수 있음
*******************************************************************
[문제] 사원 테이블에서 SCOTT의 사번,이름,담당업무(소문자로),부서번호를
출력하세요. 사원테이블에서 이름이 'scott'인 사람의 정보를 출력하세요.
select empno,ename, lower(job) from emp
where ename='SCOTT';
INITCAP
-첫 문자를 대문자로 나머지는 소문자로 변환
DEPT테이블에서 컬럼의 첫 글자들만 대문자로 변환하여 모든
정보를 출력하라.
SELECT DEPTNO,INITCAP(DNAME),INITCAP(LOC) FROM DEPT;
CONCAT
- 두 개 이상의 문자나 컬럼을 서로 연결시켜 주는 함수
가령 우편번호와 주소 컬럼이 따로 떨어져 있다면 CONCAT 함수를 이용하여 하나의
컬럼처럼 사용할 수 있다.
- CONCAT(변수1, 변수2)
- 결과값: 변수1과 변수2를 연결한 값을 리턴. 단 변수1과 변수2에
숫자를 입력하더라도 문자로 인식하여 결합하게 된다.
select cocat('abcd','가나다라') from dual; ==>abcd가나다라
select cocat('123','456') from dual; ==>123456
SELECT EMPNO,ENAME,JOB,CONCAT(EMPNO,ENAME) E_NAME,
CONCAT(ENAME,JOB) E_JOB FROM EMP;
[문제]
상품 테이블에서 판매가를 화면에 보여줄 때 금액의 단위를 함께
붙여서 출력하세요.
select products_name, concat(output_price,'원') as 공급가 from products;
select products_name, output_price||'원' as 공급가 from products;
고객테이블에서 고객 이름과 나이를 하나의 컬럼으로 만들어 결과값을 화면에
보여주세요.
SUBSTR
- SUBSTR(변수, X, Y)
:문자 X로 시작한 Y개 문자 길이만큼 변수를 리턴합니다.
만일 X가 0이라면 1로 처리되고 X가 음수라면 문자는 끝에서 부터
시작하고
오른쪽으로부터 세어서 리턴한다.
또한 Y가 없다면 디폴트로 전체를 의미하고
Y가 1 이하라면 NULL이 리턴된다.
주민번호를 앞번호만 물러내어 정보를 알려주고 싶은 경우 사용
select substr('ABCDEFG',3,3) from dual ==> CDE
select substr('ABCDEFG',-3,3) from dual ==> EFG
select substr('891222-2123123',8,7) from dual ==> 2123123
select substr('8912222123123',7) from dual==> -2123123
select substr('8912222123123',-7) from dual==> 2123123
[문제]
사원 테이블에서 첫글자가 'K'보다 크고 'Y'보다 작은 사원의
사번,이름,업무,급여를 출력하세요. 단 이름순으로 정렬하세요.
LENGTH
- 주어진 컬럼 또는 문자열의 길이를 리턴하는 함수
- LENGTH(변수 또는 컬럼)
- 결과값: 변수나 컬럼의 길이를 문자 단위로 리턴함.
만약 변수가 NULL일 경우는 NULL을 리턴
select length('891222-2123123') from dual ==>14
[문제]
사원테이블에서 부서가 20번인 사원의 사번,이름,이름자릿수,
급여,급여의 자릿수를 출력하세요.
사원테이블의 사원이름 중 6자리 이상을 차지하는 사원의이름과
이름자릿수를 보여주세요.
LPAD/RPAD
-문자값을 왼쪽/오른쪽부터 채운다.
-LPAD(컬럼,변수1,변수2)
SELECT ENAME,LPAD(ENAME,15,'*'), SAL,LPAD(SAL,10,'*')
FROM EMP WHERE DEPTNO=10;
SELECT RPAD(DNAME,15,'*') FROM DEPT
LTRIM
-왼쪽의 공백을 제거할 때 사용
- LTRIM(변수1, 변수2)
- 결과값: 변수1에 넣었던 값 중에서 변수2와 같은 단어가 있을 경우,
그 문자를
삭제한 나머지값을 리턴한다.
select ltrim('tttHello test','t') from dual; ==> Hello test
select ltrim(' Hello test',' ') from dual; ==> Hello test
[문제]
사원테이블에서 담당업무 중 좌측에 'A'를 삭제하고
급여중 좌측의 1을 삭제하여 출력하세요.
select ltrim(job,'A'), rtrim(sal,0) from emp;
RTRIM
- 오른쪽으로 부터 시작해서 값을 변경
select rtrim('tttHello test','t') from dual; ==> tttHello tes
[문제]
사원테이블에서 10번 부서의 사원에 대해 담당업무 중 우측에'T'를
삭제하고 급여중 우측의 0을 삭제하여 출력하세요.
REPLACE
- 정해진 컬럼이나 이름에서 지정한 문자를 특정 문자로 변경하는 함수
- REPLACE(인수1, 인수2, 인수3)
- 결과값: 인수1에 있는 값 중 인수2에 해당하는 단어를 인수3으로 변경
select replace('oracle test','test','hi') from dual; ==> oracle hi
[문제]
사원테이블 JOB에서 'A'를 '$'로 바꾸어 출력하세요.
select replace(job,'A','$') from emp;
고객 테이블의 직업에 해당하는 컬럼에서 직업 정보가 학생인 정보를 모두
대학생으로 변경해 출력되게 하세요.
select replace(job,'학생','고등학생') from member;
고객 테이블 주소에서 서울시를 서울특별시로 수정하세요.
update member set addr=concat('서울특별시',substr(addr,4))
where substr(addr,1,3)='서울시'; --where addr like '서울시';
update member set addr=replace(addr,'서울시','서울특별시');