logo

자바의 예외

예외 처리 Java에서는 애플리케이션의 일반적인 흐름을 유지할 수 있도록 런타임 오류를 처리하는 효과적인 수단 중 하나입니다. Java 예외 처리는 ClassNotFoundException, IOException, SQLException, RemoteException 등과 같은 런타임 오류를 처리하는 메커니즘입니다.

Java 예외란 무엇입니까?

자바에서는 예외 프로그램 실행 중에, 즉 런타임에 발생하여 프로그램 명령의 정상적인 흐름을 방해하는 원치 않거나 예상치 못한 이벤트입니다. 프로그램에서 예외를 포착하고 처리할 수 있습니다. 메서드 내에서 예외가 발생하면 개체가 생성됩니다. 이 개체를 예외 개체라고 합니다. 여기에는 예외 이름, 설명, 예외 발생 당시 프로그램 상태 등 예외에 대한 정보가 포함됩니다.

예외가 발생하는 주요 이유

  • 잘못된 사용자 입력
  • 장치 고장
  • 네트워크 연결 끊김
  • 물리적 제한(디스크 부족 메모리)
  • 코드 오류
  • 사용할 수 없는 파일 열기

오류 JVM(Java Virtual Machine)의 메모리 부족, 메모리 누수, 스택 오버플로 오류, 라이브러리 비호환성, 무한 재귀 등과 같은 복구할 수 없는 조건을 나타냅니다. 오류는 일반적으로 프로그래머의 통제 범위를 벗어나므로 오류를 처리하려고 해서는 안 됩니다.



오류와 예외의 차이점

가장 중요한 부분, 즉, 오류와 예외의 차이점 그것은 다음과 같습니다:

  • 오류: 오류는 합리적인 응용 프로그램이 포착하려고 시도해서는 안 되는 심각한 문제를 나타냅니다.
  • 예외: 예외는 합리적인 애플리케이션이 포착하려고 시도할 수 있는 조건을 나타냅니다.

예외 계층

모든 예외 및 오류 유형은 클래스의 하위 클래스입니다. 던질 수 있는 , 이는 계층 구조의 기본 클래스입니다. 한 지점은 다음과 같습니다. 예외 . 이 클래스는 사용자 프로그램이 포착해야 하는 예외 조건에 사용됩니다. NullPointerException은 이러한 예외의 예입니다. 또 다른 지점, 오류 Java 런타임 시스템( JVM ) 런타임 환경 자체(JRE)와 관련된 오류를 나타냅니다. StackOverflowError는 이러한 오류의 예입니다.

하위 문자열 함수 java
Java의 예외 계층 구조

Java 예외 계층

예외 유형

Java는 다양한 클래스 라이브러리와 관련된 여러 유형의 예외를 정의합니다. Java에서는 사용자가 자신만의 예외를 정의할 수도 있습니다.

Java의 예외 유형

예외는 두 가지 방식으로 분류될 수 있습니다.

  1. 내장 예외
    • 확인된 예외
    • 확인되지 않은 예외
  2. 사용자 정의 예외

위에 정의된 예외에 대해 다음과 같이 논의해 보겠습니다.

1. 내장된 예외

내장 예외는 Java 라이브러리에서 사용할 수 있는 예외입니다. 이러한 예외는 특정 오류 상황을 설명하는 데 적합합니다.

  • 확인된 예외: 확인된 예외는 컴파일러가 컴파일 타임에 확인하기 때문에 컴파일 타임 예외라고 합니다.
  • 확인되지 않은 예외: 확인되지 않은 예외는 확인된 예외와 정반대입니다. 컴파일러는 컴파일 타임에 이러한 예외를 확인하지 않습니다. 간단히 말해서, 프로그램이 확인되지 않은 예외를 발생시키면 우리가 이를 처리하거나 선언하지 않더라도 프로그램은 컴파일 오류를 발생시키지 않습니다.

