문제

다음과 같은 생성자가 있습니다.

public Agent(){

    this.name = "John";
    this.id = 9;
    this.setTopWorldAgent(this, "Top_World_Agent", true);

}

메소드 호출에서 널 포인터 예외가 있습니다. SettopworlDagent 방법의 논쟁으로 'this'를 사용하기 때문입니다. 이 방법을 제거하면 모든 것이 잘 보입니다. 왜 이런 일이 발생합니까? 다른 사람이 이것을 경험 했습니까?

도움이 되었습니까?

해결책

이것을 방법으로 전달할 수 있지만 settopworldagent ()는 추상적 일 수 없습니다. 생성자에서 가상 호출을 할 수 없습니다.

객체의 생성자에서 해당 객체 또는 기본 클래스에 정의 된 메소드를 호출 할 수 있지만 파생 클래스의 일부가 아직 구성되지 않기 때문에 파생 클래스에서 제공 할 것을 호출 할 수는 없습니다. SettopWorlDagent ()가 추상적 인 경우 일종의 컴파일러 오류가 예상되었을 것입니다.

Java에서는 대조업과 파생 수업으로 놀라운 행동을 얻을 수 있습니다. 여기에 예입니다.

http://en.wikipedia.org/wiki/virtual_functions#java_3

C# 또는 C ++에 익숙한 경우 가상 기능을 호출하고 재정의 기능을 호출하지 않는 것이 안전하다고 생각할 수 있습니다. Java에서는 파생 클래스가 완전히 구성되지 않더라도 가상 호출이 이루어집니다.

이것이 일어나지 않는 경우, 아마도 SettopworlDagent () 요구의 모든 부분이 초기화된다.

편집 : 이것이 C#이라고 생각했습니다.

다른 팁

호기심이 없어도 왜 같은 클래스의 회원 기능에 '이것' '을 전달하고 있습니까? SettopworlDagent ()는 'this'를 직접 사용할 수 있습니다. 그것은 당신의 생성자 나 settopworldagent ()가 정적 인 것처럼 보이지 않으므로 왜 당신이 이미 액세스 할 수있는 것을 멤버 기능에 전달할 것인지 잘 모르겠습니다.

내가 뭔가를 놓치지 않았다면 ...

setTopWorldAgent 필요 this 논쟁으로? 호출을 기반으로 인스턴스 방법이므로 참조 할 수 있습니다. this 매개 변수로 수신 할 필요가 없습니다.

지구상에서 왜 'this'를 'this'의 메소드로 전달 하는가?

다음은 당신이 당신에게 일어나는 일을 테스트 할 것이며 나는 그것에 어려움이 없습니다.

public class Test {
  public Test() {
    this.hi(this);
  }
  public void hi(Test t) {
    System.out.println(t);
  }

  public static void main(String[] args) throws Exception {
    Test t = new Test();
  }
}

settopworldagent가 인스턴스 방법 인 것처럼 보이면 왜 이것을 통과하는 이유는 무엇입니까?

"이"는 결코 무효가되어서는 안됩니다. 그로 인해 예외가 발생했다고 확신합니까?

메소드가 가상이거나 가상 메소드를 호출하는 경우 서브 클래스의 변수가 초기화되기 전에 서브 클래스에 속하는 메소드가 실행될 수 있다는 것입니다.

위의 코드가 확실히 작동하기 때문에 오류는 다른 곳에 있어야합니다. Null 참조는 다른 것이어야합니다.

에이전트가 itopworlDagent를 구현하는 경우 실제로 다음을 수행해야합니다.


Agent agent = new Agent("John", 9);
agent.setTopWorldAgent(agent, "Top_World_Agent", true);

그렇지 않다면 왜 당신이 당신의 방식으로 무언가를 설정 하는가?

SettopWorlDagent 방법의 무언가가 귀하의 생성자에서 아직 초기화되지 않은 값을 사용하고 있다고 가정합니다.

this 무효가 아니며, 그다지 확실합니다. 할당되었습니다.

즉, 통과 할 필요가 없습니다 this 이 방법으로 모든 인스턴스 방법에서 자동으로 사용할 수 있습니다. 메소드가 정적 인 경우 인스턴스 메소드로 리팩터를 원할 수 있습니다.

Java의 규칙은 객체가 완전히 구성되지 않았다는 간단한 이유 때문에 '이것'을 생성자의 다른 방법으로 전달해서는 안된다고 말합니다. 그것이 참조하는 객체는 일관되지 않은 상태 일 수 있습니다. 나는 실제 '이'참조가 널이지만, '이것'의 일부 구성원이 settopworldagent로 전달 될 때 널이라는 사실에 놀랐으며, 이로 인해 방법이 예외를 던지고 있다는 사실에 놀랐습니다.

일반적으로 다른 객체에서 'this'에 대한 참조를 설정하려는 경우 실제로 멤버 나 호출 방법에 액세스하지 않는 한 생성자로부터 '이'를 통과 할 수 있습니다.

이 경우 물론이 방법은 이미 'this'에 대한 언급이 있기 때문에 논쟁은 불필요합니다.

당신이 대답에 도달하게되어 기쁩니다. 매개 변수로 'this'를 통과하면 예상치 못한 동시성 문제가 발생할 수 있습니다. 당신은 기본적으로 잠재적으로 비 스레드 안전 코드에 의해 객체 상태가 안전하지 않은 조작 가능성을 제공하고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top