java
예외(또는 예외적인 이벤트)는 프로그램 실행 중에 발생하는 문제입니다. 예외가 발생한 경우 발생하면 프로그램의 정상적인 흐름이 중단되고 프로그램/응용 프로그램이 비정상적으로 종료되므로 권장하지 않으므로 이러한 예외를 처리해야 합니다.
예외는 여러 가지 이유로 발생할 수 있습니다. 다음은 예외가 발생하는 몇 가지 시나리오입니다.
사용자가 잘못된 데이터를 입력했습니다.
열어야 할 파일을 찾을 수 없습니다.
통신 도중 네트워크 연결이 끊겼거나 JVM의 메모리가 부족합니다.
이러한 예외 중 일부는 사용자 오류로 인해 발생하고 다른 예외는 프로그래머 오류로 인해 발생하며 다른 일부는 어떤 방식으로든 실패한 물리적 리소스에 의해 발생합니다.
이를 기반으로 세 가지 범주의 예외가 있습니다. Java에서 예외 처리가 작동하는 방식을 알기 위해서는 그것들을 이해해야 합니다.
확인된 예외 − 확인된 예외는 컴파일 시간에 컴파일러가 확인(통지)하는 예외이며 컴파일 시간 예외라고도 합니다. 이러한 예외는 단순히 무시할 수 없으며 프로그래머는 이러한 예외를 처리(처리)해야 합니다.
예를 들어 FileReader를 사용하는 경우 파일에서 데이터를 읽는 프로그램의 클래스, 생성자에 지정된 파일이 존재하지 않으면 FileNotFoundException 발생하고 컴파일러는 프로그래머에게 예외를 처리하라는 메시지를 표시합니다.
import java.io.File; import java.io.FileReader; public class FilenotFound_Demo { public static void main(String args[]) { File file = new File("E://file.txt"); FileReader fr = new FileReader(file); } }
위의 프로그램을 컴파일하려고 하면 다음과 같은 예외가 발생합니다.
C:\>javac FilenotFound_Demo.java FilenotFound_Demo.java:8: error: unreported exception FileNotFoundException; must be caught or declared to be thrown FileReader fr = new FileReader(file); ^ 1 error
참고 − read() 메소드 이후 및 닫기() FileReader 클래스에서 IOException이 발생하면 컴파일러가 FileNotFoundException과 함께 IOException을 처리하도록 알리는 것을 관찰할 수 있습니다.
확인되지 않은 예외 − 체크되지 않은 예외는 실행 시 발생하는 예외이다. 이를 런타임 예외라고도 합니다. . 여기에는 논리 오류 또는 API의 부적절한 사용과 같은 프로그래밍 버그가 포함됩니다. 런타임 예외는 컴파일 시 무시됩니다.
예를 들어, 프로그램에서 크기가 5인 배열을 선언하고 6 번째 배열의 요소 다음 ArrayIndexOutOfBoundsExceptionException 발생합니다.
public class Unchecked_Demo { public static void main(String args[]) { int num[] = {1, 2, 3, 4}; System.out.println(num[5]); } }
위의 프로그램을 컴파일하여 실행하면 다음과 같은 예외가 발생합니다.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 at Exceptions.Unchecked_Demo.main(Unchecked_Demo.java:8)
오류 − 이는 전혀 예외가 아니라 사용자나 프로그래머의 통제 범위를 넘어서 발생하는 문제입니다. 오류에 대해 거의 아무 것도 할 수 없기 때문에 오류는 일반적으로 코드에서 무시됩니다. 예를 들어 스택 오버플로가 발생하면 오류가 발생합니다. 컴파일 시에도 무시됩니다.
모든 예외 클래스는 java.lang.Exception 클래스의 하위 유형입니다. 예외 클래스는 Throwable 클래스의 하위 클래스입니다. 예외 클래스 외에 Throwable 클래스에서 파생된 Error라는 또 다른 하위 클래스가 있습니다.
오류는 심각한 장애가 발생한 경우 발생하는 비정상적인 상태이며 Java 프로그램에서 처리하지 않습니다. 런타임 환경에서 생성된 오류를 나타내기 위해 오류가 생성됩니다. 예:JVM의 메모리가 부족합니다. 일반적으로 프로그램은 오류에서 복구할 수 없습니다.
Exception 클래스에는 IOException 클래스와 RuntimeException 클래스의 두 가지 주요 하위 클래스가 있습니다.
다음은 가장 일반적인 체크 및 체크되지 않은 Java의 내장 예외 목록입니다.
다음은 Throwable 클래스에서 사용할 수 있는 중요한 메서드 목록입니다.
Sr.No. | 방법 및 설명 |
---|---|
1 | 공개 문자열 getMessage() 발생한 예외에 대한 자세한 메시지를 반환합니다. 이 메시지는 Throwable 생성자에서 초기화됩니다. |
2 | 공개 throwable getCause() Throwable 객체가 나타내는 예외의 원인을 반환합니다. |
3 | 공개 문자열 toString() getMessage()의 결과와 연결된 클래스의 이름을 반환합니다. |
4 | 공개 무효 printStackTrace() 오류 출력 스트림인 System.err에 대한 스택 추적과 함께 toString()의 결과를 인쇄합니다. |
5 | 공개 StackTraceElement [] getStackTrace() 스택 추적의 각 요소를 포함하는 배열을 반환합니다. 인덱스 0의 요소는 호출 스택의 맨 위를 나타내고 배열의 마지막 요소는 호출 스택의 맨 아래에 있는 메서드를 나타냅니다. |
6 | 공개 throwable fillInStackTrace() 이 Throwable 개체의 스택 추적을 현재 스택 추적으로 채우고 스택 추적의 이전 정보에 추가합니다. |
메소드는 try 조합을 사용하여 예외를 포착합니다. 잡기 키워드. 예외를 생성할 수 있는 코드 주위에 try/catch 블록이 배치됩니다. try/catch 블록 내의 코드를 보호 코드라고 하며 try/catch를 사용하는 구문은 다음과 같습니다. -
try { // Protected code } catch (ExceptionName e1) { // Catch block }
예외가 발생하기 쉬운 코드는 try 블록에 배치됩니다. 예외가 발생하면 발생한 예외는 연관된 catch 블록에 의해 처리됩니다. 모든 try 블록 바로 뒤에 catch 블록이나 finally 블록이 와야 합니다.
catch 문에는 catch하려는 예외 유형을 선언하는 작업이 포함됩니다. 보호된 코드에서 예외가 발생하면 try 다음에 오는 catch 블록이 검사됩니다. catch 블록에 발생한 예외 유형이 나열되면 메서드 매개 변수에 인수가 전달되는 것처럼 예외가 catch 블록에 전달됩니다.
다음은 2개의 요소로 선언된 배열입니다. 그런 다음 코드는 3 rd 액세스를 시도합니다. 예외를 발생시키는 배열의 요소입니다.
라이브 데모// File Name : ExcepTest.java import java.io.*; public class ExcepTest { public static void main(String args[]) { try { int a[] = new int[2]; System.out.println("Access element three :" + a[3]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Exception thrown :" + e); } System.out.println("Out of the block"); } }
이것은 다음 결과를 생성합니다 -
Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3 Out of the block
try 블록 다음에 여러 catch 블록이 올 수 있습니다. 여러 catch 블록의 구문은 다음과 같습니다. -
try { // Protected code } catch (ExceptionType1 e1) { // Catch block } catch (ExceptionType2 e2) { // Catch block } catch (ExceptionType3 e3) { // Catch block }
이전 명령문은 세 개의 catch 블록을 보여주지만 한 번 시도한 후에는 원하는 수만큼 사용할 수 있습니다. 보호된 코드에서 예외가 발생하면 목록의 첫 번째 catch 블록에 예외가 throw됩니다. 던져진 예외의 데이터 유형이 ExceptionType1과 일치하면 그곳에서 포착됩니다. 그렇지 않은 경우 예외는 두 번째 catch 문으로 전달됩니다. 이것은 예외가 catch되거나 모든 catch를 통해 떨어질 때까지 계속됩니다. 이 경우 현재 메서드가 실행을 중지하고 예외가 호출 스택의 이전 메서드로 throw됩니다.
다음은 여러 try/catch 문을 사용하는 방법을 보여주는 코드 부분입니다.
try { file = new FileInputStream(fileName); x = (byte) file.read(); } catch (IOException i) { i.printStackTrace(); return -1; } catch (FileNotFoundException f) // Not valid! { f.printStackTrace(); return -1; }
Java 7부터 단일 catch 블록을 사용하여 둘 이상의 예외를 처리할 수 있으므로 이 기능은 코드를 단순화합니다. 다음은 수행 방법입니다 -
catch (IOException|FileNotFoundException ex) { logger.log(ex); throw ex;
메소드가 확인된 예외를 처리하지 않는 경우 메소드는 throws를 사용하여 예외를 선언해야 합니다. 예어. throws 키워드는 메서드 서명 끝에 나타납니다.
throw를 사용하여 새로 인스턴스화된 예외 또는 방금 포착한 예외를 throw할 수 있습니다. 키워드.
throws와 throw 키워드, throws의 차이점을 이해하려고 노력하십시오. 확인된 예외 처리를 연기하고 throw하는 데 사용됩니다. 명시적으로 예외를 호출하는 데 사용됩니다.
다음 메소드는 RemoteException을 던진다고 선언합니다 -
import java.io.*; public class className { public void deposit(double amount) throws RemoteException { // Method implementation throw new RemoteException(); } // Remainder of class definition }
메서드는 둘 이상의 예외를 throw한다고 선언할 수 있습니다. 이 경우 예외는 쉼표로 구분된 목록에 선언됩니다. 예를 들어 다음 메서드는 RemoteException 및 InsufficientFundsException -
을 throw한다고 선언합니다.import java.io.*; public class className { public void withdraw(double amount) throws RemoteException, InsufficientFundsException { // Method implementation } // Remainder of class definition }
finally 블록은 try 블록이나 catch 블록 다음에 옵니다. finally 코드 블록은 예외 발생에 관계없이 항상 실행됩니다.
finally 블록을 사용하면 보호된 코드에서 어떤 일이 발생하더라도 실행하려는 모든 정리 유형 명령문을 실행할 수 있습니다.
finally 블록은 catch 블록의 끝에 나타나며 다음과 같은 구문을 갖습니다 -
try { // Protected code } catch (ExceptionType1 e1) { // Catch block } catch (ExceptionType2 e2) { // Catch block } catch (ExceptionType3 e3) { // Catch block }finally { // The finally block always executes. }
public class ExcepTest { public static void main(String args[]) { int a[] = new int[2]; try { System.out.println("Access element three :" + a[3]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Exception thrown :" + e); }finally { a[0] = 6; System.out.println("First element value: " + a[0]); System.out.println("The finally statement is executed"); } } }
이것은 다음 결과를 생성합니다 -
Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3 First element value: 6 The finally statement is executed
다음에 주의하십시오 -
catch 절은 try 문 없이 존재할 수 없습니다.
try/catch 블록이 있을 때마다 finally 절이 있어야 하는 것은 아닙니다.
try 블록은 catch 절이나 finally 절 없이 존재할 수 없습니다.
try, catch, finally 블록 사이에는 코드가 있을 수 없습니다.
일반적으로 스트림, 연결 등과 같은 리소스를 사용할 때 finally 블록을 사용하여 명시적으로 닫아야 합니다. 다음 프로그램에서는 FileReader를 사용하여 파일에서 데이터를 읽고 있습니다. 그리고 finally 블록을 사용하여 닫습니다.
import java.io.File; import java.io.FileReader; import java.io.IOException; public class ReadData_Demo { public static void main(String args[]) { FileReader fr = null; try { File file = new File("file.txt"); fr = new FileReader(file); char [] a = new char[50]; fr.read(a); // reads the content to the array for(char c : a) System.out.print(c); // prints the characters one by one } catch (IOException e) { e.printStackTrace(); }finally { try { fr.close(); } catch (IOException ex) { ex.printStackTrace(); } } } }
자원으로 시도 , 자동 리소스 관리라고도 함 는 try catch 블록 내에서 사용되는 리소스를 자동으로 닫는 Java 7에 도입된 새로운 예외 처리 메커니즘입니다.
이 문장을 사용하려면 괄호 안에 필요한 자원을 선언하기만 하면 되며, 생성된 자원은 블록이 끝날 때 자동으로 닫힙니다. 다음은 try-with-resources 문의 구문입니다.
try(FileReader fr = new FileReader("file path")) { // use the resource } catch () { // body of catch } }
다음은 try-with-resources 문을 사용하여 파일의 데이터를 읽는 프로그램입니다.
import java.io.FileReader; import java.io.IOException; public class Try_withDemo { public static void main(String args[]) { try(FileReader fr = new FileReader("E://file.txt")) { char [] a = new char[50]; fr.read(a); // reads the contentto the array for(char c : a) System.out.print(c); // prints the characters one by one } catch (IOException e) { e.printStackTrace(); } } }
try-with-resources 문으로 작업하는 동안 다음 사항에 유의해야 합니다.
try-with-resources 문이 있는 클래스를 사용하려면 AutoCloseable을 구현해야 합니다. 인터페이스 및 close() 메소드는 런타임에 자동으로 호출됩니다.
try-with-resources 문에서 둘 이상의 클래스를 선언할 수 있습니다.
try-with-resources 문의 try 블록에서 여러 클래스를 선언하는 동안 이러한 클래스는 역순으로 닫힙니다.
괄호 안의 리소스 선언을 제외하고는 모두 try 블록의 일반 try/catch 블록과 동일합니다.
try에서 선언된 리소스는 try 블록이 시작되기 직전에 인스턴스화됩니다.
try 블록에서 선언된 리소스는 암시적으로 final로 선언됩니다.
Java에서 고유한 예외를 생성할 수 있습니다. 자신만의 예외 클래스를 작성할 때 다음 사항을 염두에 두십시오 -
모든 예외는 Throwable의 자식이어야 합니다.
Handle 또는 Declare Rule에 의해 자동으로 적용되는 확인된 예외를 작성하려면 Exception 클래스를 확장해야 합니다.
런타임 예외를 작성하려면 RuntimeException 클래스를 확장해야 합니다.
아래와 같이 Exception 클래스를 정의할 수 있습니다. -
class MyException extends Exception { }
미리 정의된 예외를 확장하기만 하면 됩니다. 자신의 Exception을 생성하는 클래스입니다. 이는 확인된 예외로 간주됩니다. 다음 InsufficientFundsException class는 Exception 클래스를 확장하여 검사된 예외로 만드는 사용자 정의 예외입니다. 예외 클래스는 유용한 필드와 메서드를 포함하는 다른 클래스와 같습니다.
// File Name InsufficientFundsException.java import java.io.*; public class InsufficientFundsException extends Exception { private double amount; public InsufficientFundsException(double amount) { this.amount = amount; } public double getAmount() { return amount; } }
사용자 정의 예외를 사용하는 방법을 보여주기 위해 다음 CheckingAccount 클래스에는 InsufficientFundsException을 발생시키는 철회() 메서드가 포함되어 있습니다.
// File Name CheckingAccount.java import java.io.*; public class CheckingAccount { private double balance; private int number; public CheckingAccount(int number) { this.number = number; } public void deposit(double amount) { balance += amount; } public void withdraw(double amount) throws InsufficientFundsException { if(amount <= balance) { balance -= amount; }else { double needs = amount - balance; throw new InsufficientFundsException(needs); } } public double getBalance() { return balance; } public int getNumber() { return number; } }
다음 BankDemo 프로그램은 CheckingAccount의 예금() 및 인출() 메서드를 호출하는 방법을 보여줍니다.
// File Name BankDemo.java public class BankDemo { public static void main(String [] args) { CheckingAccount c = new CheckingAccount(101); System.out.println("Depositing $500..."); c.deposit(500.00); try { System.out.println("\nWithdrawing $100..."); c.withdraw(100.00); System.out.println("\nWithdrawing $600..."); c.withdraw(600.00); } catch (InsufficientFundsException e) { System.out.println("Sorry, but you are short $" + e.getAmount()); e.printStackTrace(); } } }
위의 세 파일을 모두 컴파일하고 BankDemo를 실행합니다. 이것은 다음 결과를 생성합니다 -
Depositing $500... Withdrawing $100... Withdrawing $600... Sorry, but you are short $200.0 InsufficientFundsException at CheckingAccount.withdraw(CheckingAccount.java:25) at BankDemo.main(BankDemo.java:13)
Java에서는 예외와 오류의 두 가지 범주를 정의할 수 있습니다.
JVM 예외 − JVM에서 독점적으로 또는 논리적으로 throw되는 예외/오류입니다. 예:NullPointerException, ArrayIndexOutOfBoundsException, ClassCastException.
프로그래매틱 예외 − 이러한 예외는 애플리케이션 또는 API 프로그래머에 의해 명시적으로 발생합니다. 예:IllegalArgumentException, IllegalStateException.
java
자바에서 사용자 정의 예외란 무엇입니까? 사용자 정의 예외 또는 사용자 정의 예외는 자신의 예외 클래스를 만들고 throw 키워드를 사용하여 해당 예외를 throw합니다. 이는 Exception 클래스를 확장하여 수행할 수 있습니다. 파생 클래스의 예외 클래스에서 사용할 수 있는 위의 메서드를 재정의할 필요가 없습니다. 그러나 실제로는 프로그래밍 요구 사항에 따라 어느 정도의 사용자 지정이 필요합니다. 예: 사용자 정의 예외 클래스를 생성하려면 1단계) 다음 코드를 편집기에 복사하십시오. class JavaExcept
자바에서 키워드 발생 Java throw 키워드 프로그램 실행 중에 발생할 수 있는 예외 정보를 선언하는 데 사용됩니다. 프로그래머에게 예외에 대한 정보를 제공합니다. 프로그램 실행의 정상적인 흐름을 유지할 수 있도록 예외 처리 코드를 제공하는 것이 좋습니다. Java 프로그램에서 예외를 발생시키는 라이브러리 메소드를 사용한다고 가정합니다. 프로그램에서 try &catch를 사용하여 이 예외를 처리합니다. import java.io.*; class file1{ public static void main(String[