- Checked Exceptionμ μ»΄νμΌμ ν κ²½μ°μ μμΈ‘κ°λ₯ν μμΈλ‘ ClassNotFoundException, FileNotFoundException λ±μ΄ μλ€.
- UnChecked Exceptionμ λ°νμμ λ°μν μλ μκ³ λ°μνμ§ μμ μλ μλ μμΈλ‘ ArithmeticException, NullPointerException λ±μ΄ μλ€.
- μλ¬λ JVM μ€νμ λ¬Έμ κ° μκΈ°λ κ²μ λ§νλ©°, μΌλ°μ μΌλ‘ κ°λ°μκ° μ§μ μλ¬λ₯Ό μ²λ¦¬ν μλ μλ€. λ³΄ν΅ μμ€ν μ 리μμ€ λ¬Έμ λ‘ λ°μνκ² λλ€.(μμ€ν μΆ©λ, λ©λͺ¨λ¦¬ λΆμ‘± λ±)
-
μ»΄νμΌ μμ λ°μν μ μλ€.
-
OutOfMemory , StackOverflowError λ±μ΄ μλ€.
-
java.lang.error ν¨ν€μ§μ μ‘΄μ¬
- μμΈλ κ°λ°μκ° μμ±ν μ½λλ‘ λ°μνλ€. μ»΄νμΌ λ° λ°νμμ λ°μνλ κ²½μ°μ΄λ€. κ°λ°μκ° μλ¬λ₯Ό μ²λ¦¬ν μ μλ€. μ¦, μμΈμ²λ¦¬λ₯Ό ν΅ν΄μ λ¬Έμ κ° λ°μνλλΌλ μ΄ν리μΌμ΄μ μ΄ μ’ λ£λμ§ μκ³ , νλ‘κ·Έλ¨μ΄ μ μ λμν μ μκ² μ²λ¦¬κ° κ°λ₯νλ€.
-
NullPointerExceoption, SqlException λ±μ΄ μλ€.
-
java.lang.Exception ν¨ν€μ§μ μ‘΄μ¬
- tryΒ :Β μμΈκ° λ°μν κ°λ₯μ±μ΄ μλ λ²μλ₯Ό μ§μ νλ λΈλ‘μ΄λ€.Β tryΒ λΈλ‘μ μ΅μν νλμΒ catchΒ λΈλ‘μ΄ μμ΄μΌ νλ©°,Β catchΒ λΈλ‘μΒ tryΒ λΈλ‘ λ€μμ μμΉνλ€.
- catchΒ :Β λΈλ‘μ 맀κ°λ³μλ μμΈ κ°μ²΄κ° λ°μνμ λ μ°Έμ‘°νλ λ³μλͺ μΌλ‘ λ°λμ java.lang.Throwable ν΄λμ€μ νμ ν΄λμ€ νμ μΌλ‘ μ μΈλμ΄μΌ νλ€.
- finallyΒ :Β μ΄ λΈλ‘μ νμ λΈλ‘μ μλλ©°,Β finallyΒ λΈλ‘μΒ catchΒ μ 무μ μκ΄ μμ΄ λ¬΄μ‘°κ±΄ μνλλ€. μ£Όλ‘ IO λλ ConnectionμΒ close() νλλ° μ¬μ©λλ€.
public static void main(String[] args) {
while(true) {
try {
A();
} catch(ArithmeticException e) {
e.printStackTrace();
} finally {
System.out.println("무쑰건 μ€νλ©λλ€.");
}
}
}
public static void A() throws ArithmeticException { // μμΈ λ°μμ A() ν¨μλ₯Ό νΈμΆν κ³³μμ μ²λ¦¬νλλ‘ ν¨.
Scanner scan = new Scanner(System.in);
int value = scan.nextInt();
System.out.println(9/value);
}
A λ©μλμμ μ€λ₯λ₯Ό λμ Έμ€μ, A λ₯Ό νΈμΆν κ³³μμ μλ¬μ²λ¦¬λ₯Ό λμ νλ λ°©λ²μ΄λ€.
λ¨μ : A() λ©μλλ₯Ό νΈμΆνλ λΆλΆμ΄ μμ² λ§λ€κ³ μκ°ν΄λ³΄μ. A() κ° λμ§ μμΈλ₯Ό μ΄λ€ λΆλΆμμ μ²λ¦¬νλκ±΄μ§ μΆμ νκΈ°κ° νλ€μ΄μ§λ€! throws λ₯Ό λ§μ΄ μ¬μ©νμ§ λ§μ.
λμ : tryλ¬Έ μμμ λ°μνλ Checked Exceptionμ catchλ¬Έ μμμ Unchecked ExceptionμΌλ‘ λ°κΏμ λμ Έμ£Όλ λ°©λ²μ μ μ©ν΄λ³Ό μ μλ€. μ΄λ κ² νλ©΄, μμΈκ° μ΄λμμ λ°μνλμ§ μ ννκ² μ μκ° μλ€.
// κΈ°μ‘΄ μ½λ
public static String A(BufferedReader bufferedReader) throws IOException { // throws μ¬μ©
String requestLine = bufferedReader.readLine();
return requestLine;
}
// κ°μ ν μ½λ
public class CustomRuntimeException extends RuntimeException {
public CustomRuntimeException(String message) {
super(message);
}
}
public static String A(BufferedReader bufferedReader) {
try {
String requestLine = bufferedReader.readLine();
return requestLine;
} catch (IOException e) {
throw new CustomRuntimeException("μ
λ ₯ κ°μ΄ μλͺ»λμμ΅λλ€."); // μ΄μ μ¬μ©μκ° μ
λ ₯κ°μ΄ μλͺ»λμλ€λ κ²μ μκ³ , μ ν¨ν μ
λ ₯μ νκ² λμ΄ μ΄ μλ¬λ₯Ό ν΄κ²°ν μ μλ€.
}
}
μ₯μ : μμΈκ° λ°μνλ κ³³μμ μμΈκ° λμ Έμ§κΈ°μ μμΈλ₯Ό μΆμ νκΈ° μ’λ€.
public static void A() {
Scanner scan = new Scanner(System.in);
int value = scan.nextInt();
if (value == 0) {
throw new ArithmeticException("0μΌλ‘ λλ μ μμ΅λλ€.");
}
System.out.println(9 / value);
}
κ°μ : tryμ μμ κ°μ²΄λ₯Ό μ λ¬νλ©΄, try μ½λ λΈλ‘μ΄ λλλ©΄ μλμΌλ‘ μμμ μ’ λ£ν΄μ£Όλ κΈ°λ₯μ΄λ€.
// tryμ μ λ¬ν μ μλ μμμ AutoCloseable μΈν°νμ΄μ€μ ꡬνμ²΄λ‘ νμ λλ€.
try (SomeResource resource = getResource()) {
use(resource);
} catch(...) {
...
}
AutoCloseable μΈν°νμ΄μ€λ JDK 1.7 λΆν° μΆκ°λλ μΈν°νμ΄μ€μ΄λ€.
public interface AutoCloseable {
void close() throws Exception;
}
try-with-resource λ try( ... ) μμ AutoCloseable μ ꡬν체λ₯Ό λ£μ΄μ£Όλ©΄, try λΈλ‘μ΄ μ’ λ£λ λ ν΄λΉ ꡬν체μ close() λ©μλλ₯Ό νΈμΆν΄μ£Όλ κΈ°λ₯μ΄λΌκ³ 보면 λλ€.
λ§μ½ μ΄ κΈ°λ₯μ μ¬μ©νμ§ μλλ€λ©΄ λ€μκ³Ό κ°μ΄ μ½λλ₯Ό μμ±νμ κ²μ΄λ€.
SomeResource resource = null;
try {
resource = getResource();
use(resource);
} catch(...) {
...
} finally {
if (resource != null) {
try {
resource.close();
} catch(...) {
/* μ무κ²λ μ ν¨ */
}
}
}
λ³μλ₯Ό λ§λ€μ§ μμ μνλ‘ μ¬μ©ν κ²½μ° close() λ©μλκ° νΈμΆλμ§μλλ€. μλ μμ μ½λλ₯Ό 보면μ μ΄ν΄νμ.
public static void main(String[] args) {
try(B b = new B(new A())){
}catch(Exception e){
}
}
// A, B λ λͺ¨λ AutoCloseable λ₯Ό μμλ°μλ€. νμ§λ§, μ΄λ Aμ closeλ νΈμΆλμ§ μλλ€.
// μ¬κΈ°μλ Bμ close λ§ νΈμΆλλ€.
// A λ νΈμΆνκΈ°μν΄μλ A μΈμ€ν΄μ€ λ³μλ₯Ό μμ±ν΄μ£Όμ΄μΌ νλ€.
public static void main(String[] args) {
try(A a = new A();
B b = new B(a)){
}catch(Exception e){
}
}
μμΈκ° λ°μν μ¬μ§κ° μλΒ λ©μλ(A)λ₯Ό νΈμΆνλΒ λ©μλ(B)κ° μλ€κ³ νμ.
- B κ° Aμμ λμ§ μμΈλ₯Ό νμ©ν΄ 무μμΈκ° μλ―Έ μλ μμ (μλ¬ μν©μ΄λ λ¬Έμ λ₯Ό ν΄κ²°)μ ν μ μλ€λ©΄ Checked Exception μΌλ‘ μ²λ¦¬
- B κ° Aμμ λμ§ μμΈλ₯Ό νμ©ν΄μ μλ¬΄λ° μμ λ ν μ μλ€λ©΄ Unchecked Exception μΌλ‘ μ²λ¦¬
- λ μ€ μ΄λ€ μν©μΈμ§ νμ€νκ² κ²°μ ν μ μλ€λ©΄ Unchecked Exception μΌλ‘ μ²λ¦¬
- λ©μλμ μΈμλ₯Ό λ°μ λΒ Objects.requireNonNull()μ μ¬μ©νμ¬ λ°©μ΄ν μ μλ€.
μ₯μ 1 : μ½λ μμμ ν΄λΉ κ°μ²΄κ° nullμ΄ μλμ΄μΌ ν¨μ λͺ μμ μΌλ‘ ννν μ μλ€.
public class A {
String name;
}
public class B {
A a;
public B(A a) {
this.a = Objects.requireNonNull(a);
}
}
// requireNonNull μ°Έκ³ μ½λ
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
μ₯μ 2 : fail-fast(μ₯μ κ° λ°μν μμ μμ μ¦μ νμ ν μ μλ κ²)
public class C{
A a;
public C(A a) {
this.a = a; //Objects.requireNonNull μ¬μ©x
}
//...getter
}
A a = null;
C c = new C(a);
c.getA(); // κ°μ²΄ μμ± μ΄νμ λ¦κ² NPE λ°μ
requireNonNull μ μ¬μ©νμ§ μκ³ , κ°μ²΄ μμ± μ΄νμ λ¦κ² μμΈκ° λ°μνλ€λ©΄, μμ€ν μ΄ λ³΅μ‘ν΄ μ§μλ‘ μ₯μ λ₯Ό λ°κ²¬νκΈ° μ΄λ ΅κ² λ§λ€ μ μλ€.
- Optionalμ μ¬μ©ν΄Β λ¦¬ν΄ νμ μμ nullμ λ°ννμ§ μλλ‘ λ°©μ΄ν μ μλ€.
- Optional : java 8 μμ μΆκ°λμμΌλ©°, κ°μ²΄λ₯Ό Optional λ‘ κ°μΈλ©΄μ NullpointerException μ ν΄κ²°ν μ μλ λ°©λ²μ μ 곡ν΄μ€λ€.
- Optional μ μ£Όλ‘ λ¦¬ν΄νμ μ μ¬μ©λλ κ²μ΄ κΆμ₯λλ€.
- ofNullable, orElse, orElseGet λ± μ μ§μ μ¬μ©ν΄λ³΄μλ κ²μ μΆμ²ν©λλ€.
Optional μ°Έκ³ μ¬μ΄νΈ
- https://www.daleseo.com/java8-optional-after/
- https://www.daleseo.com/java8-optional-effective/
- https://engkimbs.tistory.com/646
- μλ° 9 λΆν°λ μλ λ©μλκ° μΆκ°λλ©΄μ, Optional κ³Ό λΉμ·νκ² μ¬μ©κ°λ₯νλ€.
requireNonNullElseGet(T obj, Supplier<? extends T> supplier)