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은 실행예외랑 일반예외를 둘다 포함하고 있음)
}
}
산수코드 예외처리