작성
·
31
0
package hello.core;
import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.order.Order;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;
public class OrderApp {
public static void main(String[] args) {
OrderService orderService = new OrderServiceImpl();
MemberService memberService = new MemberServiceImpl();
Long id=10L;
Member member = new Member(id, "aaa", Grade.VIP);
memberService.join(member);
System.out.println(member.getName()+" "+" "+member.getId()+" "+" "+member.getGrade());
Order order = orderService.createOrder(id,"XBOX",100000);
//
// System.out.println("order = " + order);
}
}
멤버의 정보까지는 정상적으로 불러와지는데 주문정보를
호출하는 과정부터 멤버 정보를 받아오지 못하는거 같습니다.
public interface OrderService {
Order createOrder(Long id, String itemName, int itemPrice) throws IllegalStateException;
}
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository = new MemoryMemberRepository();//회원 정보 찾기
private final DiscountPolicy discountPolicy = new FixDiscountPolicy();//할인 금액
@Override
public Order createOrder(Long id, String itemName, int itemPrice) {
Member member = memberRepository.findById(id);
if(id ==null){
throw new IllegalStateException("유효하지 않은 아이디 입니다" + id);
}
int discountPrice = discountPolicy.discount(member, itemPrice);
return new Order(id, itemName, itemPrice,discountPrice);
}
}
public class Order {
private Long id;
private String itemName;
private int itemPrice;
private int discountPrice;
public Order(Long id, String itemName, int itemPrice, int discountPrice) {
this.id = id;
this.itemName = itemName;
this.itemPrice = itemPrice;
this.discountPrice = discountPrice;
}
public int calculatePrice(){
return itemPrice - discountPrice; //비지니스 로직
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
public int getItemPrice() {
return itemPrice;
}
public void setItemPrice(int itemPrice) {
this.itemPrice = itemPrice;
}
@Override
public String toString() {
return "Order{" +
"id=" + id +
", itemName='" + itemName + '\'' +
", itemPrice=" + itemPrice +
", discountPrice=" + discountPrice +
'}';
}
}
order 패키지 쪽 소스 인데 수정해야 될부분이 있을까요
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "hello.core.member.Member.getGrade()" because "member" is null
at hello.core.discount.FixDiscountPolicy.discount(FixDiscountPolicy.java:10)
at hello.core.order.OrderServiceImpl.createOrder(OrderServiceImpl.java:20)
at hello.core.OrderApp.main(OrderApp.java:22)
에러는 이와같이 발생합니다
도와주셔서 감사합니다
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
노태근님께서 제공해주신 코드와 오류를 살펴보니, NullPointerException
이 발생하는 원인은 OrderServiceImpl
클래스에서 memberRepository.findById(id)
가 null을 반환했기 때문으로 보입니다. 즉, OrderServiceImpl
내에서 사용하는 MemberRepository
가 올바르게 초기화되지 않았거나, 멤버 정보가 저장되어 있지 않아 발생하는 문제로 보입니다.
이 문제를 해결하기 위해 다음 사항들을 확인하고 수정하시면 도움이 될 것입니다:
MemoryMemberRepository
클래스의 저장소(Map<Long, Member>
)를 static
으로 선언해야 합니다. 그래야만 모든 인스턴스에서 동일한 저장소를 공유할 수 있어 등록된 멤버 정보를 올바르게 참조할 수 있습니다. public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member> store = new HashMap<>();
// ... other methods
}
MemberServiceImpl
과 OrderServiceImpl
이 동일한 MemoryMemberRepository
인스턴스를 사용하도록 해야 합니다. 혹시 잘못된 인스턴스를 사용 중이라면, 새로운 인스턴스가 아닌 공유된 인스턴스를 사용하도록 코드를 조정해 보세요.위의 두 가지 사항이 해결되면, memberService.join(member);
를 통해 MemberRepository
에 추가된 멤버 정보를 OrderServiceImpl
이 올바르게 참조할 수 있을 것입니다.
좀 더 구체적인 예를 원하시면, Exception in thread를 유발하는 이유와 해결 방법을 다룬 이 유사한 게시물을 참고해보세요. 이 문제에 대해 더 자세히 설명하고 있으며 해결 방안도 함께 제공하고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
감사합니다