이안의 평일코딩

JAVA의 정석 27일차 - 예외회피 본문

Back-end/Java

JAVA의 정석 27일차 - 예외회피

이안92 2020. 7. 21. 11:03
반응형

2020.07.21(화)

 

1. 예외처리 복습

 1)종류

  (1) 예외 복구 (직접처리)

    예외발생(에러발생) ->실행 => try~catch

  (2) 예외 회피 (간접처리, 예외 떠넘기기)

    - 예측(어떤 에러가 발생할 가능성 있는지 예측)

    - 다른 개발자가 예외처리를 각자 할 수 있게 자바->API->사용자 => throws

  (3) 임의 발생

      직접 예외처리를 제작 -> 자바 예외처리 저장 => throw 프로그램 전환

      * 생성자 호출 class A {} => X 생성자 앞에 new A()

      * 예외처리 new MyException() => X 예외처리는 호출할 때 앞에 throw 붙혀야함

             throw 예외가 발생했다는 것을 알려줌 (throws 등록 : 이런 예외가 발생할 수 있다)

  (4) 사용자정의 

 

 2)예외처리 계층구조

  =Exception (가장 큼)

   - CheckException : 컴파일시에 예외처리

      IOException, SQLException, MalformedURLException, ClassNotFoundException, InterruptedException

   - UnCheckException : 인터프리터 실행시에 에러발생

      RuntimeException =>생략

 

 3)형식

  - try{ ~ }catch(예상되는 에러){ }

  - public void display() throws 예상 예외클래스 { }

 

2. 예외회피

     = 에러에 대한 예측이 가능하게 만든다

        대부분의 프로그램은 => 직접처리 (try~catch)

        => API(자바, 라이브러리)

     = 프로그래머가 예외처리를 각자 프로그램에 맞게 처리 유도

     = 형식)

         메소드() throws 예측한 예외 클래스 등록

         예) 순서없이 나열이 가능

              public void display() throws Exception, ArrayIndexOutOfBoundsException, NumberFormatException

              {

              }

           ==> 예외처리는 호출하는 메소드에서 처리

 

public class MainClass {
    public int div(int a,int b) throws Exception
    {
    	return a/b; // 0으로 나누면 에러가 발생할 수 있다
    }
	public static void main(String[] args)  {
        MainClass m=new MainClass();
        int res=0;
		try {
			res = m.div(10, 2);
		} catch (Exception e) {
			e.printStackTrace();
		}
        System.out.println(res);
	}
}
package com.sist.exception;
// 프로그래머 직접 제작하지 않지만 => 외부라이브러리 
public class MainClass1 {
    public void display() throws ArrayIndexOutOfBoundsException,
    ArithmeticException,NumberFormatException,Exception
    {
    	
    }
	
    public static void main(String[] args) throws ArrayIndexOutOfBoundsException,
    ArithmeticException,NumberFormatException,Exception{
        MainClass1 m=new MainClass1();
			m.display();
	}
}

 

예외 발생시키기

package com.sist.exception;

public class MainClass2 {
	public static void main(String[] args) {
	try {
		int a=10;
		if(a%2==0) { //짝수면
			ArithmeticException aa = new ArithmeticException("로그인창으로 이동");
			throw aa;
		}
		else {
			throw new Exception("회원가입창으로 이동"); // 위 두줄과 동일
		}
	}catch(ArithmeticException e) {
		System.out.println(e.getMessage()); //방향 전환
	}catch(NumberFormatException e) {
		System.out.println(e.getMessage());
	}catch(ArrayIndexOutOfBoundsException e) {
		System.out.println(e.getMessage());
	}catch(Exception e) {
		System.out.println(e.getMessage());
	}
 }
}

 

 

MainClass3

package com.sist.data;

import java.io.FileWriter;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

