Latest web development tutorials

자바 예외 처리

예외는 프로그램에 약간의 오차가 있지만, 모든 에러는 예외이며, 종종 실수를 피할 수있다.

예를 들어, 코드 덜 세미콜론, 다음 결과가 부족하면 잘못된 java.lang.Error가 메시지를 표시하는 것입니다, 당신은에서 System.out.println (11/0), 당신이하고있는를 사용하는 경우는 제수를 사용하기 때문에 0 그것은 java.lang.ArithmeticException 예외가 발생합니다.

예외가 발생에 대한 많은 이유는 일반적으로 다음과 같은 범주가 포함되어 있습니다 :

  • 사용자 입력 데이터 부정.
  • 존재하지 않는 파일을 엽니 다.
  • 네트워크 통신 접속은 중단되거나 JVM 메모리를 오버 플로우한다.

중 사용자 오류로 인해 이러한 예외는 일부 절차 적 오류가 다른 물리적 오류가 있기 때문에 발생하는 원인이되었다. -

자바 예외 처리를 이해하는 것은 당신이 예외의 다음과 같은 세 가지 유형을 가질 필요가 작동하는 방법이다 :

  • 체크 예외 : 가장 대표적인 예외는 사용자 오류 또는 문제로 인한 예외, 그것은 프로그래머가 예측할 수 있습니다 확인했습니다. 예를 들어, 당신은 예외가 단순히 컴파일시에 무시할 수없는 예외가 발생, 존재하지 않는 파일을 열려고 할 때.
  • 실행 시간 예외 : 예외는 프로그래머가 오동작을 방지하는 것으로 보인다. 체크 예외와는 대조적으로, 실행 예외는 컴파일시에 무시할 수있다.
  • 오류 오류 비정상 아니지만 프로그래머 제어 문제에서. 코드 오류는 일반적으로 무시됩니다. 스택 오버플로 오류가 발생하면, 예를 들어, 그들은 컴파일시 확인할 수 없다.

예외 클래스 계층 구조

모든 예외 클래스의 java.lang.Exception의 서브 클래스에서 상속합니다.

예외 클래스의 Throwable 클래스의 서브 클래스입니다. 예외 클래스 외에 오류의 Throwable의 서브 클래스가있다.

Java 프로그램은 일반적으로 에러 캐치하지 않는다. 심각한 오류, 그들은 자바 프로그램 처리 외부에서 볼 때 오류가 일반적으로 발생합니다.

에러를 나타 내기 위해 사용 오류 런타임 환경에서 발생한다.

예컨대, JVM 메모리 오버플. 일반적으로, 프로그램은 오류를 복구하지 않는다.

IOException이 클래스와의 RuntimeException 클래스 : 예외 클래스는 두 가지 하위 범주가 있습니다.

내장 된 자바 클래스 (다음은 설명한다), 그것은 보통 검사와 체크되지 않는 예외의 대부분을 보유하고 있습니다.


내장 Java 예외 클래스

자바 언어는 표준 java.lang 패키지 몇몇 예외 클래스를 정의한다.

표준 런타임 예외 클래스는 일반적인 예외 클래스의 서브 클래스이다. 이상 상속 런타임 예외 클래스에서 가장 직접 사용할 수 있도록 java.lang 패키지 때문에, 모든 자바 프로그램에 기본적으로로드됩니다.

다양한 자바 클래스 라이브러리에 따라 다른 예외의 수를 정의 다음 표는 Java 체크되지 않는 예외가 나열되어 있습니다.

