0330 수업-예외 처리,Thread, 파일 생성

손지민·2023년 8월 23일

Java 기초

목록 보기
3/13
post-thumbnail

복습 - map, string 이용 영어 문장 입력 받아 중복 단어 수 세는 프로그램

-iterator

-HashMap

-nextLine()

-split()

-get()

-put( , )

-next()

-hasNext()

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

예외 처리

프로그램 실행 중에 사용자의 부주의 등으로 발생하는 예기치 않은 상황을 예외라고 하며 이것을 처리하는 것을 예외 처리라고 합니다.

자바는 대부분의 일반적인 예기치 않은 상황에 대해서 이미 클래스 만들어져 있고

그 상황이 되면 자동으로 예외 객체가 생성됩니다.

우리는 그 예외 객체를 잡아서 처리 해주면 됩니다.

방법 2가지

  1. 그 메소드 안에서 직접 try{}catch(){}하여 처리하는 방법
  2. 메소드 호출 쪽으로 예외를 접하는 방법 throws

1.try{}catch(){} 직접 처리방법

public void 메소드명(){

try{

예외 발생가능 문장

}catch(예외자료형 변수명){

예외 발생하였을 때 처리할 문장

}

}

2.throws 키워드로 예외 전파하는 방법

public void 메소드명()throws 예외자료형1,예외자료형2,-,-,{

예외 발생 가능 문장

}

  • 하나의 try 안에 여러개의 catch 절이 올 수도 있어요.

이 때에 범위가 작은 예외 종류가 먼저 와야됩니다.

  • finally

예외가 발생되면 문제가 발생한 것이기 때문에

해당catch절을 수행하고 프로그램이 종료됩니다.

만약 예외가 발생하거나 발생하지 않거나

반드시 동작시켜야 할 명령이 있다면

finally에 써줍니다.

public void 메소드명(){

try{

예외 발생가능 문장

}catch(예외자료형 변수명1){

예외 발생하였을 때 처리할 문장

}catch(예외자료형 변수명2){

예외 발생하였을 때 처리할 문장

}finally{

}

}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

RuntimeException

-RuntimeException 의 후손들은 사용자가 따로 예외처리하지않아도 컴파일이 됩니다.

자바가 예외 처리를 해줍니다.

-반대로, RuntimeException의 후손이 아닌 예외들은 반드시 사용자가 예외 처리 해줘야 컴파일이 됩니다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

java.io -파일 입출력

java.net -네트워크 통신

java.sql -데이터베이스 연결

이러한 패키지들의 대부분은 예외를 포함하고 있습니다.

그것은 RuntimeException 의 후손이 아니기 때문에 꼭 예외 처리 해줘야 됨.

  • java.io.FileWriter

-FileWriter(String fileName)

public FileWriter(String fileName)
           throwsIOException //IOException 은 조상에 RuntimeException 없어서 예외처리 해줘야돼.

파일 생성

package exam02;

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterTest {
	public static void main(String[] args) {
		try {
			FileWriter fw = new FileWriter("c:/temp/hello.txt"); //파일 만들어준거. 이거 실행하려면 temp 라는 폴더가 있어야돼. 없으면 예외발생.
			fw.write("hello java 파일 출력");
			fw.close();  //파일 닫아주기
			System.out.println("파일 생성 되었습니다.");
		}catch(IOException e) {
			System.out.println("예외발생 : "+e.getMessage());
		}
	}
}

close();

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

*<throws>는 메소드명 뒤에 써주며 예외 처리를 메소드 호출 쪽으로 전파하는 의미

강제로 예외 발생

throw new 예외 클래스명()

package exam02;

import java.io.IOException;

public class ThrowTest {
	public static void main(String[] args) throws IOException {
		String title = "자바 프로그래밍";
		int year = 2023;
		System.out.println(year);
		throw new IOException();
	}
}

사용자 정의 예외

-자바는 몰라서 강제로 예외 발생시켜야 돼.

-자바는 대부분의 예외에 대하여 이미 클래스 만들어져 있습니다.

그러나 만약, 지금 하고있는 프로그램에서 특별한 상황을 예외로 만들고자 한다면

“사용자 정의 예외”를 만들 수 있습니다.

ex)조화 평균 분모 계산해서 0 되는거 예외 처리 그 때 throw 사용

조화 평균의 공식

2ab/(a+b)

만약 a,b의 절대값이 같고 부호가 다르다면

두 수의 조화 평균은 존재할 수 없다. 그 상황을 자바는 모름.

이 프로그램에서는 그 상황을 “예외”로 만든다.

사용자 정의 예외 클래스를 만들고

그 상황이 되었을 때 강제로 예외 객체를 생성할 수 있습니다.

문제 상황을 정의하는 데에 의미가 있음.

<방법>- 사용자 정의 예외 클래스 만들기

class 예외 클래스이름 extends Exception{
	public 예외클래스이름(String 메세지){
		super(메세지);
	}
}
//문제상황을 정의하는데에 의미가 있음.
	try{
		if(예외의 상황인가){
			throw new 예외 클래스명(메세지);
		}
	}catch(예외클래스명 변수명){
	
	}

