ArithmeticException 산술예외, 연산예외

//산수, 계산예외예제
public class ArithmeticExceptionTest {

	public static void main(String[] args) {
		// 정수/정수에서 0으로 나눌 때 발생 (/, %)
		int num1 = 1, num2 = 0;
		System.out.println(num1 / num2);
	}
}
//예외 클래스 Exception 살펴보는 예제
		try {
			throw new Exception("예외");
		}
		//예외가 발생하면 Exception 클래스를 이용하여 객체 e를 선언하고 
		//발생한 예외객체를 e에 저장
		catch(Exception e) {	//Exception e는 선언된 여기서만 사용가능 catch 닫기 괄호까지
			//getMessage() : 생성자에서 넣어준 문자열을 가져옴
			System.out.println(e.getMessage());
			
			//printStackTrace() : 예외가 발생한 위치를 출력해주는 메소드 => 출력하면 빨갛게 나오는데 에러가 아님
			e.printStackTrace();
		}
		System.out.println("종료");
		
	}

}

ObjectEquals 예제

public class ObjectEqualsTest {

	public static void main(String[] args) {
		String str1 = new String("abcd");
		String str2 = str1;
		System.out.println("두 문자열 주소 비교: " + (str1 == str2));
		
		System.out.println("str2 = new String(\\"abcd\\")");
		str2 = new String("abcd");
		System.out.println("두 문자열 주소 비교: " + (str1 == str2));
		System.out.println("두 문자열 비교: " + str1.equals(str2));	//객체.equals() 로 호출가능 how come?상속받았기때문
	
		Num n1 = new Num();	//기본생성자를 이용해서 만들더라도 
		Num n2 = new Num();	//new를 통해 만들어진 **객체들은 모두 주소가 다 다르다**. => n1, n2는 주소가 다름을 알 수 있음
		System.out.println("n1과 n2 주소 비교: " + (n1 == n2));
		
		System.out.println("n1과 n2가 같다: " + n1.equals(n2));
		n2.setNum(10);
		System.out.println("n1과 n2가 같다: " + n1.equals(n2));
		
		
		n1.equals(n2);
		n1.equals("abc");
		**//매개변수의 다형성 => 여러클래스의 객체들이 매개변수로 다 올 수 있음. 종류가 다른데도 올 수 있음**
	}

}

class Num{
	private int num;

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}
	/*	//주소를 비교하려는게 아니라, 실제 값을 비교하려는 것이기때문에 밑에 이렇게 equals를 이용해서 실제 값 비교
	@Override							//매개변수 클래스가 Object로 조상이 왔음
	public boolean equals(Object obj) {	//**매개변수로 Num클래스 뿐만아니라 다른 클래스의 객체도 올 수 있다**. 예) n1.equals(n2);/n1.equals("abc");
		if(obj == null) {
			return false;
		}
		//매개변수 obj를 Num클래스의 객체로 타입변환이 가능하지 않다면 false를 리턴: 다른 클래스의 객체와 비교할 필요가 없어서
		if(!(obj instanceof Num)) {	//instanceof => 타입변환가능여부를 나타내는 코드
			return false;
		}
		//매개변수의 num와 내 num가 같은지를 비교
		Num tmp = (Num)obj;
		if(num==tmp.num) {
			return true;
		}
		return false;
	}
	*/

	@Override
	public int hashCode() {
		final int prime = 31;	//2n제곱과 가장 가까운 소수 중 적당한 수 하나가 31
		int result = 1;
		result = prime * result + num;	
		return result;
	
	/*
	 *  public int hashCode() {
		return num/10;				//10개씩 그룹화시킨다 => 이런식으로 hashCode로 분류를 해줄 수도 있음. 
	}								//상황에따라 코드를 hashCode를 만들어줄 수 있음
	*/
	}

	@Override
	public boolean equals(Object obj) {
		//주소가 같으면 같은 값을 공유하기 때문에 무조건 true
		if (this == obj)	//매개변수obj주소랑 내this 주소가 같음	//obj=>매개변수,참조변수
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		[Num other = (Num) obj;](<https://improver.tistory.com/139>)
		if (num != other.num)			//일반변수비교
			return false;
		return true;
	}
}
//일반변수(위) 와 참조변수(아래)를 비교하기위한 예시 
class Test{
	Name name;

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Test other = (Test) obj;
		if (name == null) {				//참조변수 비교(좀더복잡)
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))	//값이 아니라 주소를 비교중. why? Name클래스의 equals를 안만들었기때문=> Name클래스도 만들어야 돼
			return false;
		return true;
	}
}

class Name{
	String name;
}

throws 예외 떠넘기기

public class ThrowsTest {

	public static void main(String[] args) {
		// **throws는 메소드를 하나 만들어야 돼. 메인에서 작업하는게 아니래**
		try {
		test();			**//메인에서 메소드 호출했으니까 try로 해결해**
		}catch(Exception e) {
			System.out.println(e.getMessage());
		}
	}
	public static void test() throws Exception{		//이 메소드를 호출한 메인에서 해결한다 	//throws Exception, , , , 예외명을 ,로 이어적기 가능
		throw new Exception("test 메소드에서 예외 발생");	//Throws Exception은 생략가능 .
	}            //에러발생=>Exception은 일반예외+실행예외라서 일반예외포함때문에=> 실행예외인 RuntimeException를 쓰면 에러발생 안함
}

object toString test

public class ObjectToStringTest {

	public static void main(String[] args) {
		Student s = new Student("홍길동",1,1,1);	//생성자안에 값넣어줘야 출력돼
		System.out.println(s);
		System.out.println(s.toString());  //위아래 같은거임. 자동toString이 들어간대
	}
}
class Student{
	private String name;
	private int grade;
	private int classNum;
	private int num;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getGrade() {
		return grade;
	}
	public void setGrade(int grade) {
		this.grade = grade;
	}
	public int getClassNum() {
		return classNum;
	}
	public void setClassNum(int classNum) {
		this.classNum = classNum;
	}
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public Student(String name, int grade, int classNum, int num) {
		super();
		this.name = name;
		this.grade = grade;
		this.classNum = classNum;
		this.num = num;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", grade=" + grade + ", classNum=" + classNum + ", num=" + num + "]";
	}
	
}	**//순서: get,set => using field생성자 => Tostring**

Throw test

public class ThrowTest {
//일부러 **개발자가 원하는 예외를 만들어**서 그 예외를 처리하려는 때에 사용하는게 throw 
	public static void main(String[] args) {
		int num = 1;

		try {
		if (num == 1) {
			RuntimeException e = new RuntimeException("예외");		//표현2: 두줄이 밑에 표현1이랑 같은 뜻
			throw e;
			**//throw new RuntimeException ("예외");	//표현1 //객체: new라는 연산자를 통해 만들어 낸 것**
			}
		}catch(RuntimeException e) {
			System.out.println("실행 예외가 발생");
		}catch(Exception e) {
			System.out.println("예외가 발생");
		}

		
		//RuntimeException예외는 실행예외이기 때문에 예외처리를 안해도 에러가 발생하지 않음
		throw new RuntimeException("예외");	
		
		throw new Exception("예외");	//=> 에러남
		//Exception은 실행예외가 아니기때문에 예외처리가 필수이다.
		//예외처리를 안한 Exception코드는 에러발생 => (*Exception은 실행예외랑 일반예외를 둘다 포함하고 있음)
	}	
}

산수코드 예외처리