메모: 확인된 예외와 확인되지 않은 예외에 대해서는 다음을 참조하세요. 확인된 예외와 확인되지 않은 예외

2. 사용자 정의 예외:

때로는 Java에 내장된 예외가 특정 상황을 설명하지 못하는 경우가 있습니다. 이러한 경우 사용자는 '사용자 정의 예외'라고 하는 예외를 생성할 수도 있습니다.

그만큼 Java 예외 처리의 장점 다음과 같다:

  1. 완전한 프로그램 실행을 위한 제공
  2. 프로그램 코드 및 오류 처리 코드를 쉽게 식별
  3. 오류 전파
  4. 의미 있는 오류 보고
  5. 오류 유형 식별

예외 정보를 인쇄하는 방법:

1. 프린트스택트레이스()

이 메소드는 예외 이름: 예외 설명, 스택 추적 형식으로 예외 정보를 인쇄합니다.

예:

자바




//program to print the exception information using printStackTrace() method> > import> java.io.*;> > class> GFG {> >public> static> void> main (String[] args) {> >int> a=>5>;> >int> b=>0>;> >try>{> >System.out.println(a/b);> >}> >catch>(ArithmeticException e){> >e.printStackTrace();> >}> >}> }>

>

>

산출

java.lang.ArithmeticException: / by zero at GFG.main(File.java:10)>

2. toString()

toString() 메서드는 예외 이름: 예외 설명 형식으로 예외 정보를 인쇄합니다.

예:

자바




//program to print the exception information using toString() method> > import> java.io.*;> > class> GFG1 {> >public> static> void> main (String[] args) {> >int> a=>5>;> >int> b=>0>;> >try>{> >System.out.println(a/b);> >}> >catch>(ArithmeticException e){> >System.out.println(e.toString());> >}> >}> }>

>

타이프 스크립트 foreach

>

산출

java.lang.ArithmeticException: / by zero>

3. getMessage()

getMessage() 메소드는 예외에 대한 설명만 인쇄합니다.

예:

자바


자바 문자를 int로



//program to print the exception information using getMessage() method> > import> java.io.*;> > class> GFG1 {> >public> static> void> main (String[] args) {> >int> a=>5>;> >int> b=>0>;> >try>{> >System.out.println(a/b);> >}> >catch>(ArithmeticException e){> >System.out.println(e.getMessage());> >}> >}> }>

>

>

산출

/ by zero>

JVM은 예외를 어떻게 처리합니까?

기본 예외 처리: 메소드 내부에서 예외가 발생하면 메소드는 예외 객체라는 객체를 생성하여 이를 런타임 시스템(JVM)에 전달합니다. 예외 개체에는 예외의 이름과 설명, 그리고 예외가 발생한 프로그램의 현재 상태가 포함됩니다. 예외 개체를 생성하고 이를 런타임 시스템에서 처리하는 것을 예외 발생이라고 합니다. 예외가 발생한 메소드에 도달하기 위해 호출된 메소드 목록이 있을 수 있습니다. 이렇게 순서가 지정된 메소드 목록을 호출 스택 . 이제 다음 절차가 수행됩니다.

  • 런타임 시스템은 호출 스택을 검색하여 발생한 예외를 처리할 수 있는 코드 블록이 포함된 메서드를 찾습니다. 코드 블록을 예외 처리기 .
  • 런타임 시스템은 예외가 발생한 메서드부터 검색을 시작하고 메서드가 호출된 역순으로 호출 스택을 통해 검색을 진행합니다.
  • 적절한 핸들러를 찾으면 발생한 예외를 핸들러에 전달합니다. 적절한 핸들러는 발생한 예외 개체의 유형이 처리할 수 있는 예외 개체의 유형과 일치함을 의미합니다.
  • 런타임 시스템이 호출 스택의 모든 메서드를 검색했지만 적절한 핸들러를 찾지 못한 경우 런타임 시스템은 예외 개체를 기본 예외 처리기 , 이는 런타임 시스템의 일부입니다. 이 핸들러는 다음 형식으로 예외 정보를 인쇄하고 프로그램을 종료합니다. 비정상적으로 .
