2020년 11월 12일

업데이트:


예외 처리

finall

Exception 발생 여부와 관계없이 꼭 처리해야 하는 로직 기술이다. 중간에 return문을 만나도 finally구문은 실행되지만 System.exit();를 만나면 무조건 프로그램이 종료된다. 주로 java.io.나 java.sql 패키지의 메소드 처리 시 이용된다.


public void example5() throws Exception {
    // 정수를 두 개 입력받아 나누어 몫을 출력하는 프로그램

    // 발생할 수 있는 예외 : 0으로 나눴을 때, 정수가 아닌 값을 입력했을 때

    Scanner sc = new Scanner(System.in);
    try {
      System.out.print("입력 1 : ");
      int num1 = sc.nextInt();
      System.out.print("입력 2 : ");
      int num2 = sc.nextInt();

      System.out.println("결과 : " + num1 / num2);

      throw new Exception();
    }catch(InputMismatchException e){
      System.out.println("정수만 입력해주세요.");
      e.printStackTrace();
    }catch(ArithmeticException e){
      System.out.println("0으로 나눌 수 없습니다.");
      System.out.println(e.getMessage());
      e.printStackTrace();
    }catch(Exception e) {
      e.printStrackTrace();
    }
    finally {
      System.out.println("프로그램 종료");
    }
}



throws

메소드 선언 시 throws를 추가하여 호출한 상위 메소드에게 처리를 위임한다. 계속 위임을 하게 되면 main()메소드까지 위임하게 되고 main()메소드에서도 처리되지 않는 경우엔 프로그램이 비정상 종료된다.


public void example6() {
  System.out.println("6 호출됨.");

  try{
    example6_1();
  }catch(ArithmeticException e){
    System.out.println("0으로 나눌 수 없습니다.");
  }catch(NullPointerException e){
    System.out.println("NullPointerException이 발생했습니다.");
  }
}

public void example6_1() throws ArithmeticException, NullPointerException {
  System.out.println("6_1 호출됨");
  example6_2();
}

public void example6_2() throws ArithmeticException, NullPointerException{
		System.out.println("6_2 호출됨.");
		example6_3();
	}

public void example6_3() throws ArithmeticException{
System.out.println("6_3 호출됨.");
// 예외를 강제로 발생시켜 던지기
//throw new NullPointerException();
//  NullPointerException은 RuntimeException의 후손으로
// UncheckdException 분류에 포함되어 별도의 예외처리가 없어도 된다.
		
		throw new InputZeroException();
//InputZeroException 클래스처럼 RuntimeException이 아닌 다른 예외 클래스를 상속한 클래스들은
// 모두 CheckedException 분류에 포함되어
// 반드시 예외처리가 필요함.
}



사용자 정의 예외

Exception 클래스를 상속받아 예외 클래스를 작성하는 것으로 자바 API에서 제공하는 예외 클래스만으로는 처리할 수 없는 예외가 있을 경우 사용자의 필요에 따라 생성하는 예외 클래스이다.


public void example7() {
  try {
    System.out.println("프로그램 실행");
    sumMethod();

    System.out.println("프로그램 정상 종료");
  }catch(InputZeroException e){
    System.out.println(e.getMessage());
    System.out.println("비정상 종료");
    e.printStackTrace();
  }
}

public void sumMethod() throws InputZeroException {
  Scanner sc = new Scanner(System.in);
  int sum = 0;

  for(int i = 0; i < 3; i++){
    System.out.print("입력" + (i + 1) + " : ");
    int num = sc.nextInt();
    if(num == 0) {
      throw new InputZeroException("0 좀 입력하지마");
    }
    sum += num;
  }
  System.out.print("합계 : " + sum);
}
// InputZeroException.java

