💡 오류(Error)와 예외(Exception)
오류: 시스템 상에서 프로그램에 심각한 문제가 발생하여 실행중인 프로그램이 종료되는 것을 말하며 개발자가 미리 예측하거나 코드로 처리하는 것이 불가능 한 경우를 말한다.
(ex: JVM 에러, 정전, 컴퓨터 자체 하드웨어적인 문제 등)
예외: 오류와 마찬가지로 실행중인 프로그램을 종료시키는 것이 일반적이지만 발생할 수 있는 상황을 개발자가 미리 예측하고 처리할 수 있는 미약한 오류를 말한다.
(ex: if-else, try/catch 등)
예외 상황의 경우는 개발자가 적절히 처리하여 코드의 흐름을 컨트롤(비정상적인 종료를 할 수도 있고 그렇지 않게 할 수도 있게) 할 수 있다.

```java
int dividend = 3;
System.out.println(dividend / 0);
```
```java
int[] intArr = new int[0];
System.out.println(intArr[1]);
```
```java
int[] intArr = null;
System.out.println(intArr[0]);
```
```java
Object obj = new String("hello");
int num = (Integer)obj;
```
```java
int[] intArr = new int[-1];
```


try 블럭
예외(Exception)가 발생할 가능성이 있는 코드를 포함하여 작성하는 블럭
catch블럭
try 블럭에서 예외 발생 시 해당 예외 타입(Exception 클래스 타입)에 대한 처리를 기술하는 블럭이다.
여러 개의 catch블럭을 이어서 사용할 수 있으며 상위 타입의 예외를 처리하는 catch 블럭이 아래 쪽에 위치해야 한다.
finally 블럭
예외 발생 여부와 상관 없이 꼭 실행되어 처리해야 할 코드가 있으면 작성하는 블럭이다. 주로 java.io나 java.sql 패키지의 메소드 처리 시 자원 반납을 위해 사용한다.

try (BufferedReader in = new BufferedReader(new FileReader("test.dat"));){
String s;
while((s = in.readLine()) != null){
System.out.println(s);
}
} catch (FileNotFoundException/* | EOFException*/ e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}