1. Java Error와 Exception
- 오류와 예외 차이 : 버그 발생 시 오류는 통제 불가능, 예외는 예외처리로 통제 가능
- 오류 : 실행 컴퓨터 자체의 문제(CPU, Memory 등), JVM에서 기인한 문제(ex. Stack Overflow, Virtual Machine, Out of Memory Error 등)
- 예외 : Check Exception(무조건 처리해야하는 예외) / Uncheck Exception(무조건 처리하지 않아도 되는 예외)
public class ErrorTest {
public static void main(String[] args) {
//VM 옵션 -Xmx1m ->
//출력 : Error occurred during initialization of VM
// Too small maximum heap
System.out.println("메인메소드 실행");
System.out.println("메인메소드 실행2");
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class ExceptionTest {
public static void main(String[] args) throws FileNotFoundException {
System.out.println("메인메소드가 시작합니다");
makeCheckedException();
System.out.println("메인메소드가 종료합니다");
}
public static void makeUncheckException() {
int[] intArr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int index = 10;
System.out.println(intArr[index]);
//예외 발생 : ArrayIndexOutOfBoundsException
}
public static void makeCheckedException() throws FileNotFoundException {
File file = new File("src/exercise/chapter_50/test.txt");
FileInputStream fs = new FileInputStream(file);
System.out.println("fs실행");
}
}
2. Java try-catch문 다루기
- try : 로직 진행
- catch : 예외 발생 시 진행
- 여러 catch문 실행 가능
package exercise.chapter_50;
public class TryCatchTest1 {
public static void main(String[] args) {
System.out.println("메인 메소드 실행");
int i = 5;
int j = 0;
int data = 50 / i;
System.out.println("data = " + data); //출력 : data = 10
data = 50 / j;
System.out.println("data = " + data); //ArithmeticException 발생 -> 프로그램 종료
System.out.println("메인 메소드 종료");
}
}
public class TryCatchTest1 {
public static void main(String[] args) {
System.out.println("메인 메소드 실행");
try {
int i = 0;
int data = 50 / i;
System.out.println("data = " + data); //ArithmeticException 발생
} catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없음");
System.out.println("data = " + 0);
e.printStackTrace(); //예외 내용 출력
}//try-catch 수행시 바로 종료되는 것이 아니고 다음 로직 실행
System.out.println("메인 메소드 종료");
}
//예외 발생하지 않으면 try 수행 후 catch문 다음 로직 실행
}
package exercise.chapter_50;
import java.util.ArrayList;
import java.util.List;
public class TryCatchTest2 {
public static void main(String[] args) {
System.out.println("메인메소드 실행");
List<String> stringList = new ArrayList<>();
stringList.add("Hello");
stringList.add("World");
stringList.add("Java");
stringList.add(null);
stringList.add("Python");
//UncheckedException
for (int i = 0; i < stringList.size() + 5; i++) { //IndexOutOfBoundsException 발생 가능
try {
System.out.println("i : " + i);
String str = stringList.get(i);
System.out.println(str.toUpperCase());
//null add시 NullPointerException 발생 -> 비정상 종료
} catch (NullPointerException e) {
System.out.println("null은 넣을 수 없음");
} catch (IndexOutOfBoundsException e) {
System.out.println("index는 bound를 넘어갈수 없음");
break;
}
}
System.out.println("메인 메소드 종료");
}
}
package exercise.chapter_50;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class TryCatchTest3 {
public static void main(String[] args) {
try {
FileInputStream fs = new FileInputStream("src/exercise/chapter_50/test.txt");
int i;
while ((i = fs.read()) != -1) {
System.out.write(i);
}
} catch (FileNotFoundException e) { //파일이 존재하지 않으면
System.out.println("파일을 찾을 수 없습니다");
e.printStackTrace();
} catch (IOException e) {
System.out.println("입출력 과정에 오류");
e.printStackTrace();
}
}
}
1. try-catch 한걸음 더
- 다중예외처리
- 여러 예외 한번에 잡기 ( | or 연산)
- 상위 클래스 예외로 잡기
package exercise.chapter_51;
import java.io.FileInputStream;
public class TryMultiCatchTest {
public static void main(String[] args) {
try {
FileInputStream fs = new FileInputStream("src/exercise/chapter_51/test.txt");
int i = 1;
int data = 100 / i;
String str = "java";
System.out.println(str.toUpperCase());
int[] intArr = new int[10];
System.out.println(intArr[9]);
} catch (Exception e) { //모든 예외의 상위클래스
System.out.println("최종 Exception");
e.printStackTrace();
}
System.out.println("메인메소드 종료");
//Exception 발생하면 catch문 실행 후 다음 예외처리는 넘어감
}
}
- try-catch-finally
package exercise.chapter_51;
public class TryCatchFinallyTest {
public static void main(String[] args) {
System.out.println("메인 실행");
try {
Integer myInt = 10;
Integer data = 100 / myInt;
if (data == 10) {
return; //return 해도 finally는 무조건 실행
}
System.out.println("data : " + data);
} catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없음");
e.printStackTrace();
} finally {
System.out.println("여기는 finally");
}
System.out.println("메인 종료");
}
}
//finally로 리소스 해제
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FinallyCloseTest {
public static void main(String[] args) throws InterruptedException, IOException {
System.out.println("메인 실행");
FileInputStream fs = null;
try {
fs = new FileInputStream("src/exercise/chapter_51/test.txt");
int i;
while ((i = fs.read()) != -1) {
System.out.write(i);
}
int myInt = 10;
int data = 100 / myInt;
// fs.close(); //리소스 해제 꼭 필요
} catch (FileNotFoundException e) { //파일이 존재하지 않으면
System.out.println("파일을 찾을 수 없습니다");
e.printStackTrace();
} catch (IOException e) {
System.out.println("입출력 과정에 오류");
e.printStackTrace();
} catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없음");
e.printStackTrace();
} finally {
fs.close(); //finally에 걸려서 무조건 리소스 해제
}
System.out.println("메인 종료");
}
}
try (FileInputStream fs = new FileInputStream("src/exercise/chapter_51/test.txt")) {
..
}
//AutoClosable
#슈퍼코딩, #1:1관리형부트캠프, #백엔드, #backend, #백엔드공부, #개발공부, #백엔드개발자 #취준일기, #취준기록, #취뽀, #빡공, #HTML/CSS, #javascript, #react , #java, #spring