public class InputZeroException extends RuntimeException{
  // 예외로 만드려고하는 클래스에 Exception 관련 클래스 상속

public InputZeroException() {
  System.out.println("0이 입력되었습니다.");
}

//오버로딩
public InputZeroException(String msg) {
  super(msg);
}




IO(입출력)

Input과 Output의 약자로 컴퓨터 내부 또는 외부 장치와 프로그램 간의 데이터를 주고 받는 것을 의미한다. 장치와 입출력을 위해서는 하드웨어 장치에 직접 접근이 필요한데 다양한 매체에 존재하는 데이터들을 사용하기 위해 입출력 데이터를 처리할 공통적인 방법으로 스트림을 이용한다.


File 클래스

파일 시스템의 파일을 표현하는 클래스. 파일 크기, 파일 속성, 파일 이름 등의 정보와 파일 생성 및 삭제 기능을 제공한다.

public void example1() {
    try {
        // 1. 파일 생성
        File f1 = new File("test1234.txt");
        //--> 파일 이름만 적혀있는 경우 현재 프로젝트 최상단을 의미함

        //test1234.txt 파일이 존재한다면?
        // --> f1 변수를 통해서 실제 test1234.txt 파일에 접근할 수 있게 된다.

        f1.createNewFile();
        //createNewFile() : 새로운 파일을 생성하는 메소드
        // --> 자바 프로그램 -> 실제 컴퓨터 저장소로 파일을 출력함
        // 입력 또는 출력과 관련된 메소드는 IOException을 발생시킬 가능성이 있다.
        // --> IOException은 예외처리를 반드시 해줘야하는 checkedException이다.
    }catch(IOException e) {
        e.printStackTrace();
    }
}

public void example2() {
    // 2. 원하는 위치에 파일 생성
    // 절대 경로를 이용하여 C드라이브에 있는 dev 폴더에 파일 생성하기
    // 절대 경로 : 최상위 드라이브 또는 폴더로부터의 경로를 모두 작성
    try {
        File f2 = new File("C:/dev/test.txt");
        if(f2.createNewFile()) {
            System.out.println("파일 생성 성공");
        } else {
            System.out.println("파일 생성 실패");
        }
    }catch(IOException e) {
        e.printStackTrace();
    }
}

public void example3() {
    // 3. 원하는 위치에 파일 생성
    // 현재 프로젝트의 src 폴더 밑에 test.txt 파일 생성하기
    // 상대 경로 : 현재 파일의 위치를 기준으로하여 경로를 작성한다.
    // --> 자바 프로젝트에서 상대 경로 : 현재 프로젝트를 기준으로하여 경로를 작성한다.

    try{
        // '/', '\\' 둘 다 하위 폴더를 의미한다.
        // '..'은 상위 폴더를 의미한다.

        //File f2 = new File("C:\\workspace\\javafile\\13_IO\\src\\text.txt");
        //File f2 = new File("src/test2.txt);
        File f2 = new File("../test.txt"); // 상위 폴더에 test.txt 파일 생성

        if(f2.createNewFile()) { // 예외처리 필수
        //createNewFile() 메소드 반환 값이 true, false 중 하나이기 때문에 if 조건문 안에서 사용 가능
            System.out.println("파일 생성 성공");
        }else {
            System.out.println("파일 생성 실패");
        }
    }catch(IOException e){
          e.printStackTrace();
    }
}

public void example4() {
    // 존재하지 않는 폴더에 파일 생성하기

    // 현재 프로젝트 제일 상단에 temp 폴더 생성 후 그 안에 test.txt 파일 만들기
    try {
        // 1. temp 폴더가 있는지 확인
        File folder = new File("temp");
        //exists() : 해당 경로에 폴더나 파일이 존재하면 true
        if(!folder.exists()) { //temp 폴더가 존재하지 않으면
            //temp 폴더 생성
            if(folder.mkdir()) { //폴더 생성
                System.out.println(folder.getName() + "폴더가 생성되었습니다.");
            }
        }
        File f = new File("temp/test.txt");

        if(f.createNewFile()) {
            System.out.println(f.getName() + "파일이 생성되었습니다.");
        }

        System.out.println("파일명 : " + f.getName());
        System.out.println("저장경로 : " + f.getAbsolutePath());
        System.out.println("저장경로 : " + f.getPath());
        System.out.println("상위폴더 : " + f.getparent());
        System.out.println("파일용량 : " + f.length());
    }catch(IOException e) {
        e.printStackTrace();
    }
}

태그:

카테고리:

업데이트:

댓글남기기