1. 예외 처리
흔히 에러에는 여러가지 종류가 있습니다.
- 컴파일 에러는 컴파일 시 발생하고
- 런타임 에러는 실행을 할 때 발생하고
- 논리적 에러는 프로그램은 잘 돌아가지만 내가 짰던 의도와는 전혀 다르게 동작하여 개발자를 당혹케 하는 에러를 말합니다.
여기서 에러는 Exception입니다. 즉 다소 약한 정도의 에러를 말하고
Error는 심각한 치명적인 에러입니다.
2. 예외 처리하기
2-1) try~catch
try{
예외 발생 가능 코드
}catch(Exception e){
예외 발생 시 처리 코드
}
흔히 나눗셈을 하는 코드에서 에러가 발생합니다.
그 이유는 분모를 0으로해서 나누기 때문이죠. 이를 방지하려면 try~catch문으로 간단히 처리할 수 있습니다.
에러 발생
pulic static void main(String[] args) {
int number = 100;
int result = 0;
for (int i = 0; i < 10; i++) {
result = number / (int) (Math.random() * 10);
System.out.println(result);
}
}
즉 0으로 나누어질 수 도 있기 때문에 for문에서 예외처리가 되지 않았습니다.
public static void main(String[] args) {
int number = 100;
int result = 0;
for (int i = 0; i < 10; i++) {
try {
result = number / (int) (Math.random() * 10);
System.out.println(result);
} catch (ArithmeticException e) {
System.out.println("0 <- 예외처리");
}
}
}
for문 내부에 0으로 나눌 가능성이 있는 코드에 try로 감싸주고 catch로 ArithmeticException이 발생 시
문자를 찍어 줍니다. 즉 에러가 발생 시 catch문으로 들어가게 되죠
42
50
13
23
0 <- 예외처리
65
0 <- 예외처리
0 <- 예외처리
21
54
3. 에러 메시지?
printStackTrace() 와 getMessage()가 있습니다.
- printStackTrace(): 예외가 발생하면 스택에 있던 메서드 정보, 메시지 등을 화면에 출력합니다.
- getMessage(): 발생 예외클래스의 인스턴스에 저장된 메시지 출력합니다.
try{
}catch(Exception e){
e.getMessage();
e.printStackTrace();
}
4. 여러개의 catch
여러개의 catch 블럭을 사용하려면 catch문을 계속 열어주어도 되지만 복잡하므로
| 조건을 통해 사용합시다.
try {
//...
} catch (Exception1 | Exception2 e) {
e.printStackTrace();
}
5. 고의로 예외 발생시키기?
예외 객체를 생성 후 throw를 해줍니다.
public static void main(String[] args) {
try {
Exception e = new Exception("예외 발생!");
throw e;
} catch (Exception e) {
System.out.println("에러메시지 : "+e.getMessage());
e.printStackTrace();
}
System.out.println("정상종료...");
}
6. 예외 확인(확인X)하는 Exception
- 예외를 확인하는 것은 Exception 클래스들 ==> 런타임 제외
- 예외를 확인하지않는 것은 RuntimeException 클래스들 ==> 컴파일 정상 진행
7. 메서드 예외
void method() throws Exception1, Exception2, ..., ExceptionN {
// 메서드 내용
}
매서드 옆에 throws로 예외를 선언합니다.
이로인해 자손 까지도 예외가 발생합니다.
throws Exception 으로 할 경우 모든 종류 예외가 발생 가능성이 있습니다.
즉 예외를 처리하는 것이 아니라 예외를 호출한 메서드에게 전달하는 용도입니다.
말그대로 Throw 던지다...
public static void main(String[] args) {
String fileName = "";
File file = createFile(fileName);
System.out.println(file.getName() + "파일이 성공적으로 생성됨.");
}
static File createFile(String fileName) {
try {
if (fileName == null || fileName.equals(""))
throw new Exception("파일이름이 유효하지 않음.");
} catch (Exception e) {
fileName = "제목없음.txt";
} finally {
File file = new File(fileName);
createNewFile(file);
return file;
}
}
static void createNewFile(File file) {
try {
file.createNewFile();
} catch (Exception e) {
}
}
위 코드는 직접 예외가 발생한 곳에서 예외를 직접적으로 처리합니다.
즉 메인에서 filename을 공백처리하고 파일을 생성하는 createFile메서드를 호출합니다.
이 때 createFile에서는 try문에서 예외가 발생하여 throw를 합니다. 이에 따라 catch문으로 가게되고
제목없음.txt가 fileName에 담깁니다. 그리고 finally로 가서 예외 처리 후 작업을 진행하여 파일을 생성합니다.
따라서 결과는
제목없음.txt파일이 성공적으로 생성됨.
8. 사용자 정의 예외
Exception 클래스를 상속받아 정의합니다.
class MyException extends Exception {
MyException(String msg) {
super(msg);
}
}
public class NewExceptionTest {
public static void main(String[] args) {
try {
startInstall();
copyFiles();
} catch (SpaceException se) {
System.out.println("에러메시지 : " + se.getMessage());
se.printStackTrace();
System.out.println("공간을 확보해주세요.");
} catch (MemoryException me) {
System.out.println("에러메시지 : " + me.getMessage());
me.printStackTrace();
System.out.println("메모리가 부족합니다.");
} finally {
deleteTempFiles();
}
}
static void startInstall() throws SpaceException, MemoryException {
if (!enoughSpace())
throw new SpaceException("설치공간부족");
if (!enoughMemory())
throw new MemoryException("메모리부족");
};
static void copyFiles() {};
static void deleteTempFiles() {};
static boolean enoughSpace() {
// 설치 공간이 충분한지 판단하는 코드 작성
return false;
};
static boolean enoughMemory() {
// 설치 메모리가 충분한지 판단하는 코드 작성
return true;
};
}
class SpaceException extends Exception {
SpaceException(String msg) {
super(msg);
}
}
class MemoryException extends Exception {
MemoryException(String msg) {
super(msg);
}
}
사용자 정의 예외클래스 SpaceExcetpion과 MemoryException을 정의합니다.
위에서 에러 발생시 throw로 전달하고 메시지를 받아 이를 catch문에서 받아 이용합니다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
Java- 컬렉션 프레임워크(ArrayList) (0) | 2019.07.15 |
---|---|
Java - 컬렉션 프레임워크 (0) | 2019.07.15 |
Java- 인터페이스 (0) | 2019.07.11 |
Java- 추상클래스 (0) | 2019.07.10 |
Java - 다형성 (0) | 2019.07.10 |