프로그램 실행 중에 오류가 발생할 수 있습니다. 이는 초보자부터 실제 전문가까지 모든 프로그래머에게 공통적인 문제입니다. 모든 오류가 개발자의 잘못으로 발생하는 것은 아닙니다. 그 중 일부는 예측하기 어렵고 때로는 불가능합니다. 예를 들어, 프로그램을 다운로드하는 중에 네트워크 연결이 갑자기 끊어지거나 전원이 꺼지는 경우가 있습니다. 이러한 상황을 예외라고 합니다. Try and catch는 예외를 처리하는 데 사용되는 구성 부분입니다.
Java try 및 catch 블록
오류가 발생하면 일반적으로 Java가 중지되고 오류 메시지가 생성됩니다. 이 프로세스를 "Java에서 예외가 발생했습니다"라고 합니다. Java는 예외 처리를 위한 특수 기능을 제공합니다. 그 중 하나는 try...catch...finally 구성입니다. 다음은 try 블록, catch 블록 및 finally 블록의 구문입니다.//try block
try {
// Block of code to try
}
//try catch
catch(Exception e) {
// Block of code to handle errors
}
finally {
// Optional block of code
}
try 블록에서 예외가 발생하면 예외를 처리할 수 있는 catch 블록으로 제어가 전달됩니다. 그러한 블록이 발견되지 않으면 처리되지 않은 예외 메시지가 사용자에게 표시되고 프로그램의 추가 실행이 중지됩니다. 이러한 비상 정지를 방지하기 위해 try..catch 블록을 사용해야 합니다. ![자바 시도 - 캐치 - 1](https://cdn.codegym.cc/images/article/ab0bf0e8-2813-4ec0-827d-164b2284a9a8/800.jpeg)
try, catch, finally, throws 키워드에 대해 간략히 설명합니다.
Java의 예외 처리는 프로그램에서 다음 키워드의 사용을 기반으로 합니다.- try — 예외가 발생할 수 있는 코드 블록을 정의합니다.
- catch — 예외가 처리되는 코드 블록을 정의합니다.
- finally — 선택 사항이지만 존재하는 경우 try 블록의 결과에 관계없이 실행되는 코드 블록을 정의합니다.
- throw — 예외를 발생시키는 데 사용됩니다.
- throws — 메서드 시그니처에서 메서드가 예외를 던질 수 있음을 경고하는 데 사용됩니다.
Try-Catch 구성의 쉬운 예
배열이 포함된 프로그램이 있다고 가정해 보겠습니다.public class TryTest {
public static void main(String[] args) {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
}
}
존재하지 않는 인덱스가 있는 배열 요소에 액세스하려고 하므로 프로그램은 오류와 함께 종료됩니다.
"main" 스레드의 예외 java.lang.ArrayIndexOutOfBoundsException: 인덱스 7이 days.TryTest.main(TryTest.java:6)에서 길이 5의 범위를 벗어났습니다. 프로세스가 종료 코드 1로 완료되었습니다.
이 프로그램을 수정하고 try-catch를 사용하여 이 예외를 처리해 보겠습니다. 먼저 try 블록이 오고 나중에 — catch 블록이 옵니다.
//try catch example
public class TryTest {
public static void main(String[] args) {
try {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
} catch (Exception myEx) {
System.out.println("The exception was handled...");
}
System.out.println("This is the end of the program...");
}
}
이제 출력이 변경되었습니다.
예외가 처리되었습니다... 프로그램이 끝났습니다... 종료 코드 0으로 프로세스가 종료되었습니다. 종료 코드 0으로 프로세스가 종료되었습니다.
이 경우 프로그램이 올바르게 완료되고 메시지가 화면에 표시됩니다. 프로그램의 올바른 종료는 프로세스 종료 시 코드 0으로 표시되고, 잘못된 경우 - 1로 표시됩니다. try...catch 블록을 사용할 때 try 및 catch 문 사이의 모든 문이 먼저 실행됩니다. try 블록에서 예외가 발생하면 정상적인 실행 순서가 중지되고 catch 문으로 진행됩니다. 따라서 프로그램 실행이 숫자[7]=8에 도달하면; 행에서 프로그램은 중지되고 catch 블록으로 이동합니다. 우리의 경우 myEx 변수를 Exception 유형으로 선언했습니다. 이는 모든 예외의 기본 클래스이므로 다를 수 있습니다. 예를 들어, 우리의 경우처럼 배열 인덱싱을 넘어서 Null을 가리키는 등 스택 오버플로를 담당하는 예외가 있습니다. 예외 유형을 추측하지 않았다면 프로그램도 잘못 종료되었을 것입니다. 그러나 예제의 단순성을 위해 Exception 유형을 선택했으며 이는 모든 예외의 기본 클래스입니다. 따라서 catch 문(Exception myEx)은 거의 모든 예외를 처리합니다. 이 경우 예외 처리 catch 블록이 완료된 후 프로그램은 작업을 계속하여 catch 블록 뒤의 다른 모든 명령을 실행합니다. 발생한 예외를 보려면 프로그램이 메서드 호출의 스택 추적을 인쇄하도록 할 수 있습니다. 포착되지 않은 예외가 발생할 때 JVM이 수행하는 작업은 다음과 같습니다. 프로그램 실행을 중지하고 finally 블록(있는 경우)의 코드를 실행한 후 스택 추적을 인쇄합니다.
public class TryTest {
public static void main(String[] args) {
try {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
} catch (Exception myEx) {
myEx.printStackTrace();
}
System.out.println("This is the end of the program...");
}
}
이 경우 예외 처리는 Exception 클래스 에 정의된 printStackTrace() 메서드 를 사용하여 오류 추적 스택을 콘솔에 인쇄하는 것입니다 .
java.lang.ArrayIndexOutOfBoundsException: 인덱스 7이 days.TryTest.main(TryTest.java:7)에서 길이 5의 범위를 벗어났습니다. 프로그램이 종료되었습니다... 종료 코드 0으로 프로세스가 종료되었습니다.
그러나 프로그램이 올바르게 종료되었습니다.
마지막으로! 잡은 후
예제와 예외 처리를 위한 키워드 정의에서 finally 블록을 언급했습니다. 선택사항이지만 존재하는 경우 try 블록의 결과에 관계없이 실행됩니다. 예외 유형을 NullPointerException으로 변경해 보겠습니다.public class TryTest {
public static void main(String[] args) {
try {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
} catch (NullPointerException myEx) {
System.out.println("The exception was handled...");
}
finally{
System.out.println(" finally");
}
System.out.println("This is the end of the program...");
}
}
출력은 다음과 같습니다.
"main" 스레드의 예외 java.lang.ArrayIndexOutOfBoundsException: 인덱스 7이 days.TryTest.main(TryTest.java:7)에서 길이 5의 범위를 벗어났습니다. 마지막으로 종료 코드 1로 프로세스가 완료되었습니다.
그런데 올바른 예외 유형을 지정할 수 있습니다. 여기는 IndexOutOfBoundsException입니다.
public class TryTest {
public static void main(String[] args) {
try {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
} catch (IndexOutOfBoundsException myEx) {
System.out.println("The exception was handled...");
}
finally{
System.out.println(" finally");
}
System.out.println("This is the end of the program...");
}
}
이 경우 출력은 다음과 같습니다.
예외가 처리되었습니다... 드디어 프로그램이 끝났습니다... 프로세스가 종료 코드 0으로 완료되었습니다.
예외가 작동하는 방식은 무엇입니까?
요점은 이러한 모든 단어(catch, throw, throws)는 java.lang.Throwable 또는 그 하위 항목에서만 사용할 수 있다는 것입니다. 예를 들어 다음과 같이 할 수 있습니다.public class MyClass {
public static void main(String[] args) {
try {
} catch (Throwable thr) {
}
}
}
그러나 다음과 같이 할 수는 없습니다.
public class MyClass {
public static void main(String[] args) {
try {
} catch (String thr) {
}
}
}