산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> java

자바 - 예외

예외(또는 예외적인 이벤트)는 프로그램 실행 중에 발생하는 문제입니다. 예외가 발생한 경우 발생하면 프로그램의 정상적인 흐름이 중단되고 프로그램/응용 프로그램이 비정상적으로 종료되므로 권장하지 않으므로 이러한 예외를 처리해야 합니다.

예외는 여러 가지 이유로 발생할 수 있습니다. 다음은 예외가 발생하는 몇 가지 시나리오입니다.

이러한 예외 중 일부는 사용자 오류로 인해 발생하고 다른 예외는 프로그래머 오류로 인해 발생하며 다른 일부는 어떤 방식으로든 실패한 물리적 리소스에 의해 발생합니다.

이를 기반으로 세 가지 범주의 예외가 있습니다. 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을 처리하도록 알리는 것을 관찰할 수 있습니다.

예를 들어, 프로그램에서 크기가 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

다음에 주의하십시오 -

자원으로 시도

일반적으로 스트림, 연결 등과 같은 리소스를 사용할 때 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 문으로 작업하는 동안 다음 사항에 유의해야 합니다.

사용자 정의 예외

Java에서 고유한 예외를 생성할 수 있습니다. 자신만의 예외 클래스를 작성할 때 다음 사항을 염두에 두십시오 -

아래와 같이 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에서는 예외와 오류의 두 가지 범주를 정의할 수 있습니다.


java

  1. 자바 연산자
  2. 자바 주석
  3. 자바 for-each 루프
  4. 자바 문자열
  5. 자바 예외 처리
  6. 자바 던지기 및 던지기
  7. Java catch 다중 예외
  8. 자바 리소스 사용
  9. 자바 주석
  10. 자바 어설션