Exception in thread 'xxx' Name of Exception : Description ... ...... .. // Call Stack>

호출 스택의 흐름을 이해하려면 아래 다이어그램을 보십시오.

Java의 예외에 대한 클래스 스택 흐름

삽화:

자바




// Java Program to Demonstrate How Exception Is Thrown> > // Class> // ThrowsExecp> class> GFG {> > >// Main driver method> >public> static> void> main(String args[])> >{> >// Taking an empty string> >String str =>null>;> >// Getting length of a string> >System.out.println(str.length());> >}> }>

>

자바의 목록 노드
>

산출

프로그램 출력

런타임 시스템이 호출 스택에서 적절한 예외 처리 코드를 검색하는 방법을 보여주는 예를 살펴보겠습니다.

예:

자바




// Java Program to Demonstrate Exception is Thrown> // How the runTime System Searches Call-Stack> // to Find Appropriate Exception Handler> > // Class> // ExceptionThrown> class> GFG {> > >// Method 1> >// It throws the Exception(ArithmeticException).> >// Appropriate Exception handler is not found> >// within this method.> >static> int> divideByZero(>int> a,>int> b)> >{> > >// this statement will cause ArithmeticException> >// (/by zero)> >int> i = a / b;> > >return> i;> >}> > >// The runTime System searches the appropriate> >// Exception handler in method also but couldn't have> >// found. So looking forward on the call stack> >static> int> computeDivision(>int> a,>int> b)> >{> > >int> res =>0>;> > >// Try block to check for exceptions> >try> {> > >res = divideByZero(a, b);> >}> > >// Catch block to handle NumberFormatException> >// exception Doesn't matches with> >// ArithmeticException> >catch> (NumberFormatException ex) {> >// Display message when exception occurs> >System.out.println(> >'NumberFormatException is occurred'>);> >}> >return> res;> >}> > >// Method 2> >// Found appropriate Exception handler.> >// i.e. matching catch block.> >public> static> void> main(String args[])> >{> > >int> a =>1>;> >int> b =>0>;> > >// Try block to check for exceptions> >try> {> >int> i = computeDivision(a, b);> >}> > >// Catch block to handle ArithmeticException> >// exceptions> >catch> (ArithmeticException ex) {> > >// getMessage() will print description> >// of exception(here / by zero)> >System.out.println(ex.getMessage());> >}> >}> }>

>

>

산출

/ by zero>

프로그래머는 예외를 어떻게 처리합니까?

맞춤형 예외 처리: Java 예외 처리는 다섯 가지 키워드를 통해 관리됩니다. 노력하다 , 잡다 , 던지다 , 던진다 , 그리고 마지막으로 . 간략하게 작동 방식은 다음과 같습니다. 예외를 발생시킬 수 있다고 생각되는 프로그램 문은 try 블록 내에 포함됩니다. try 블록 내에서 예외가 발생하면 예외가 발생합니다. 귀하의 코드는 (catch 블록을 사용하여) 이 예외를 포착하고 합리적인 방식으로 처리할 수 있습니다. 시스템 생성 예외는 Java 런타임 시스템에 의해 자동으로 발생됩니다. 예외를 수동으로 발생시키려면 throw 키워드를 사용하십시오. 메소드에서 발생하는 모든 예외는 throws 절에 의해 지정되어야 합니다. try 블록이 완료된 후 반드시 실행되어야 하는 모든 코드는 finally 블록에 배치됩니다.

팁: 꼭 거쳐야 할 사람 더 나은 이해를 위해 try catch finally 블록의 제어 흐름을 확인하세요.

try-catch 절 필요(맞춤형 예외 처리)

try-catch 절을 더 잘 이해하려면 아래 프로그램을 고려하세요.

예:

C에서 포인터를 역참조하는 방법

