JAVA 기초

11일차 : 예외처리, IO(InputStream,OutputStream), 패키지 만들기

tɑ:lərəns 2012. 8. 12. 00:58

예외처리Exception01

import java.util.Scanner; import java.util.InputMismatchException; class Exception01 { public static void main(String[] args) { Scanner scan=new Scanner(System.in); try{//예외가 발생될 수 있는 문장을 try블록으로 묶기. 꼭 에러발생하는 윗부분부터 묶지 않고, 맨 위에 블록으로 묶어줘도된다. System.out.println("첫 번째 수 입력"); int n1=scan.nextInt(); System.out.println("두 번째 수 입력"); int n2=scan.nextInt(); int n3=n1/n2;//n2에 0이 들어가면(0을 입력하면) 에러가 나서 닫힌다(예외 발생) System.out.println(n1 + "/" + n2+ "=" + n3); }catch(InputMismatchException ie){//import 해줘야 사용 가능 System.out.println("입력데이터는 숫자로 입력해야 합니다."); System.out.println(ie.getMessage()); }catch(ArithmeticException ae){//ae에는 오류에 대한 정보가 담긴다.(오류메시지등,..) System.out.println("어떠한 수를 0으로 나눌수는 없습니다."); System.out.println(ae.getMessage());//오류메시지 출력하기(/ by zero: 오류메시지?) } System.out.println("프로그램이 종료됩니다."); } }

 

 

 

 

 

예외처리Exception02

import java.util.Scanner; import java.util.InputMismatchException; class Exception02 { public static void main(String[] args) { Scanner scan=new Scanner(System.in); while(true){ try{ //예외가 발생될 수 있는 문장을 try블록으로 묶기. 꼭 에러발생하는 윗부분부터 묶지 않고, 맨 위에 블록으로 묶어줘도된다. System.out.println("첫 번째 수 입력"); int n1=scan.nextInt(); //문자를 잘못입력하면 14행으로가서 적절한 처리 후 다시 돌아와 입력받음 System.out.println("두 번째 수 입력"); int n2=scan.nextInt(); int n3=n1/n2;//n2에 0이 들어가면(0을 입력하면) 에러가 나서 닫힌다(예외 발생) System.out.println(n1 + "/" + n2+ "=" + n3); }catch(InputMismatchException ie){ //import 해줘야 사용 가능 System.out.println("입력데이터는 숫자로 입력해야 합니다."); scan.next(); //잘못입력한 문자열 읽어와 버리기 continue; }catch(ArithmeticException ae){//ae에는 오류에 대한 정보가 담긴다.(오류메시지등,..) System.out.println("어떠한 수를 0으로 나눌수는 없습니다."); continue; } break; } System.out.println("프로그램이 종료됩니다."); } } //8~13행에 오류가 나면 try로 묶어서 예외 처리를 해준다.

 

 

 

 

 

예외처리Exception03

/* - 자바의 모든 예외는 Exception의 자식 클래스이므로 Exception은 모든 예외를 처리 할 수 있다. - catch절에서 Exception은 모든 예외를 처리 할 수는 있으나 자식예외보다 먼저 올 수 없다. */ import java.util.Scanner; import java.util.InputMismatchException; class Exception03 { public static void main(String[] args) { Scanner scan=new Scanner(System.in); try{//예외가 발생될 수 있는 문장을 try블록으로 묶기. 꼭 에러발생하는 윗부분부터 묶지 않고, 맨 위에 블록으로 묶어줘도된다. System.out.println("첫 번째 수 입력"); int n1=scan.nextInt(); //문자를 잘못입력하면 14행으로가서 적절한 처리 후 다시 돌아와 입력받음 System.out.println("두 번째 수 입력"); int n2=scan.nextInt(); int n3=n1/n2;//n2에 0이 들어가면(0을 입력하면) 에러가 나서 닫힌다(예외 발생) System.out.println(n1 + "/" + n2+ "=" + n3); }catch(ArithmeticException ae) { //Exception(부모예외)보다 반드시 위에 있어야 한다. System.out.println("0으로 나눌 수 없어요"); }catch(Exception e){ //Exception은 모든 예외를 다 처리할 수 있다. (모든 예외의 부모이므로) System.out.println("연산 도중 오류발생!"); //}catch(ArithmeticException ae){ //==> 부모타입이 이미 처리를 하고 난 뒤이기 때문에 여기까지 넘어오지 않아 에러 발생 //System.out.println("0으로 나눌 수 없어요"); 단, 이 문장이 상단에 올라가 있으면 에러나지않는다.

} } }

 

 

 

 

 

예외처리Exception04

import java.io.*; /* << 익셉션의 종류 >> - 자바에는 두 가지 종류의 익셉션이 있다. 1) Checked Exception - RunTimeException을 상속받지 않은 예외 클래스 - 반드시 try~catch절로 예외처리를 해야 하며 예외처리를 하지 않으면 컴파일시에 오류를 발생시킨다. 예) FileNotFoundException, IOException,... 2) Unchecked Exception - RuntimeException을 상속받은 예외클래스 - try~catch절로 예외 처리를 하지 않아도 컴파일시에 오류가 발생되지 않는다. 예) NumberFormatException, ArithmeticException,... */ class Exception04 { public static void main(String[] args) { try{ FileReader fr=new FileReader("test.txt"); //파일에서부터 데이터를 가져와 출력해주는 것 char[] ch=new char[255]; int n=0; while((n=fr.read(ch))!=-1){ //읽어오는 과정 String line=new String(ch, 0, n); System.out.println(line); } }catch(FileNotFoundException fe){ System.out.println("파일이 존재하지 않아요."); System.out.println(fe.getMessage()); }catch(IOException ie){ System.out.println("파일을 읽어는 과정에서 오류발생"); } } }

 

예외처리Exception05

/* 예외 처리 방법 - 자바에서는 예외처리 방법이 두 가지가 있다. 예외가 발생될 수 있는 문장을 try~catch로 직접 처리 하거나, 자신이 직접 처리하지 않고 throws로 떠넘기는 방법이 있다. throws로 떠넘길 때는 이를 호출하는 곳에서 try~catch로 처리해야 한다. */ import java.util.Scanner; class Exception05{ public static void main(String[] args) { Scanner scan=new Scanner(System.in); System.out.println("첫 번째 수"); int a=scan.nextInt(); System.out.println("두 번째 수"); int b=scan.nextInt(); int c=div(a, b); //div라는 메소드로 a,b를 넘기면 14행으로 System.out.println("첫 번째 수를 두 번째 수로 나눈 값: "+c); } //방법1 : 예외처리를 try~catch로 자신이 직접 처리 public static int div(int a, int b){ int r=0; try{ r=a/b; return r; }catch(ArithmeticException e){ System.out.println("정수를 0으로 나눌 수 없어요."); return 0; } } }

 

 

 

 

예외처리Exception06

import java.util.Scanner; class Exception06 { public static void main(String[] args) { Scanner scan=new Scanner (System.in); System.out.println("첫 번째 수"); int a=scan.nextInt(); System.out.println("두 번째 수"); int b=scan.nextInt(); try{ //메소드를 호출하는 곳에서 try~catch로 처리한다. int c=div(a,b); //호출하는 부분 System.out.println("첫 번째 수를 두 번째 수로 나눈 값 : "+c); }catch(ArithmeticException ae){ System.out.println("연산 오류!"); } } //예외가 발생 되었을 때 직접 처리 하지 않고 throws로 떠넘기기 public static int div(int a, int b) throws ArithmeticException{ //파라미터 값 다음에 throws로 예외처리 int c=a/b; return c; } } // 호출한 곳에서 적절하게 처리하기 위해 throws로 떠넘기는 것

 

 

 

 

 

예외처리Exception07

/* << 강제로 예외 발생시키기 >> 형식 throw 예외객체; 문법적 오류는 없지만(컴파일 가능) 실행 시 문제가 되는 경우 강제로 예외 발생 */ class Exception07 { public static void main(String[] args) { int a=10, b=20; try{ int area=boxarea(a,b); System.out.println("사각형 넓이: "+area); }catch(Exception e){ System.out.println(e.getMessage()); } } public static int boxarea(int a, int b) throws Exception{ if(a<=0 || b<=0){ // 강제로 예외 발생 시키기 throw new Exception("가로 세로 길이는 0이하일 수 없습니다."); } return a*b; } }

파일 읽어오고 읽어온 문자 화면에 출력하기

import java.io.*; class FileReader01 { public static void main(String[] args) { FileReader rd=null; try{ //같은 경로에 있는 me.txt파일을 읽어오기 위한 2바이트 처리 스트림 객체 생성 rd=new FileReader("me.txt"); //기존에 파일이 있을 경우에만 처리 가능 //public int read() throws IOException int n=0; while(true){ n=rd.read();//파일에서 2바이트 읽어오기 if(n==-1) break;//파일 끝이면 while문 빠져나가기 System.out.print((char)n);//읽어온 문자 화면에 출력하기 } }catch(FileNotFoundException fe){ System.out.println(fe.getMessage()); }catch(IOException ie){ System.out.println(ie.getMessage()); }finally{ try{ if(rd!=null) rd.close(); }catch(IOException ie){ System.out.println(ie.getMessage()); } } } }

 

 

 

 

 

작성한 문구를 파일로 저장


import java.io.*;
class FileWriter01 {
	public static void main(String[] args) {
		//public FileWriter(String fileName) throws IOException
		FileWriter writer=null;
		try{
			//me.txt파일에 출력하기 위한 2바이트 처리 스트림 객체 생성
			//파일을 저장할 수 있는 객체를 만듦. 경로를 지정하지 않으면 같은 작업폴더에 저장됨. 경로지정 역슬래쉬 2번
			writer=new FileWriter("c:\\JAVA\\me.txt");
			//파일에 문자열 출력하기
			writer.write("안녕하세요!\r\n");	//파일과 연결되어 저장된 문구
			writer.write("제 이름은 홍길동 입니다.\r\n");
			System.out.println("파일로 저장 성공!");
		}catch(IOException ie){
			System.out.println(ie.getMessage());
		}finally{
			try{
			if(writer!=null) writer.close();
		}catch(IOException e){
			System.out.println(e.getMessage());
			}
		}
	}
}

 

인풋스트림

import java.io.*; class InputStream01{ public static void main(String[] args) { //public static final InputStream in =>멤버변수 //키보드와 연결된 1바이트 스트림객체 InputStream in=System.in; //public abstract int read() throws IOException System.out.println("글자 한 개만 입력"); try{ int n=in.read(); //키보드로부터 1바이트 읽어오기 System.out.println("입력된 문자: "+(char)n); }catch(IOException ie){ System.out.println("입력과정에서 오류 발생"); } } }

 

 

 

 

 

아웃풋스트림


import java.io.*;
class  OutputStream01{
	public static void main(String[] args) {
		//public static final PrintStream out
		OutputStream out=System.out;	//모니터와 연결된 1바이트 처리 출력 스트림
		//public abstract void write(int b) throws IOException
		//public void write(byte[] b)  throws IOException
		byte b=65;
		byte[] a={65, 66, 67, 68,69};
		try{
			out.write(b);	//화면으로 b출력하기
			out.write(a, 1, 3);	//a배열의 1번 째에서 3바이트 출력(66,67,68 출력)
			//out.flush();	//버퍼가 다 차지 않아도 데이터 내보내기. close메소드를 쓰면 flush를 쓰지 않아도 된다
			out.close();	//스트림 닫기(내부적으로 flush메소드 호출됨). 이걸 안해주면 눈으로는 보이지 않지만 데이터를 계속 흘려보내는 작업을 한다.
			}catch(IOException ie){
				System.out.println(ie.getMessage());
		}
	}
}

 

패키지 만들기

package aa; // 패키지 만들기 // cmd>javac -d 경로 클래스명.java (-d : 패키지를 만들겠다는 의미) public class MyPerson{ private String name; private int age; public MyPerson(String name, int age){ this.name=name; this.age=age; } public String getName(){return name;} public int getAge(){return age;} }

 

 

 

 

글자 하나만 입력


import java.io.*;
class Reader01 {
	public static void main(String[] args) {
		//public InputStreamReader (InputStream in)
		InputStream in=System.in;	//키보드와 연결된 1바이트 스트림
		Reader rd=new InputStreamReader(in);	//1바이트처리 스트림을 2바이트처리 스트림으로 변환(2byte단위로 묶음 처리하겠다)
		//public int read() throws IOException
		System.out.println("글자하나만 입력");
		try{
			int n=rd.read();
			System.out.println("입려된 글자: "+(char)n);	//형변환 해줘야 글자 그대로 출력
			rd.close();	//스트림은 사용하고 나면 반드시 close()로 닫아줘야 함
		}catch(IOException ie){
			System.out.println(ie.getMessage());
		}
	}
}
// read() : 첫글자(한글자)의 아스키코드 값을 읽는다

 

 

화면으로 데이터를 2바이트 단위(문자)로 출력하기

import java.io.*; class Writer01 { public static void main(String[] args) { //OutputStreamWriter(OutputStream out) //OutputStream out=System.out; 이렇게 넣거나 6행처럼 ()안에 넣어줘도 된다. //화면으로 데이터를 2바이트 단위(문자)로 출력하기 위한 객체 생성 Writer wr=new OutputStreamWriter(System.out); char ch[]={'a', 'b', 'c', 'd'}; try{ wr.write(ch); String str="안녕하세요!"; wr.write(str); wr.close(); //스트림 닫기 }catch(IOException ie){ System.out.println(ie.getMessage()); } } }

 

 

 

 

Quiz01

import java.util.Scanner; import java.util.InputMismatchException; //아래의 프로그램에서 숫자를 입력하지 않으면 예외가 발생된다. //여기에 적절한 대한 예외처리를 해 보세요. class Quiz01 { public static void main(String[] args) { Scanner scan=new Scanner(System.in); try{ System.out.println("두 정수를 입력하세요! (예: 10, 20)"); String str=scan.next();//키보드로 문자열 입력받기 String[] nums=str.split(",");//,를 기준으로 문자열 쪼개서 배열에 저장하기 int a=0, b=0; a=Integer.parseInt(nums[0]); //문자를 숫자로 변환하기 b=Integer.parseInt(nums[1]); System.out.println("두 수합: "+ (a+b)); } catch(NumberFormatException ne){ System.out.println("입력한 형식이 잘못되었습니다. (숫자와 ','로 입력해주세요.)"); System.out.println(ne.getMessage()); }finally{ //메소드에 리턴문이 있어도 실행됨 System.out.println("오류가 나도 무조건 수행됩니다."); } } }

 

 

 

 

[ 과 제 ]