2015-02-07 3 views
0

그래서 다른 클래스에서 사용하게 될 클래스를 개발했습니다. 다음과 같이 내가 개발 한 클래스입니다 :출력이 "NaN"입니다.

public class Car 
{ 
private double milesPerGallon; 
private double gas; 

//Constructs a car with a given fuel efficiency 
public Car(double milesPerGallon) 
{ 
    gas = 0.0; 
} 

//Increases the amount of gas in the gas tank 
public void addGas(double amount) 
{ 
    gas = gas + amount; 
} 

//Decreases the amount of gas in the gas tank (due to driving and therefore consuming gas) 
public void drive(double distance) 
{ 
    gas = gas - (distance/milesPerGallon); 
} 

//Calculates range, the number of miles the car can travel until the gas tank is empty 
public double range() 
{ 
    double range; 
    range = gas * milesPerGallon; 
    return range; 
} 
} 

내가 개발 한 클래스를 사용하는 가정되는 클래스입니다 :

public class CarTester 
{ 
/** 
* main() method 
*/ 
public static void main(String[] args) 
{ 
    Car honda = new Car(30.0);  // 30 miles per gallon 

    honda.addGas(9.0);    // add 9 more gallons 
    honda.drive(210.0);    // drive 210 miles 

    // print range remaining 
    System.out.println("Honda range remaining: " + honda.range()); 

    Car toyota = new Car(26.0);  // 26 miles per gallon 

    toyota.addGas(4.5);    // add 4.5 more gallons 
    toyota.drive(150.0);    // drive 150 miles 

    // print range remaining 
    System.out.println("Toyota range remaining: " + toyota.range()); 
} 
} 

두 클래스가 성공적으로 프로그램을 실행하지만 때 출력을 얻을 컴파일 할 "NaN"은 "숫자가 아닙니다." 나는 이것을 바라 보았고 아마도 0이나 비슷한 것으로 나뉘는 수학적 과정이있을 때 일어난다. 나는 반복하지 않고 답을 찾지 않지만 실수를 저지르고있는 올바른 방향으로 조금 움직여서 (나는 아주 작고 어리석은 실수라고 확신한다). 감사!

+0

이것을 빨리 테스트 할 수는 없지만 모든 값을 정수/float로 강제 변환하십시오. 따라서 toyota.range()가 플로팅/이중 값으로 랩하는 경우에도이 값을 의미합니다. – Mayhem

+1

'milesPerGallon' 인스턴스 변수를보십시오. 뭐가 잘못 됐니? – Voicu

+0

왜냐하면'honda.milesPerGallon'은 0으로 설정했기 때문에 아무것도 설정하지 않았기 때문입니다. (이것은 당신에게 혼란을주기 때문에 두 개의 다른 것들에 동일한 이름을주지 않는 것이 중요합니다.) – immibis

답변

2

는 생성자에서 당신의 milesPerGallon 변수를 저장 : 당신은 당신의 Car 생성자에서 milesPerGallon를 초기화하지 않는

public Car(double milesPerGallon) 
{ 
    this.milesPerGallon = milesPerGallon; 
    gas = 0.0; 
} 
+0

좋아요, 어떻게 작동하는지 그리고 Honda에 대한 정답을 출력하고 range가 음수이면 범위 출력에서 ​​0.0을 출력하는 if-else 문을 작성했습니다 (Toyota에서 발생). 도와 줘서 고마워! – user3727648

1

. 따라서 기본값으로 0.0을 사용하고 있습니다. 그리고 숫자가 0.0으로 나눠지면 NaN이됩니다.

1

milesPerGallon은 생성자 매개 변수로 초기화해야합니다.

생성자 :

public Car(double milesPerGallon) 
{ 
    this.milesPerGallon = milesPerGallon; 
    gas = 0.0; 
} 

milesPerGallon 나중에 그러나 결코 초기화 사용됩니다.

1

마일 페어 갤런을 초기화하지 않은 것처럼 보입니다. 생성자에서 허용하는 변수는 클래스 상단에서 초기화 한 private 변수와 다릅니다. 일반적으로 사람들은 공용 자동차 (aMilesPerGallon)와 같은 것을 사용하여 차이점을 알고 있는지 확인합니다. 또는 입력하는 동안 게시 된 답변으로 this.milesPerGallon 클래스의 맨 위에 변수를 참조합니다.

1

생성자에 milesPerGallon을 설정하지 않으므로 0.0으로 초기화됩니다. 그 변수로 뭔가를 어딘가로 나눠 주시겠습니까?