이상 기술
arithmeticexception이 때 비정상 운전 조건이 예외가 발생합니다. 예를 들어, 정수 "0으로 나누기"는이 클래스의 인스턴스를 발생합니다.
는, ArrayIndexOutOfBoundsException 부정한 인덱스를 던져 배열에 액세스 할 수 있습니다. 인덱스가 부정하거나 또는보다 어레이의 동일한 크기 크면 인덱스 불법 인덱스이다.
ArrayStoreException을 발생한 예외의 배열로 객체의 잘못된 유형을 저장하려고합니다.
ClassCastException이 당신이 캐스팅 할 때 목적은 슬로우 서브 클래스의 인스턴스가 아닙니다.
IllegalArgumentException가 이 방법은 불법 또는 부적절한 인수를 전달되었음을 나타냅니다.
예외 : IllegalMonitorStateException 스레드가 객체의 모니터에 대기 또는 다른 개체가 지정한 모니터없이 스레드가 모니터를 기다리고 있습니다 통지를 시도한 것을 나타 내기 위해서 (때문에) 슬로우됩니다.
IllegalStateException이 부정 또는 부적절한 시간의 경우에 신호를 생성하는 메소드를 호출한다. 즉, 자바 환경이나 자바 애플리케이션은 요구 된 동작에 대한 적절한 상태가 아니다.
예외 : IllegalThreadStateException 요청한 작업이 발생 필요할 때 스레드가 적절한 상태에 있지 않습니다.
IndexOutOfBoundsException가 이 범위를 벗어 던져 (예 : 배열, 문자열 또는 벡터 정렬 등) 정렬 인덱스를 나타냅니다.
없는 NegativeArraySizeException 응용 프로그램이 음의 크기와 배열을 만들려고 할 경우에 슬로우됩니다.
NullPointerException이 응용 프로그램은 지역의 필요에서 개체를 사용하려고 할 때 null 슬로우 때
NumberFormatException이 어플리케이션의 숫자 입력에 문자열을 변환하려고하지만 문자열을 적절한 포맷으로 변환 할 수없는 경우, 이상을 걸려.
SecurityException가 보안 관리자는 예외가 발생함으로써, 보안 위반을 나타냅니다.
StringIndexOutOfBoundsException를 로부터이 예외 String 인덱스가 부 또는 캐릭터 라인의 사이즈보다 큰 일을 나타냅니다하는 방법을 던졌습니다.
UnsupportedOperationException가 요청 된 작업은 슬로우 지원되지 않음됩니다.

다음 표는 java.lang 패키지에 정의 된 자바 예외 클래스를 확인 나열합니다.

이상 기술
ClassNotFoundException가 응용 프로그램이 클래스를로드하려고합니다, 당신은 슬로우 해당 클래스를 찾을 수 없습니다.
는 CloneNotSupportedException 당신은 호출 할 때 Object 클래스 clone 개체를 복제하는 방법을하지만, 객체의 클래스를 구현할 수 없습니다 Cloneable 슬로우 인터페이스를.
시 IllegalAccessException 경우에 슬로우 클래스에 대한 액세스를 거부.
시 InstantiationException 사용하려고하면 Class 클래스의 newInstance 가 인터페이스 또는 추상 클래스가 인스턴스화 할 수 없기 때문에, 지정된 클래스 객체를 클래스 메소드의 인스턴스를 만듭니다 이상을 걸려.
예외 : InterruptedException 스레드가 다른 스레드에 의해 중단되고,이 예외가 발생합니다.
NoSuchFieldException 변수 존재하지 않는 요청
는, NoSuchMethodException 방법이 존재하지 않는 요청

변칙

다음은 주요 방법의 Throwable 클래스입니다 :

아니오. 방법 및 설명
(1) 공공 문자열 GetMessage 함수 ()
예외가 발생에 대한 자세한 정보를 돌려줍니다. 의 Throwable 클래스의 생성자에서 초기화 뉴스.
공공의 Throwable getCause ()
예외에 대한 이유를 나타내는의 Throwable 객체를 돌려줍니다.
3 공공 문자열 toString ()
GetMessage 함수 ()를 사용하여 결과 캐스케이드의 클래스의 이름을 반환합니다.
4 공공 무효의 printStackTrace ()
인쇄 toString () 결과 및 System.err에, 즉 에러 출력 스트림에 스택 수준.
(5) 공개되는 StackTraceElement [] getStackTrace ()에 ()
그것은 스택 레벨을 포함하는 배열을 반환합니다. 0 첨자 요소는 스택의 상부를 나타내며, 마지막 요소는 스택의 메소드 호출 스택의 바닥을 나타낸다.
6 공공의 Throwable에 fillInStackTrace ()
오브젝트의 Throwable 스택 호출 스택 레벨의 전류 레벨로 충전되어, 이전 내용의 스택 레벨에 첨가 하였다.

예외를 잡아라

사용하려고 캐치 키워드는 예외를 잡을 수 있습니다. 발생할 수있는 장소 예외가 / catch 블록을 시도합니다.

구문 try / catch 블록 코드는 다음과 같이 시도 / 캐치는 사용하여 보호 코드라고합니다 :

try
{
   // 程序代码
}catch(ExceptionName e1)
{
   //Catch 块
}

catch 문은 명령문의 유형을 캡처 할 수있는 예외가 포함되어 있습니다. 예외가 발생 보호 코드 블록, 캐치 블록의 뒷면에 때 체크된다.

예외가 catch 블록에 포함 된 경우, 예외는 catch 블록에 전달하고,이 메서드에 매개 변수가 동일 전달됩니다.

코드가 예외를 던질 때 배열의 세 번째 요소에 액세스하려고 할 때 다음의 예는, 2 요소의 배열을 선언했다.

// 文件名 : 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

여러 개의 catch 블록

