이 기사의 예제에서는 Java 예외 처리의 사용법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.
Java의 예외 처리 메커니즘은 프로그램에서 발생할 수 있는 오류를 피하거나 처리하는 데 도움이 되므로 복구 가능한 오류가 발생할 때 프로그램이 예기치 않게 종료되지 않고 이러한 오류를 처리할 수 있으므로 프로그램 작성에도 도움이 되지 않습니다. 오류 조건을 확인하려면 많은 코드를 작성해야 하므로 코드의 가독성과 논리가 향상됩니다. Java에서 예외는 잘못된 엔터티 개체를 나타냅니다.
예외는 두 가지 범주로 나눌 수 있습니다. 하나는 하드웨어 오류, 메모리 부족 등과 같은 심각한 오류로, 이는 java.lang 패키지의 Error 클래스 및 하위 클래스에 해당합니다. 일반적으로 이러한 유형의 오류 프로그램 자체는 복구할 수 없으며 프로그램 실행을 중단해야 합니다. 다른 유형은 사용자가 불법 데이터를 입력하거나 0으로 나누는 등 심각하지 않은 오류입니다. java.lang 패키지의 예외는 일반적으로 프로그램 작동에 영향을 주지 않고 복구될 수 있습니다.
try, catch 및 finally 키워드를 사용하여 예외를 잡을 수 있습니다.
1. 시도하다, 붙잡다
예외를 일으킬 수 있는 문을 try{} 블록에 넣은 다음 catch{} 문 블록에서 이를 포착합니다. 0으로 나눈 경우 예외:
public class SimpleDemo { //나누기 작업 public static int devision(int a,int b) { return a / b } public static void main(String[] args) { try { //5 나누기 0 SimpleDemo.devision(5 ,0); System.out.println("예외"); } catch(예외 e) { e.printStackTrace() } System.out.println("Finish");실행 결과:
보시다시피 Finish가 인쇄되어 프로그램이 0으로 나누기 오류로 인해 종료되지 않았음을 나타냅니다.
동시에 예외가 발생한 SimpleDemo.devision() 아래의 System.out.println 문이 실행되지 않는 것도 확인했습니다. 예외가 발생하면 프로그램은 예외 다음에 오는 명령문을 실행하지 않고 현재 실행 위치에서 점프합니다.
2. 드디어
finally 블록의 명령문은 예외 발생 여부에 관계없이 실행됩니다.
finally 블록의 명령문은 예외 발생 여부에 관계없이 실행되므로, 이것이 finally의 실제 효과는 무엇인지 묻는 사람이 있을 수 있습니다. 최종적으로 없이 외부에서 직접 쓸 수는 없을까요?
위의 예에서와 같이 catch 문 블록에 return을 추가합니다.
public class SimpleDemo { //분할 작업 public static int Division(int a,int b) { return a / b } public static void main(String[] args) { try { //5 나누기 0 SimpleDemo.division(5 ,0); System.out.println("Exception"); } catch (Exception e) { e.printStackTrace() return} finally { System.out.println("마침내") } System.out.println("마침") } }이때 finally 블록 외부의 Finish는 인쇄되지 않지만 finally 블록 내부의 finally는 인쇄됩니다.
마지막으로 실제 개발에 매우 유용합니다. 예를 들어, 데이터베이스를 열고 데이터베이스에서 데이터를 읽고 쓸 때 예외가 발생하면 데이터베이스 연결을 닫고 해당 리소스를 해제해야 합니다. 이때 finally 블록에 리소스를 해제하는 코드를 작성하는 것이 가장 적합합니다.
그러나 한 가지 경우에는 finally 블록이 실행되지 않는다는 점에 유의해야 합니다. System.exit() 메서드를 호출하는 등 finally 블록을 실행하기 전에 프로그램이 종료되면 finally 블록이 실행될 기회를 얻지 못합니다.
3. 예외 발생
메소드에서 예외가 발생했지만 메소드에서 직접 예외를 처리하고 싶지 않고 메소드 호출자가 이를 처리하도록 하려면 throws 키워드를 사용하여 예외를 발생시키는 이 메소드를 선언할 수 있습니다. 이는 Sun에서 제공하는 API 함수에서 매우 일반적입니다. 예를 들어 java.io.Reader의 읽기 메소드는 IOException을 발생시키도록 선언됩니다.
public int read(char[] cbuf)가 IOException을 발생시킵니다.
이때 read 메소드를 호출할 때 예외를 포착하려면 이를 try 문 블록에 넣어야 합니다. 그렇지 않으면 컴파일러가 오류를 보고하고 강제로 예외를 포착하도록 합니다.
물론, read를 호출할 때 예외를 처리하고 싶지 않다면, read 메서드를 호출하는 메서드를 IOException을 throw하도록 선언하여 예외가 다시 발생하도록 할 수도 있습니다. main 함수에서 Exception을 선언하면 결국 예외 정보는 JVM에 의해 캡처 및 처리되며 JVM의 처리 결과는 예외 정보를 인쇄한 후 프로그램을 종료하는 것입니다.
4. 예외 처리 구조
모든 예외 클래스는 Exception 클래스에서 파생됩니다. 이는 어떤 유형의 예외가 발생할지 확실하지 않은 경우 catch에서 Exception 객체를 직접 선언하여 Exception 클래스와 해당 하위 클래스의 모든 예외를 잡을 수 있음을 의미합니다. 하지만 catch가 쓰여지는 순서에 주의하세요. 시도 후에 여러 개의 catch가 있고 첫 번째 catch가 Exception 개체를 선언하는 경우 예외는 첫 번째 catch에 의해 직접 처리되며 후속 catch에서는 이 예외를 catch할 수 없습니다. 이런 종류의 오류는 컴파일 중에 오류를 생성합니다. 예를 들어:
public class CatchDemo { //분할 작업 public static int Division(int a,int b) { return a / b } public static void main(String[] args) { try { CatchDemo.division(4,0); (예외 e) { System.out.println("예외 클래스") } catch(ArithmeticException e) { System.out.println("ArithmeticException 클래스"); } } }컴파일러는 ArithmeticException이 포착되었음을 출력합니다. 이는 위의 예외가 이 예외를 포착했으며 이를 다시 포착할 필요가 없음을 의미합니다.
이 두 가지 캐치가 반전되면 어떻게 될까요?
public class CatchDemo { //분할 작업 public static int Division(int a,int b) { return a / b } public static void main(String[] args) { try { CatchDemo.division(4,0); (ArithmeticException e) { System.out.println("ArithmeticException 클래스") } catch(Exception e) { System.out.println("Exception Class"); } } }이때 코드가 컴파일을 통과했으며 실행 결과 ArithmeticException이 이 예외를 포착했지만 후속 catch에서는 이를 포착하지 못한 것으로 나타났습니다.
이 글이 모든 사람의 Java 프로그래밍에 도움이 되기를 바랍니다.