• 로그인 함 해보끄나?

  • Sarangnamu.net June 17, 2003
    Home Login Profile Study Open Project Q&A Google Code
    C++ 프로그래머 Java Essential 알기 #1
    Last Modify : 13 January, 2011(01:09)

    이번에는 예외처리에 대해서 알아 보겠다.

     

    함수형 프로그램의 경우 호출 후 오류 발생시 goto 를 이용하거나 바로 return 하여 호출한 함수로 바로 전달을 하게 되는데 C++ 과 java에서는 try... catch 를 이용하게 되는데 보통 try{ } 내에 오류가 발생하면 throw 를 발생 시켜 catch 에서 오류를 인지하게 된다.

     

     

    오류는 크게 Error 와 Exception 으로 구분되며 Error 의 경우 심각한 오류 (out of memory or stack over flow) 일 경우에 발생하고 Exception 의 경우 수습이 가능한 일반적인 오류를 발생할 때 발생하게 된다.

     

    먼저 각각의 exception 에 대해서 알아보자.. 해당 내용은 java.lang 에서 exception 항목에서 확인 할수 있다.

     

     

    ArithmeticException 
     산술 오류가 발생되었을 때 throw 한다 주로 0을 0으로 나눌 때 발생한다.


    ArrayIndexOutOfBoundsException 
     잘못된 인덱스를 사용해 배열을 잘못 엑서스 했을 때 발생한다.


    ArrayStoreException 
     잘못된 형태의 객체를 배열에 포함하려고 할 때 발생한다.


    ClassCastException 
     서로 관계가 없는 클래스를 캐스팅 하려고 할 때 발생한다.


    ClassNotFoundException 
     호출한 클래스가 존재하지 않을 경우 발생한다.

     
    CloneNotSupportedException 
     객체를 복제하기 위해서 Object 클래스의 clone 를 호출하였지만 객체의 클래스가 Cloneable 인터페이스를 가지고 있지 않을 경우 발생한다.


    EnumConstantNotPresentException 
     어플리케이션이 이름에 의해 enum 을 호출하거나? 존재하지 않는 enum 를 호출할 때 발생


    IllegalAccessException 
     어플리케이션이 배열 이외의 인스턴스를 생성하거나, 필드를 설정, 메소드 호출을 시도했을 경우 발생


    IllegalArgumentException 
     잘못된 인수, 또는 올바르지 않는 인수를 메소드에 전달할경우 발생


    IllegalMonitorStateException 
     모니터를 가지지 않은 쓰레드가 모니터를 기다릴때 발생 (모니터가 머임?)


    IllegalStateException 
     올바르지 않을 때에 메소드가 불려질 때 발생


    IllegalThreadStateException 
     요구된 오퍼레이션에 대해서 THREAD 상태가 올바르지 않은 것을 나타낼 때 발생


    IndexOutOfBoundsException 
     어떤 종류의 인덱스(배열, 캐릭터 라인, 벡터등)가 범위를 넘어선 것을 표현하려고 할 때 발생


    InstantiationException 
     클래스를 인스턴스 하려고 할 때 지정된 객체를 인스턴스 할 수 없을 때 발생 주로 abstract class 를 인스턴스 하거나 interface 를 인스턴스하려고 할 경우 발생


    InterruptedException 
     wait 나 sleep 메소드를 사용해 thread 가 대기 상태에 들어갔다가 깨어나지 못한 상태을 때 발생


    NegativeArraySizeException 
     배열의 크기를 -(음수) 로 지정할 때 발생


    NoSuchFieldException 
     존재하지 않는 필드를 참조하려고 할 때 발생


    NoSuchMethodException 
     존재하지 않는 메소드를 참조하려고 할 때 발생


    NullPointerException 
     사용하려고 하던 객체가 null 일 경우 발생


    NumberFormatException 
     문자열을 숫자로 변경하려고 하는데 문자열을 숫자로 변경할 수 없을 때

     

    SecurityException 
     보완관련해 위반을 했을 때 발생


    StringIndexOutOfBoundsException 
     문자열에 전체 길이보다 큰 값을 이용하려할 때 (예 substring, charAt) 발생


    TypeNotPresentException 
     사용하려는 타입이 정의되지 않았을 경우 발생


    UnsupportedOperationException
     구현되지 않는 메소드를 호출하려고 할 때 발생한다.

     


    private Vector vector;
    private static final int SIZE = 10;

    PrintWriter out = null;

    try {
        System.out.println("Entered try statement");
        out = new PrintWriter(new FileWriter("OutFile.txt"));
        for (int i = 0; i < SIZE; i++) {
            out.println("Value at: " + i + " = " + vector.elementAt(i));
        }
    }
    catch and finally statements . . .

    위의 코드는 vector 의 내용을 OutFile.txt 에 입력하는 간단한 코드로 만약 이 상황에 파일이 존재하지 않아 오류가 발생한다면다음처럼 코드를 생성해야할 것이다.


    } catch (FileNotFoundException e) {
        System.err.println("FileNotFoundException: " + e.getMessage());
        throw new SampleException(e);
        
    } catch (IOException e) {
        System.err.println("Caught IOException: " + e.getMessage());
    }


    위의 코드처럼 catch 는 계속해서 생성을 해서 만들 수 있고 마지막으로 java 에서는 c++ 과는 다르게 finally 라는 항목이 추가적으로 존재하는데 리소스를 해제가 필요할 때 등록을 하는 곳이다.  아래의 코드처럼 정상적으로 종료하였거나 오류가 발생하였을 때 out.close() 를 해야되는데 try, catch 아래처럼 중복 코드가 발생하므로 이를 보완하기 위해서 finally 에 out.close() 를 호출해 코드 중복을 피할 수 있다.

    try {
        
        out.close();       //Don't do this; it duplicates code. 
        
    } catch (FileNotFoundException e) {

        out.close();       //Don't do this; it duplicates code.
        System.err.println("Caught: FileNotFoundException: " + e.getMessage());
        throw new RuntimeException(e);

    } catch (IOException e) {
        
     System.err.println("Caught IOException: " + e.getMessage());

    }

    자 위의 모든 경우의 수를 적용한 올바른 완성된 소스를 보도록 하자.

    public void writeList()
    {
        PrintWriter out = null;

        try
     {
            System.out.println("Entering try statement");
            out = new PrintWriter(new FileWriter("OutFile.txt"));
        
      for (int i = 0; i < SIZE; i++)
      {
       out.println("Value at: " + i + " = " + vector.elementAt(i));
      }
        }
     catch (ArrayIndexOutOfBoundsException e)
     {
             System.err.println("Caught " + "ArrayIndexOutOfBoundsException: " +   e.getMessage());
        }
     catch (IOException e)
     {
             System.err.println("Caught IOException: " +  e.getMessage());
        }
     finally
     {
            if (out != null)
      {
       System.out.println("Closing PrintWriter");
                out.close();
      
            }
            else
      {
       System.out.println("PrintWriter not open");
            }
        }
    }

    ArrayIndexOutOfBoundsException 는 백터의 범위를 벗어났을 때 발생되는 오류 이고, IOException 는 일반적인 Input/Output 오류 상황이다.

    System.out 이 존재할 경우 finally 에서 file descriptor 를 제거하는 것이다. +

     

     

     

    추가 링크

    http://onjava.com/pub/a/onjava/2003/11/19/exceptions.html

     

    http://kaludin.egloos.com/2255332

     

    http://mysnyc.tistory.com/37


    Comment


    입력하3 1508772473



    Locations of visitors to this page