IT's 우

이것이 자바다[Java]_3장 Nan, Infinity 연산, ArithmeticException(예외) 본문

Java/이것이 자바다

이것이 자바다[Java]_3장 Nan, Infinity 연산, ArithmeticException(예외)

디우 2021. 1. 16. 17:00
728x90

/ 나 % 연산자를 사용할 때 좌측 피연산자가 정수 타입인 경우 나누는 수는 0을 사용할 수 없다. 만일 0으로 나누면 컴파일은 정상적으로 되지만, 실행 시 ArithmeticException(예외)이 발생한다.

 

 

ArithmeticException(예외) --> 정수를 0으로 나눌 경우 발생!!!

 

 

Java는 프로그램 실행 도중 예외가 발생하면 실행이 즉시 멈추고 프로그램은 종료된다. ArithmeticException이 발생했을 경우 프로그램이 종료되지 않도록 하려면 예외 처리를 해야한다.

 

실수 타입인 0.0 또는 0.0f로 나누면 ArithmeticException이 발생하지 않고, / 연산의 결과는 Infinity(무한대) 값을 가지며, % 연산의 결과는 NaN(Not a Number)을 가진다.

 

5 / 0 --> ArithmeticException

5 % 0 --> ArithmeticException

5 / 0.0 --> Infinity

5 % 0.0 --> NaN

 

/와 % 연산의 결과가 Infinity 또는 NaN이 나오면 이 값들로 산술 연산을 하면 어떤 수와 연산하더라도 Infinity와 NaN이 산출되어 데이터가 엉망이 될 수 있다.

 

코드에서 /와 % 연산의 결과가 Infinity 또는 NaN인지 확인하려면

Double.isInfinite()Double.isNaN() 메소드를 이용하면 된다.

 

 

public class InfinityAndNaNCheckExample {
public static void main(String[] args) {
int x = 5;
double y = 0.0;

double z = x / y;
//double z = x % y;

System.out.println(Double.isInfinite(z));
System.out.println(Double.isNaN(z));

System.out.println(z+2); //문제가 되는 코드
}
}

 

 

-입력값의 NaN 검사

부동소수점(실수)을 입력받을 때에는 반드시 NaN 검사를 해야한다.

 

public class InputDataCheckNaNExample {
public static void main(String[] args) {
String userInput = "NaN"; //사용자로부터 입력 받은 값
//입력값을 double 타입으로 변환
double val = Double.valueOf(userInput);
//"NaN"이 문자열이 Double.valueOf() 메소드에 의해 double 타입으로 변환되어 val에는 NaN이 저장된다.

double currentBalance = 10000.0;

currentBalance += val;
System.out.println(currentBalance);
}
}

 

문자열로 "NaN"을 입력받아 double 타입으로 변환하여 NaN으로 저장된 값으로 산술 연산을 수행하면 연산이 엉망이 된다. 그러므로 문자열을 입력받을 때에는 반드시 "NaN"인지 조사해야 한다.

 

 

public class InputDataCheckNaNExample2 {
public static void main(String[] args) {
String userInput = "NaN";
double val = Double.valueOf(userInput);

double currentBalance = 10000.0;

if(Double.isNaN(val)) {
System.out.println("NaN이 입력되어 처리할 수 없음");
val = 0.0;
}

currentBalance += val;
System.out.println(currentBalance);
}
}

 

 

 

728x90
반응형