//runtimeexception 아니라 예외 처리 해줘야 돼.

***다시보기

package exam02;

import java.util.Scanner;

//"조화평균이 있을 수 없습니다."라는 의미의사용자 정의 예외 클래스 만들기
class NotFoundHarmonicMeanException extends Exception{
	public NotFoundHarmonicMeanException(String msg) {
		super(msg);
	}
}

public class HarmonicMeanTest {
	public static void main(String[] args) {
		Scanner sc= new  Scanner(System.in);
		int a,b;
		try {
			System.out.println("첫 번째 수를 입력하세요.");
			a=sc.nextInt();
			System.out.println("두 번째 수를 입력하세요.");
			b=sc.nextInt();
			if(a==-b) {
				throw new NotFoundHarmonicMeanException("두 수의 조화평균은 없습니다.");
			}
			int mean = 2*a*b/(a+b);
			System.out.println("두 수의 조화평균 : "+mean);
		}catch(Exception e) {
			System.out.println("예외발생 : "+e.getMessage());
		}
		
	}
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

멀티 Thread 프로그래밍 (2가지-클래스,인터페이스)

=⇒두개 이상의 객체가 어떠한 메소드를 수행함에 있어

가능하면 공평하게 실행되게끔 스케줄링 해주는 기술.

(메소드 호출하면 호출 순서대로 수행함. 중간에 에러나거나하면 다음꺼 안할 수도 있어서 씀)

종류

1.Thread 클래스

Thread 클래스를 상속받아 클래스를 만들고 run() 메소드를 오버라이딩 하여

그 안에 공평하게 실행시키고자 하는 명령들을 써줍니다.

그리고 쓰레드를 가동 시키기 위하여 start() 메소드를 호출합니다.

2.Runnable 인터페이스

Runnable 인터페이스를 구현한 클래스를 만들고 run()오버라이딩하여

공평하게 실행시키고자하는 명령들을 써줍니다

그러나, star() 는 인터페이스라서 추상메소드라서 구체화된 바디없어서 바로 호출할 수 없습니다.

따라서, Thread 로 포장해서 start() 호출해야됨.

ex) new Thread( 인터페이스를 구현한 객체kim ).start();

↓ 멀티쓰레드 프로그래밍 사용 이유 예시

//일반 메소드는 호출문에 의해서 순서대로 동작
//kim 이 끝나야 lee 를 실행함
//kim 돌다가 문제 발생하면 lee 한테 기회 안올수도
//따라서 멀티쓰레드 프로그래밍 사용

package exam05;

class Person{
	private String name;
	public Person(String name) {
		this.name=name;
	}
	public void sayHello() {
		for(int i=1;i<=10;i++) {
			System.out.println("안녕, "+name+"! "+i);
			try {
			Thread.sleep(100);
			}catch(Exception e){
				
			}
		}
	}
}

public class Test {
	public static void main(String[] args) {
		Person kim = new Person("김유신");
		Person lee = new Person("이순신");
		kim.sayHello();//메소드 호출하면 호출 순서대로 수행함. 중간에 에러나면 다음꺼 안할 수도.
		lee.sayHello();
	}
}

자바는 멀티Thread 프로그램이을 위하여 클래스, 인터페이스 제공

Thread 클래스

class PrimeThread extends Thread {
         long minPrime;
         PrimeThread(long minPrime) {
             this.minPrime = minPrime;
         }

         public void run() {
             // compute primes larger than minPrime
              . . .
         }
     }

`run()` run() 안에 공평하게 실행시키고자하는 내용을 작성

-run() 호출해도 오류 나지는 않음. 근데 공평하게 실행되지않고 일반 메소드처럼 동작함.

PrimeThread p = new PrimeThread(143);
     p.start();

`start()` : Thread 를 가동시키는 명령

  • 메소드 호출하면 호출 순서대로 수행함. 중간에 에러나면 다음꺼 안할 수도.

Thread클래스

package exam06;

class Person extends Thread{
	private String name;
	public Person(String name) {
		this.name=name;
	}
	@Override
	public void run() {
		for(int i=1;i<=10;i++) {
			System.out.println("안녕, "+name+"! "+i);
			
			try {
				Thread.sleep(100); //너무 빨리 돌아가서 돌아가는거 안보이니까 잠깐 재우는거
			} catch (Exception e) {
				
			}
		}
	}
	
}

public class ThreadTest01 {
	public static void main(String[] args) {
		Person kim = new Person("김유신");
		Person lee = new Person("이순신");
		kim.start();
		lee.start();
	}
}

쓰레드를 가동하려면 start // run 은 쓰레드 가동이 아님.

Q. sleep() 쓰는 이유

`sleep(long millis)`; //너무 빨리 돌아가서 돌아가는거 안보이니까 잠깐 재우는거

Runnable 인터페이스

-바로 start() 못하고 Thread 로 변환해서 실행가능

왜? 추상메소드라서 구체화된 바디 없어서 호출이 안됨.

profile
Developer

0개의 댓글