14. 예외와 입출력 처리
14-1. 예외의 기본
예외의 원리 이해하기
예외가 발생했다 = “예외가 던져졌다(throw)”
예외 처리하기
예외 처리 ( exception handling )
class Sample
{
public static void main(String[] args)
{
try{
//여기서부터 예외 발생 조사
}
catch(ArrayIndexOutOfBoundsException e){
// 예외 발생 시 이 코드 실행
}
// 다 끝난 뒤, 이 코드 실행
}
}
- 표현 : “catch 블록”에서 예외를 받는다(catch)
finally 블록 추가하기
try{
//..
}
catch{
//..
}
finally{
//마지막에 반드시 실행!
}
14-2. 예외와 클래스
예외?
= Throwable 클래스를 확장한 서브클래스의 객체
catch(ArrayIndexOutOfBoundsException e){
System.out.println("배열의 길이를 넘어섬");
System.out.println(e+"라는 예외가 발생");
}
예외의 종류를 파악하기
Throwable
- Error
- Exception
- IOException
- RuntimeException
- ArrayIndexOutOfBounds Exception
- …
- 그 밖의 다양한 예외에 대응하기 위한 클래스들
14-3. 예외 던지기
예외 클래스 선언하기
예외를 “발생”시키는 코드
자신만의 예외클래스를 만들자!
-
Throwable 클래스의 서브 클래스를 확장한 예외 클래스를 선언하자!
( Exception 클래스를 상속받아, CarException 클래스를 만들어보자 )
class CarException extends Exception
예외 던지기
- 예외를 던질 땐 throw라는 문장 사용
public void setCar(int n, double g) throws CarException
{
if(g<0){
CarException e = new CarException();
throw e;
}
}
예외를 받아내지 않으면?
class Sample
{
public static void main(String[] args)
throws CarException
{
Car car1 = new Car();
// 여기서 예외 발생 발생
car1.setCar(1234,-10.0);
car1.show();
}
}
- 프로그램 실행 도중에 종료되어버림
예외가 발생할 가능성이 있는 경우, 아래의 2가지 중 하나를 선택!
1) try~catch로 예외 처리 2) method 이름 뒤에 throws를 붙여서, 그 메소드의 호출 메소드에서 예외 처리를 위임
14-4. 입출력의 기본
스트림의 원리 이해하기
스트림
- 다양한 장비에 대한 입출력을 일관된 방법으로 처리하기 위해!
- 추상적인 메커니즘
화면과 키보드로 입력 & 출력
import java.io.*;
class Sample
{
public static void main(String[] args)
{
System.out.println("문자열을 입력하시요");
try{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
System.out.println(str+"이 입력되었습니다");
}
catch(IOException e){
System.out.println("입출력 에러 발생");
}
}
}
과정 요약
1) System.in(표준 입력)을 받아, InputStreamReader 클래스 객체 생성 2) 위에서 BufferedREader 클래스의 객체 생성 3) 위에서 readLine() 메소드를 사용해 데이터 한줄을 읽어들임
InputStreamReader 클래스
- 문자 스트림
- 문자나 문자열을 읽고 쓰기 위해 사용되는 스트림
BufferedREader 클래스
- 버퍼를 경유해 읽어들이기 위한 문자 스트림
- 읽기/쓰기의 효율이 좋아짐
- “버퍼”라 불리는 장소를 경유하여 읽고쓰기함
파일에 출력하기
Writer 클래스의 서브 클래스
- FileWriter : 파일에 기록하기 위한 문자 스트림
- BufferedWriter : 버퍼를 경유하여 기록하기 위한 문자 스트림
- PrintWriter : 한 줄 씩 기록하기 위한 문자 스트림
import java.io.*
class Sample
{
public static void main(String[] args)
{
try{
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("test1.txt")));
pw.println("Hello");
pw.println("Bye");
System.out.println("파일 기록 완료");
pw.close();
}
catch(IOException e){
System.out.println("입출력 에러 발생");
}
}
}
순서
- 파일 이름 지정 & FileWriter 클래스의 객체 생성
- 위의 객체를 받아, BufferedReader 클래스의 객체 생성
- 위의 객체를 받아, PrintWriter 클래스의 객체 생성
- 위의 객체의 println() 메소드를 사용하여, 데이터를 1줄씩 기록
- 마지막에 close() 메소드로 파일 닫기
파일로 입력하기
위에서 작성한 파일에서, “데이터를 읽어들이는” 코드
FileReader
: 파일 읽어오기 위한 문자 스트림BufferedReader
: 버퍼를 경유해 읽어들이기 위한 문자 스트림
import java.io.*;
class Sampe
{
public static void main(String[] args)
{
try{
BufferedReader br = new BufferedReader(new FileReader("test1.txt"));
String str1 = br.readLine();
String str2 = br.readLine();
System.out.println(str1+"입니다");
System.out.println(str2+"입니다");
br.close();
}
catch(IOException e){
System.out.println("입출력 에러 발생")
}
}
}
많은 양의 데이터를 입력하기
- 텍스트 편집기로 만든 파일에서 많은 양의 데이터를 가져올 수 있음
test2.txt
라는 파일이 있다 가정해보자
(생략)
명령 줄 인수를 사용하기
프로그램 실행 시, 사용자가 읽고 쓰는 파일 이름을 자유로이 지정할 수 있다!
with “명령 줄 인수”
- 사용자로부터 입력 값을 받아 처리
main()
메소드의 인수로 정의
public static void main(String[] args)
- 순서 : args[0], args[1], … ,
Sample test.txt Hello Goodbye
- args[0] = test.txt
- args[1] = Hello
- args[2] = Goodbye