본문 바로가기

[JAVA]

[JAVA]9월 24일 예외처리, 예외의 종류, 정규 표현식, Pattern클래스

*예외처리 : 잘못된 코드, 부정확한 데이터, 예외적인 상황에의하여 발생하는 오류.

ex)

// int x = 1;

// int y = 0;

// System.out.println("한번나눠볼까");

// try{

// int result = x / y;              //y가 0이 아니라면  바로 출력 , 0이라면 밑에 catch문 실행.

//

// }

// catch(Exception e){

// System.out.println("0으로 나눌 수 없습니다.");

// }

// System.out.println("이코드가 출력이 될까요?");

finally 블록

오류가 발생하였건 발생하지 않았건 항상 실행 되어야 하는 코드는 finally블록에 넣을 수 있다.

try catch 문 밑에 finally { ~~~ } 이런식으로.


*예외의 종류

IOException 같은 경우는 예외처리를 해주지 않으면 호출 시 컴파일러가 에러를 알려준다.

ex)

public static String readString(){

byte[] buf = new byte[100];

System.out.println("문자열을 입력하시오.");

System.in.read(buf);     // read 메소드는 체킹예외인 IOException을 발생시키                                             기 때문에 호출시 예외처리를

return new String(buf);  // 해주지 않으면 컴파일러가 에러를 알려줌.

}

public static void main(String[] args) {

           System.out.println(readString());

예외처리 방법

1. 예외를 직접 처리하는 방법.

위 read 메소드에 에러가 뜨는데 그곳에 마우스를 올려 놓으면 두가지 방법이 나온다. 첫번째로 직접 처리하는방법을 누르면.

public static String readString(){

byte[] buf = new byte[100];

System.out.println("문자열을 입력하시오.");

try {

System.in.read(buf);

} catch (IOException e) {

// FIXME Auto-generated catch block

e.printStackTrace();

}    

return new String(buf); 

}

public static void main(String[] args) {

// FIXME Auto-generated method stub

System.out.println(readString());

첫번째 방법 으로 하면 try catch 구문이 만들어진다.


2. 두번째 방법은 예외를 전가. 해당 문장이 포함된 함수를 호출하는 놈에게 토스.


public static String readString() throws IOException{

byte[] buf = new byte[100];

System.out.println("문자열을 입력하시오.");

System.in.read(buf);   

return new String(buf);  

}

public static void main(String[] args) { 

// FIXME Auto-generated method stub

try {

System.out.println(readString());

} catch (IOException e) {

// FIXME Auto-generated catch block

e.printStackTrace();

}

 // readString() 에서 전가한 예외를 메인함수에서 처리함.↑



**정규 표현식과 Pattern클래스

문자열이 정해져 있는 형식으로 구성되어 있는지 검증해야 하는 경우가 있다.

예를 들어, 이메일, 전화번호 사용자가 제대로 입력했는지 검증해야 할 때 정규표현식과 비교한다.

ex)010-8888-7777 라는 전화 번호를 정규표현식으로 표현해보면

 (02|010)-\d{3,4}-\d{4}

 맨처음 02or010은 010또는 02를 나타내고

-           <<요놈은 상수처럼 사용 된다.(전화번호에는 항상 붙으니까 넣어주시고)

\d{3,4}      이놈은 3자리또는 4자리의 숫자를 말한다.

마찬가지로 -    <<이거는 -를 포함한다는 것.

\d{4}        4자리의 숫자를 말한다.

이메일을 정규표현식으로 바꿔 보겠다  (jsm9301@hanmail.net)

\w+@\w+\.\w+(\.\w+)?

\w+               이것은 한개 이상의 알파벳 또는 숫자 를 말한다.

@                    요놈은 -와 마찬가지;

\w+               한개 이상의 알파벳 또는 숫자를 말한다.

\.                 << .은 - 나 @처럼 그냥 사용할 수 없다.  .은 모든문자중에서 한개의 문자를 뜻한다.

\w+              한개 이상의 알파벳또는 숫자.

(\.\w+)?     << 이것이 없거나 한번더 올 수 있음.

예를 들자면 이메일중에 asjfa@yahoo.co.kr 같은 이메일들이 있는데 요런메일들은 저 것이 없으면 안된다.



 * Pattern 클래스

boolean result = Pattern.matches("정규식","검증할 문자열")  

정규표현식 으로 문자열을 검증하는 방법.

ex)

public static void main(String[] args) {

// FIXME Auto-generated method stub

String regExp = "(02|010)-d{3,4}-d{4}";

String data = "010-123-4567";

boolean result = Pattern.matches(regExp, data);

if(result)

System.out.println("일치 합니다.");

else

System.out.println("불일치 합니다.");

regExp = "w+@w+.w+(.\w+)?";

data = "jsm9301@naver.com";

result = Pattern.matches(regExp, data);

if(result)

System.out.println("일치 합니다.");

else

System.out.println("불일치 합니다.");