
사용자로부터 아이디와 비밀번호를 입력받아 로그인하는 프로그램을 작성해야 한다.
"admin", 비밀번호가 "1234"가 아니면 예외를 발생시킨다. "로그인 실패! 아이디 또는 비밀번호가 잘못되었습니다." 출력 후 다시 입력받는다. main 메서드 안에 선언한 오류처음에는 login 메서드를 main 메서드 내부에 선언하여 컴파일 오류가 발생했다.
public static void main(String[] args) {
public static void login(String id, int password) throws Exception { // ❌ 오류 발생
if (!id.equals("admin") || password != 1234) {
throw new Exception("Log in failed! Your id or password is not correct!");
}
}
}
원인:
해결 방법:
login 메서드를 main 메서드 밖으로 이동. 나는 자바스크립트를 배운 기억이 있어서, 처음에는 main 안에 login 메서드가 호출되니까, login을 맨 위로 올려야하나 생각했다. 하지만 아니다. 자바에서는 main 메서드가 항상 먼저 실행되므로, 코드 상의 위치는 실행 순서에 영향을 미치지 않는다.
하지만 일반적으로 클래스는 "변수 → 생성자 → 메서드" 순서로 구성하는 것이 관례이다.
int 타입 비밀번호를 .equals()로 비교한 오류비밀번호 비교를 .equals()로 했을 때 오류가 발생했다.
if (!id.equals("admin") || password.equals(1234)) { // ❌ 오류 발생
원인:
.equals()는 String과 같은 참조형(객체) 비교에 사용해야 한다. int 같은 기본 자료형(primitive type)은 == 또는 != 연산자로 비교해야 한다. 해결 방법:
!= 연산자로 변경 if (!id.equals("admin") || password != 1234) { // ✅ 정수 비교는 != 사용
package chapter3.exception.practice;
import java.util.Scanner;
public class Main { // 클래스
public static void main(String[] args) { // 메인 메서드
Scanner scanner = new Scanner(System.in);
while (true) {
try {
System.out.print("Type your id: ");
String id = scanner.nextLine();
System.out.print("Type your password: ");
int password = scanner.nextInt();
login(id, password); // static 메서드라 new를 안 써도 된다.
System.out.println("Log in success!");
break;
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
// 로그인 검증 메서드
public static void login(String id, int password) throws Exception {
if (!id.equals("admin") || password != 1234) {
throw new Exception("Log in failed! Your id or password is not correct!");
}
}
}
new 없이 바로 호출할 수 있다. .equals()를 사용하지만, 정수 비교는 == 또는 !=을 사용해야 한다.