public class MainClass3 {
	public static FoodHouseVO[] categoryFoodData() {
		FoodHouseVO[] food = new FoodHouseVO[10];
		try {
			Document doc = Jsoup.connect("https://www.mangoplate.com/top_lists/1965_hotel_bingsu").get();
			Elements title = doc.select("span.title h3");
			Elements score = doc.select("strong.point span");
			Elements address = doc.select("p.etc");
			Elements poster = doc.select("img.center-croping");
			Elements review = doc.select("p.short_review");
			for(int i=0; i<10; i++) {
				food[i] = new FoodHouseVO();
				food[i].setTitle(title.get(i).text());
				food[i].setScore(Double.parseDouble(score.get(i).text()));
				//문자열 => 더블형 변환 Double.parseDouble()
				//문자열 => 정수형 변환 Integer.parseInt()
				//문자열 => 논리 Boolean.parseBoolean()
				//Wrapper Class
				food[i].setAddress(address.get(i).text());
				food[i].setPoster(poster.get(i).attr("data-original"));
				food[i].setReview(review.get(i).text());
			}
			
		}catch(Exception ex) {
			ex.printStackTrace(); //에러위치 확인
		}
		return food;
	}
	public static CategoryVO[] categoryListData() {
		CategoryVO[] cate = new CategoryVO[10];
		//URL => https://www.mangoplate.com/ ==> CheckException
		try {
			Document doc = Jsoup.connect("https://www.mangoplate.com/").get();
			//System.out.println(doc); => 소스읽기
			Elements title = doc.select("div.info_inner_wrap span.title");
			Elements subject = doc.select("div.info_inner_wrap p.desc");
			Elements poster = doc.select("ul.list-toplist-slider img.center-croping");
			//Elements link = doc.select("");
			/*
			 * <p>aaa</a> p.text()
			 * <p src=""> p.attr() 속성
			 * 
			 */
			for(int i=0; i<10; i++) {
				cate[i] = new CategoryVO();
				cate[i].setCno(i+1);
				cate[i].setTitle(title.get(i).text());
				cate[i].setSubject(subject.get(i).text());
				cate[i].setPoster(poster.get(i).attr("data-lazy"));
			}
			
		}catch(Exception ex) {
			ex.printStackTrace(); // 에러시에 어디서 오류 확인
		}
		return cate;
	}
	
	public static void main(String[] args) {
		categoryFoodData();
	}
}

 

FoodHouseVO (String review추가)

package com.sist.data;

// 맛집 1개에 대한 정보

