자바에는 모든 클래스의 수퍼 클래스인 "Object"라는 이름의 클래스가 존재하며, java.lang.Object 패키지에 정의되어 있다.
자바의 모든 클래스는 Object를 상속 받지만 별도의 명시는 필요없다.(java 컴파일러가 알아서함)
Object 클래스는 다음 method들을 정의하고 있다.
public static void main(String[] args) {
main1(args);
}
public static void main1(String[] args) {
Matrix m = new Matrix(10,10);
for (int i=0; i<999;i++)
m = new Matrix(10,10);
// gc(): jvm에 의해 객체가 소멸하기전에 먼저 소멸 시킬 수 있다.
System.gc();
System.out.println("nAlloc= "+m.get_nAlloc());
System.out.println("nFree= "+m.get_nFree());
}
public class Matrix {
//동적할당 된 객체의 개수
private static int nAlloc = 0;
// garbage collect 된 객체의 수
private static int nFree = 0;
protected void finalize() throws Throwable {
super.finalize();
nFree++; // count the number of freed objects
}
public int get_nAlloc() { return nAlloc; }
public int get_nFree() { return nFree; }
nAlloc =1000
nFree = 868
nAlloc =1000
nFree = 999
nAlloc =1000
nFree = 567
실행결과 그때ㄷ 그때 달라요~
자바는 코드 상에서 에러가 발생한 즉시 사용자에게 에러 발생 지점과 에러 원인 메세지를 출력하여 도와줄 수 있도록 Exception을 제공한다.
어느 한 method에서 에러가 발생하면 그 지점에서 적절한 exception 객체를 생성하여 throw한다.
return과 유사하게 caller(상위 메소드)로 exception을 전달하고 catch가 될때 까지 전달과 메쏘드 종료를 반복한다.
Throw된 exception 객체는 발생 지점 이후 처음 만나는 try-catch블록에서 처리됨
public static void main2(String[] args) { // why no "throws Exception"???
int[][] arrayBlk = {
{ 0, 1, 0 },
{ 1, 1, 1 },
{ 0, 0, 0 }
};
try {
Matrix currBlk = new Matrix(arrayBlk);
// Matrix tempBlk = new Matrix(5,5);
Matrix tempBlk = new Matrix(-1,-1); // falls into the second catch
tempBlk = tempBlk.add(currBlk); // falls into the first catch
} catch(MismatchedMatrixException e) {
e.printStackTrace();
System.out.println("at first catch: " + e.getMessage());
} catch(MatrixException e) {
e.printStackTrace();
System.out.println("at second catch: " + e.getMessage());
}
}
public Matrix add(Matrix obj) throws MatrixException {
if((dx != obj.dx) || (dy != obj.dy))
throw new MismatchedMatrixException("matrix sizes mismatch");
Matrix temp = new Matrix(dy, dx);
for(int y = 0; y < obj.dy; y++)
for(int x = 0; x < obj.dx; x++)
temp.array[y][x] = array[y][x] + obj.array[y][x];
return temp;
}
private void alloc(int cy, int cx) throws MatrixException {
if((cy < 0) || (cx < 0))
throw new MatrixException("wrong matrix size");
dy = cy;
dx = cx;
array = new int[dy][dx];
nAlloc++; // count the number of allocated objects
}
//alloc에서 오류가 발생할 때
lab2.MatrixException: wrong matrix size
at lab2.Matrix.alloc(Matrix.java:20)
at lab2.Matrix.<init>(Matrix.java:28)
at lab2.Main_2.main2(Main_2.java:26)
at lab2.Main_2.main(Main_2.java:5)
at second catch: wrong matrix size
//add에서 오류가 발생
lab2.MismatchedMatrixException: matrix sizes mismatch
at lab2.Matrix.add(Matrix.java:70)
at lab2.Main_2.main2(Main_2.java:27)
at lab2.Main_2.main(Main_2.java:5)
at first catch: matrix sizes mismatch
Exception 클래스는 Throwable을 상속 받는다. Throwable은 클래스이므로 당연히 Object를 상속 받는다. Error 클래스는 DVM(Dalvik Virtual Machine)이 전용으로 사용함
DVM(Dalvik Virtual Machine):DVM은 안드로이드 애플리케이션을 실행할 수 있는 가상 머신이다. JVM이 java compliler가 생성한bytecode를 운영체제에 맞게 변환하는 것과 비슷하게 DVM은 모바일 기기환경에 맞게 코드를 변환해준다