자바




// Java Program to Demonstrate> // Need of try-catch Clause> > // Class> class> GFG {> > >// Main driver method> >public> static> void> main(String[] args)> >{> >// Taking an array of size 4> >int>[] arr =>new> int>[>4>];> > >// Now this statement will cause an exception> >int> i = arr[>4>];> > >// This statement will never execute> >// as above we caught with an exception> >System.out.println(>'Hi, I want to execute'>);> >}> }>

>

>

산출

프로그램 출력

출력 설명: 위의 예에서 배열은 크기로 정의됩니다. 즉, 인덱스 0에서 3까지만 요소에 액세스할 수 있습니다. 그러나 (실수로) 인덱스 4의 요소에 액세스하려고 하므로 예외가 발생합니다. 이 경우 JVM은 프로그램을 종료합니다. 비정상적으로 . System.out.println(안녕하세요, 실행하고 싶습니다); 절대 실행되지 않습니다. 이를 실행하려면 try-catch를 사용하여 예외를 처리해야 합니다. 따라서 프로그램의 정상적인 흐름을 계속하려면 try-catch 절이 필요합니다.

Try-catch 절을 사용하는 방법은 무엇입니까?

try {  // block of code to monitor for errors  // the code you think can raise an exception } catch (ExceptionType1 exOb) {  // exception handler for ExceptionType1 } catch (ExceptionType2 exOb) {  // exception handler for ExceptionType2 } // optional finally { // block of code to be executed after try block ends  }>

다음과 같은 특정 핵심 사항을 기억해야 합니다.

  • 메소드에는 예외를 발생시킬 수 있는 명령문이 두 개 이상 있을 수 있으므로 이러한 모든 명령문을 자체적으로 작성하십시오. 노력하다 자체적으로 별도의 예외 처리기를 차단하고 제공합니다. 잡다 각각에 대해 차단합니다.
  • 내에서 예외가 발생하는 경우 노력하다 블록에서 해당 예외는 이와 관련된 예외 처리기에 의해 처리됩니다. 예외 처리기를 연결하려면 다음을 입력해야 합니다. 잡다 그 후에 차단하세요. 둘 이상의 예외 처리기가 있을 수 있습니다. 각 잡다 블록은 인수가 나타내는 유형에 대한 예외를 처리하는 예외 처리기입니다. ExceptionType 인수는 처리할 수 있는 예외 유형을 선언하며 ExceptionType에서 상속하는 클래스의 이름이어야 합니다. 던질 수 있는 수업.
  • 각 try 블록에는 0개 이상의 catch 블록이 있을 수 있지만 단 하나 마지막 블록.
  • finally 블록은 선택 사항입니다. try 블록에서 예외가 발생했는지 여부에 관계없이 항상 실행됩니다. 예외가 발생하면 이후에 실행됩니다. 블록을 잡아보세요. 그리고 예외가 발생하지 않으면 다음 이후에 실행됩니다. 노력하다 차단하다. Java의 finally 블록은 정리 코드(예: 파일 닫기 또는 연결 닫기)와 같은 중요한 코드를 넣는 데 사용됩니다.
  • try 블록에 System.exit를 작성하면 finally 블록이 실행되지 않습니다.

요약은 다음과 같이 시각적 자료를 통해 설명됩니다.

자바의 예외

관련 기사:

관련 강좌

Java 프로그래밍 기초 – 자습 과정

다년간의 경험을 보유한 업계 전문가로부터 Java 프로그래밍 기초 학습을 시작하는 데 적합한 과정을 찾아보세요. 이것 Java 프로그래밍 기초 – 자습 과정 의 기본을 다룹니다. Java 프로그래밍 언어, 데이터 유형, 연산자 및 흐름 제어, 루프, 문자열 , 그리고 훨씬 더. 더 이상 기다리지 마세요! 지금 JAVA 학습을 시작하고 완벽한 Java 엔지니어가 되어보세요!