2011-10-25 2 views
0

나는 모든 클래스가 각 클래스에 대한 인스턴스를 만들 필요없이 내 레조 로봇의 센서 메소드에 액세스 할 수 있도록 아래에 정적 클래스를 만들었습니다.정적 클래스가 내 로봇을 충돌시키는 이유는 무엇입니까?

그러나 StandardRobot.motorA.setPower(100)과 같은 메서드를 호출 할 때마다 내 로봇이 충돌합니다. 정확히 동일한 클래스를 사용하여 로컬 인스턴스를 만들면 정상적으로 작동합니다. 왜 이런거야? 두 번 모두 내 코드가 잘 컴파일되고 런타임에 실패합니다.

import lejos.nxt.*; 

public class StandardRobot { 

    public static ColorSensor colourSensor; 
    public static TouchSensor touchSensor; 
    public static UltrasonicSensor ultrasonicSensor; 
    public static NXTMotor motorA, motorB; 

    public StandardRobot() { 
     // instantiate sensors 
     ultrasonicSensor = new UltrasonicSensor(SensorPort.S1); 
     colourSensor = new ColorSensor(SensorPort.S2); 
     touchSensor = new TouchSensor(SensorPort.S4); 

     //instantiate motors 
     motorA = new NXTMotor(MotorPort.A); 
     motorB = new NXTMotor(MotorPort.B); 
    } 
} 
+2

를 생성자를 호출 할 때까지'motorA'이 null'가'이기 때문입니다. 인스턴스 생성자 –

+1

에 정적 변수를 할당하면 안됩니다.이 상황에서 충돌이 의미하는 바를 알려 주실 수 있습니까? 예외가 발생합니까? 아니면 VM이 충돌합니까? – stacker

+0

정적 클래스가 아닙니다. 그것은 많은 정적 데이터와 메소드를 가진 클래스입니다. – EJP

답변

4

하지만 변수 초기화는 생성자에서 발생 할 수 중 하나.

생성자는 인스턴스가 생성 될 때만 호출됩니다 (new 통해).

정적 속성을 정적 초기화 블록이나 선언 된대로 정적으로 초기화해야합니다.

// Initialize static properties as they're declared. 
public static ColorSensor colourSensor = new ColorSensor(SensorPort.S2); 

// Or initialize in a static initialization block to do them all at once. 
public static TouchSensor touchSensor; 
// ... and the others. 
static { 
    touchSensor = new TouchSensor(SensorPort.S4); 
    // ... and the others. 
} 
2

때문에 런타임 중에 NullPointerExceptions를 선도 그래서 널 (null) 기본 그래서 당신은 당신이 motorA, motorB, ultrasonicSensor 등을 인스턴스화하지 않는 생성자 StandardRobot를 호출하지 않는 경우. 당신은 모든 필드 인스턴스 변수를 만들거나 정적 초기화 블록을 사용하는 것이 좋습니다 즉 당신은 유틸리티 클래스를 만들려고

static { 
// instantiate sensors 
    ultrasonicSensor = new UltrasonicSensor(SensorPort.S1); 
    colourSensor = new ColorSensor(SensorPort.S2); 
    touchSensor = new TouchSensor(SensorPort.S4); 

    //instantiate motors 
    motorA = new NXTMotor(MotorPort.A); 
    motorB = new NXTMotor(MotorPort.B); 
} 
2

정적 변수가 아닌 예를 들면, 클래스에 대해 정의된다. 정의한 생성자는 클래스가 아닌 인스턴스에 대해 호출됩니다. 결과에서 변수가 초기화되지 않을 수 있습니다.

관련 노드에서 : 변수를 정적으로 만드는 아이디어는 그리 좋지 않습니다. 모든 로봇이 상태를 공유하기 때문에 하나의 로봇 만 가질 수 있습니다.

+0

실제 로봇입니다. –

0

정적 섹션하여 생성자를 대체 :

static { 
     // instantiate sensors 
     ultrasonicSensor = new UltrasonicSensor(SensorPort.S1); 
     colourSensor = new ColorSensor(SensorPort.S2); 
     touchSensor = new TouchSensor(SensorPort.S4); 

     //instantiate motors 
     motorA = new NXTMotor(MotorPort.A); 
     motorB = new NXTMotor(MotorPort.B); 
} 
관련 문제