컴파일 오류 : 프로그램 코드 작성 중 발생하는 문법적 오류
실행 오류(RunTime error) : 실행 중인 프로그램이 의도치 않은 동작을 하거나(bug), 프로그램이 중지되는 오류
실행 오류는 비정상 종료가 되는 경우 시스템에 심각한 장애를 발생시킴
프로그램의 비정상 종료를 피하여 시스템이 원활하게 실행되도록 함
실행 오류가 발생한 경우 오류의 과정을 재현하는 것은 현실적으로 힘들다
오류가 발생한 경우 log
를 남겨서 추후 log 분석
을 통해 그 원인을 파악하여 bug를 수정하는 것이 중요
시스템 오류(error)
: 가상 머신에서 발생, 프로그래머가 처리할 수 없는 오류
ex) 동적 메모리가 없는 경우, 스택 메모리 오버플로우 등
예외(Exception)
: 프로그램에서 제어 할 수 있는 오류
ex) 읽어들이려는 파일이 존재하지 않거나, 네트워크나 DB가 연결이 안되는 경우
자바는 대부분 프로그램에서 발생하는 오류에 대해 문법적으로 예외 처리를 해야 함
모든 예외 클래스의 최상위 클래스는 Exception 클래스
Class Exception
java.lang.Object
java.lang.Throwable
java.lang.Exception
Arithmetic Exception :정수를 0 으로 나눈 경우 발생
NullPointerException : 초기화 되지 않은 Object를 사용하는 경우
Dog d = null;
System.out.println(dog);
Class.forName(“sis.studentinfo.Student”); //클래스가 로드되지 않은 경우
try 블록에는 예외가 발생할 가능성이 있는 코드를 작성하고 try 블록 안에서 예외가 발생하믄 경우 catch 블록이 수행됨
public class ArrayExceptionHandling {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
try{
for(int i=0; i<=5; i++){
System.out.println(arr[i]);
}
}catch(ArrayIndexOutOfBoundsException e){
System.out.println(e);
}
System.out.println("비정상 종료되지 않았습니다.");
}
}
finally 블럭에서 파일를 닫거나 네트웍을 닫는 등의 리소스 해제 구현
을 함
try{} 블럭이 수행되는 경우, finally{} 블럭은 항상 수행 됨(return 문이 있더라도)
여러 개의 예외 블럭이 있는 경우 각각에서 리소스를 해제하지 않고 finally 블록에서 해제하도록 구현함
컴파일러에 의해 예외가 처리 되는 예 (파일 에러 처리)
public class FileExceptionHandling {
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("a.txt");
} catch (FileNotFoundException e) {
System.out.println(e);
//return;
}finally{
if(fis != null){
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("항상 수행 됩니다.");
}
System.out.println("여기도 수행됩니다.");
}
}
public class AutoCloseObj implements AutoCloseable{
@Override
public void close() throws Exception {
System.out.println("리소스가 close() 되었습니다");
}
}
public class AutoCloseTest {
public static void main(String[] args) {
AutoCloseObj obj = new AutoCloseObj();
try (obj){
throw new Exception();
}catch(Exception e) {
System.out.println("예외 부분 입니다");
}
}
}
try-catch 블록
으로 처리하는 방법과 이를 사용하는 부분에서 처리하는 방법
두 가지가 있음public class ThrowsException {
public Class loadClass(String fileName, String className) throws FileNotFoundException, ClassNotFoundException{
FileInputStream fis = new FileInputStream(fileName); //FileNotFoundException 발생
Class c = Class.forName(className); //ClassNotFoundException 발생
return c;
}
public static void main(String[] args) {
ThrowsException test = new ThrowsException();
try {
test.loadClass("a.txt", "java.lang.String");
}catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
}
}
하나의 try{}블록에서 예외가 여러개 발생하는 경우
// 예외를 묶어서 하나의 방법으로 묶어 처리하는 경우
try {
test.loadClass("a.txt", "java.lang.String");
} catch (FileNotFoundException | ClassNotFoundException e) {
e.printStackTrace();
}
// 각각 처리
try {
test.loadClass("a.txt", "java.lang.String");
}catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
비밀번호는 null X, 비밀번호 길이는 5이상, 문자로만 이루어 지면 X
public class PasswordException extends IllegalArgumentException{
public PasswordException(String message){
super(message);
}
}
public class PassWordTest{
private String password;
public String getpassword(){
return password;
}
public void setPassword(String password) throws PasswordException{
if(password == null){
throw new PasswordException("비밀번호는 null일 수 없습니다.");
} else if( password.length() > 5){
throw new PasswordException("비밀번호는 5자 이상이어야 합니다.");
} else if (password.matches("[a-zA-z]+"){
throw new PasswordException("비밀번호는 숫자나 특수문자를 포함해야 합니다.");
}
this.password = password;
}
public static void main(String[] args){
PasswordTest test = new PasswordTest();
String password = null;
try{
test.setPassword(password);
System.out.println("오류 없음1");
} catch(PasswordException e){
System.out.println(e.getMessage());
}
password = "abcd";
try{
test.setPassword(password);
System.out.println("오류 없음2");
} catch(PasswordException e){
System.out.println(e.getMessage());
}
password = "abcde";
try{
test.setPassword(password);
System.out.println("오류 없음3");
} catch(PasswordException e){
System.out.println(e.getMessage());
}
password = "abcde#1";
try{
test.setPassword(password);
System.out.println("오류 없음4");
} catch(PasswordException e){
System.out.println(e.getMessage());
}
}
}