코드 블록 후 catch 코드 블록들의 복수의 다중 캡처를 수행하도록 시도 불린다.

다음과 같이 여러 개의 catch 블록 구문은 다음과 같습니다

 try{
    // 程序代码
 }catch(异常类型1 异常的变量名1){
    // 程序代码
 }catch(异常类型2 异常的变量名2){
    // 程序代码
 }catch(异常类型2 异常的变量名2){
    // 程序代码
 }

위의 코드는 세 개의 catch 블록이 포함되어 있습니다.

당신은 try 문 뒤에 catch 블록의 수를 추가 할 수 있습니다.

예외가 보호 코드에서 발생하는 경우, 예외가 첫 번째 catch 블록에 발생합니다.

당신이 캡처됩니다 ExceptionType1의 데이터 형식 불일치 예외가 발생합니다.

그렇지 않은 경우는 상기 제 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;
}

/ 던져 키워드를 던졌습니다 :

방법은 체크 예외를 포착하지 않는다면, 상기 방법은 선언하는 키워드를 슬로우 사용해야한다. 메소드 서명의 끝에 배치 키워드를 던졌습니다.

당신은 또한 새로운 또는 새로 캡처 인스턴스인지 여부를 키워드 던져는, 예외를 발생 사용할 수 있습니다.

다음과 같은 방법을 선언는 RemoteException 예외가 발생합니다 :

import java.io.*;
public class className
{
   public void deposit(double amount) throws RemoteException
   {
      // Method implementation
      throw new RemoteException();
   }
   //Remainder of class definition
}

방법은 여러 예외 사이의 쉼표로 구분 된 여러 예외를 던져 선언 할 수 있습니다.

예를 들어, 다음 메소드 선언은 RemoteException을하고 InsufficientFundsException가 발생합니다 :

import java.io.*;
public class className
{
   public void withdraw(double amount) throws RemoteException,
                              InsufficientFundsException
   {
       // Method implementation
   }
   //Remainder of class definition
}

마지막 키워드

마지막 키워드는 코드 블록 수행하려고 한 후 코드 블록을 생성하는 데 사용된다.

예외가 발생하는지의 여부를, 마지막 코드 블록 코드가 항상 실행된다.

finally 블록, 당신은 문을 종료하는 유형의 자연의 여파를 정리 실행할 수 있습니다.

finally 블록은 다음과 같이 구문은 마지막 catch 블록에 나타납니다 :

 try{
    // 程序代码
 }catch(异常类型1 异常的变量名1){
    // 程序代码
 }catch(异常类型2 异常的变量名2){
    // 程序代码
 }finally{
    // 程序代码
 }
 

 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

다음과 같은 사항 참고 :

  • 캐치는 독립적으로 시도의 존재할 수 없습니다.
  • 은 try에서 / catch 블록은 마지막으로 필수 요구 사항 후 추가되지 않습니다.
  • 아니 시도의 catch 블록 후 둘 다 마지막으로 차단하지 않았다.
  • 마지막으로 블록 사이에 코드를 추가 할 수 없습니다, 잡아보십시오.

문 정의 예외

자바에서는 예외를 사용자 정의 할 수 있습니다. 다음 포인트는 자신의 예외 클래스를 작성하는 것을 기억해야합니다.

  • 모든 예외의 Throwable의 서브 클래스해야합니다.
  • 당신이 체크 예외 클래스를 작성하려면 예외 클래스를 상속해야합니다.
  • 당신이 런타임 예외 클래스를 작성하려는 경우, 당신은 RuntimeException의 클래스를 상속해야합니다.

이 같은 자신의 예외 클래스를 정의 할 수 있습니다 :

class MyException extends Exception{
}

만 상속 예외 클래스를 만들 수있는 예외 클래스는 예외 클래스를 검사합니다.

다음 InsufficientFundsException 클래스는 Exception에서 상속 사용자 정의 예외 클래스입니다.

예외 클래스와 다른 클래스, 변수와 메소드를 포함합니다.

// 文件名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가 발생 포함되어 있습니다.

// 文件名称 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 클래스 보증금 ()와 () 메소드를 취소하는 방법을 보여줍니다.

//文件名称 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)

일반 예외

그것은 자바에서 예외 및 오류의 두 가지 유형을 정의합니다.

  • JVM (자바 가상 머신) 예외 : JVM 또는 오류에 의해 throw 예외입니다. NullPointerException이 클래스는, ArrayIndexOutOfBoundsException 클래스는 ClassCastException 클래스 예를 들면 다음과 같습니다.
  • 프로그램 수준의 예외 : 프로그램이나 발생하여 API 프로그램입니다. 예를 들어 클래스는 IllegalArgumentException, IllegalStateException이 클래스.