public class FoodHouseVO {
	private int no;
	private int cno;
	private String poster; // split
	private String review;
	private String title;
	private double score;
	private String address;
	private String tel;
	private String type;
	private String price;
	private String parking;
	private String time;
	private int good;
	private int soso;
	private int bad;
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public int getCno() {
		return cno;
	}
	public void setCno(int cno) {
		this.cno = cno;
	}
	public String getPoster() {
		return poster;
	}
	public void setPoster(String poster) {
		this.poster = poster;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public double getScore() {
		return score;
	}
	public void setScore(double score) {
		this.score = score;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getTel() {
		return tel;
	}
	public void setTel(String tel) {
		this.tel = tel;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public String getPrice() {
		return price;
	}
	public void setPrice(String price) {
		this.price = price;
	}
	public String getParking() {
		return parking;
	}
	public void setParking(String parking) {
		this.parking = parking;
	}
	public String getTime() {
		return time;
	}
	public void setTime(String time) {
		this.time = time;
	}
	public int getGood() {
		return good;
	}
	public void setGood(int good) {
		this.good = good;
	}
	public int getSoso() {
		return soso;
	}
	public void setSoso(int soso) {
		this.soso = soso;
	}
	public int getBad() {
		return bad;
	}
	public void setBad(int bad) {
		this.bad = bad;
	}
	public void setReview(String review) {
		this.review=review;
		
	}
	public String getReview() {
		return review;
	}
	
	
}

 

FoodListCard

package com.sist.client;
import java.awt.*;
import javax.swing.*;

import com.sist.data.FoodHouseVO;
import java.net.*;

public class FoodListCard extends JPanel{
	JLabel posterLa = new JLabel();
	JLabel la1,la2,la3;
	JTextPane ta; //JTextArea는 한줄에 글 출력, JTextPane은 밑줄로 내려가게됨
	// 매개변수 ==> 3개 이상이면 => 배열,클래스
	public FoodListCard(FoodHouseVO vo) {
		
		//posterLa.setOpaque(true);
		//posterLa.setBackground(Color.black);
		
		try {
			URL url = new URL(vo.getPoster());
			Image img=ClientMainFrame.getImage(new ImageIcon(url), 200, 200);
			posterLa.setIcon(new ImageIcon(img));
		}catch(Exception ex) {}
		
		la1=new JLabel(vo.getTitle());
		la2=new JLabel(String.valueOf(vo.getScore()));
		la2.setForeground(Color.orange);
		la3=new JLabel(vo.getAddress());
		ta=new JTextPane();
		ta.setText(vo.getReview());
		
		setLayout(null);
		posterLa.setBounds(10, 15, 200, 200);
		la1.setBounds(215, 15, 350, 30);
		la2.setBounds(570, 15, 60, 30);
		la3.setBounds(215, 50, 415, 30);
		ta.setBounds(215, 85, 415, 130);
		
		add(posterLa);
		add(la1);add(la2);
		add(la3);add(ta);
	}
	
}

 

CardPrint

package com.sist.client;
import java.util.*;
import java.awt.*;
import javax.swing.*;
import com.sist.data.*;
public class CardPrint extends JFrame{
	public CardPrint() {
		FoodHouseVO[] food = MainClass3.categoryFoodData();
		JPanel p = new JPanel();
		p.setLayout(new GridLayout(5,2));
		add("Center",p);
		
		for(FoodHouseVO vo:food) {
			FoodListCard fc = new FoodListCard(vo);
			p.add(fc);
		}
		setSize(1300, 1000);
		setVisible(true);
	}
	public static void main(String[] args) {
		new CardPrint();
	}
}

 

ClinetMainFrame

package com.sist.client;
// 윈도우 => JFrame
// 윈도우와 관련된 클래스를 읽어온다

import javax.swing.*;
import java.awt.*; //Color, Layout
import java.awt.event.*; //interface
import java.net.URL;

public class ClientMainFrame extends JFrame implements ActionListener{
	JLabel title = new JLabel("레시피 & 맛집 추천사이트", JLabel.CENTER);
	MenuForm mf = new MenuForm();
	ChatForm cf = new ChatForm();
	ControllPanel cp = new ControllPanel();
	
	
	// 윈도우 크기 결정 => 생성자에서 사용
	public ClientMainFrame() {
		/*
		 * 클래스에서 생성자 사용 => 선언이 아니라 => 구현할 때
		 * 예)
		 *    데이터베이스 : 오라클연결
		 *    네트워크 : 셋팅 => IP, PORT => 핸드폰 (개통)
		 *    웹 : 쿠키에서 값읽기 => 자동로그인
		 */
		title.setFont(new Font("굴림체", Font.BOLD, 55));
		//title.setOpaque(true); // 불투명
		//title.setBackground(Color.magenta);
		setLayout(null); // JFrame (BorderLayout) 사용자 정의로 배치 => null
		title.setBounds(10, 15, 1570, 100);
		// 추가 => add()
		add(title);
		// 메뉴 배치
		mf.setBounds(10, 120, 100, 400);
		add(mf);
		// 채팅폼
		cf.setBounds(115, 760, 1465, 200);
		add(cf);
		// 출력화면
		cp.setBounds(115, 120, 1465, 635);
		add(cp);
		
		setSize(1600, 1000);
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE); // X버튼 클릭시 종료
		
		mf.b1.addActionListener(this);
		mf.b2.addActionListener(this);
	}
    
	public static void main(String[] args) throws Exception{
		// 생성자 위에
		UIManager.setLookAndFeel("com.jtattoo.plaf.mcwin.McWinLookAndFeel");
		// 생성자는 호출시에 반드시 => new 생성자();
		new ClientMainFrame();
	}
	
	public static Image getImage(ImageIcon ii, int w, int h) {
		Image dimg = ii.getImage().getScaledInstance(w, h,
				Image.SCALE_SMOOTH);
		return dimg;
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==mf.b1) {
			cp.card.show(cp, "DF"); //ControllPanel에 이름이 DF인 df =>detailform
		}
		else if(e.getSource()==mf.b2) {
			cp.card.show(cp, "LF"); //LF => listform
		}
		
	}
}
반응형
Comments