1. 오류 코드를 정의해 사용하는 것보다는, 예외를 사용해야 한다.
2. TRY-CATCH문을 적극 사용하자.
import java.util.Scanner;
public class Calculator {
public static void main(String[] args) {
try {
// 전체 흐름을 관리하는 메서드
processCalculator();
} catch (Exception e) {
//에러 처리(프로그램 종료 등등)
}
}
// 전체 계산 과정 관리
public static void processCalculator() throws Exception {
String userInput = getUserInput(); // 입력 받기
int number = parseToInt(userInput); // 입력을 숫자로 변환
int result = calculateSquare(number); // 숫자의 제곱 계산
displayResult(result); // 결과 출력
}
// 1. 사용자 입력을 받는 메서드
public static String getUserInput() {
Scanner scanner = new Scanner(System.in);
System.out.print("숫자를 입력하세요: ");
String input = scanner.nextLine();
if (input == null || input.trim().isEmpty()) {
throw new IllegalArgumentException("입력 값이 비어 있습니다.");
}
return input.trim();
}
// 2. 입력을 숫자로 변환하는 메서드
public static int parseToInt(String input) {
try {
return Integer.parseInt(input);
} catch (NumberFormatException e) {
throw new NumberFormatException("잘못된 숫자 형식입니다. 입력 값: " + input);
}
}
// 3. 숫자의 제곱을 계산하는 메서드
public static int calculateSquare(int number) {
if (number < 0) {
throw new IllegalArgumentException("음수는 허용되지 않습니다: " + number);
}
return number * number;
}
// 4. 결과를 출력하는 메서드
public static void displayResult(int result) {
System.out.println("결과: " + result);
}
}
위의 코드를 보면, try-catch가 적절히 사용되었다.
메서드에서 에러가 발생할 위험이 있으면, try-catch를 사용하는 것이 보인다.
parseToInt(String input) 메서드 vs 나머지 메서드
=> parseToInt(String input) 메서드에는 Integer.parseInt(intput)이라는 메서드를 사용하고 있는 것이 보인다. 이 메서드는 잘못된 값이 input에 들어오면 NumberFormatException이 발생한다. 다른 메서드들과는 다르게, try-catch로 바로 잡아주는 이유는 NumberFormatException에 명확한 오류 메시지를 넣어주기 위해서이다.
=> 오류 메시지를 남기게 되면, main에서 Exception을 받을 때, 어디서 어떤 오류가 났는지 알 수 있다.
오류가 났다면, 우리는 프로그램을 멈추거나, 그대로 진행하는 방식으로 처리한다.
외부 라이브러리를 호출하는 코드를 보자
LocalPort port = new LocalPort({포트번호});
try{
port.open();
} catch (PortDeviceFailure e) {
reportError(e);
logger.log(e.getMessage(), e);
} fianlly {
....
}
public class LocalPort{
private ACMEPort innerPort;
public LocalPort(int portNumber) {
innerPort = new ACMEPort(portNumber);
}
public void open(){
try{
innerPort.open();
} catch (DeviceResponseException e){
throw new PortDeviceFailure(e);
} catch (ATM1212UnlockedException e) {
throw new PortDeviceFailure(e);
} catch(,,,){
}
위의 코드를 보면 LocalPort를 open함으로 여러 오류가 발생할 위험성이 있다.
이때, 여러 오류를 open() 메서드에서 다 잡아주고 하나의 예외로 바꿔서 Throw 해주는 것을 볼 수 있다.
==> 이를 통해, 외부 라이브러리와 현 프로그램의 의존성을 크게 줄일 수 있다. 물론, 테스트도 쉬워진다.
++책에서는 null 또한 return하지 말라고 한다. null 대신 다른 상황으로 이끌어 갈 수 있다.
<클린코드 교재를 읽고 쓴 글입니다.>