2

このプロジェクトを正しく機能させるには多くの問題がありましたが、現在、このクラスを正しく機能させることに固執しています。ラジオ クラスから現在の放送局を取得し、それをこのクラスに渡すことを想定しています。問題は、AM と FM のどちらかを選択しようとしているのですが、実行するたびに AM ステーションしか表示されないことです。なぜその局に自動的に設定されるのかわかりません。

public class AutoRadioSystem
{
  private Radio selectedRadio;
  private AMRadio radioAM;
  private FMRadio radioFM; 
  private XMRadio radioXM;

  //is this the correct place to initialize these? 
  Radio amRadio = new AMRadio();
  Radio fmRadio = new FMRadio();
  public AutoRadioSystem()
  {
   //even making the selected radio FM still produces values for AM
   selectedRadio = radioFM;
  }

  // this is where my problem currently lies and probably much more. Shouldn't it return 0.0 without any station being selected.  
  public double getCurrentStation()
  {
    if (selectedRadio == radioAM)
    {
      return amRadio.getCurrentStaion();
    }
    else if (selectedRadio == radioFM)
    {
      return fmRadio.getCurrentStaion();
    }
    return 0.0;
  }

  //I'm not sure if i'm setting this up correctly to switch the radio from am to fm 
  public void selectRadio()
  {
    if (selectedRadio == radioAM)
      selectedRadio = radioFM;
  }
  public static void main (String [] args) { 
    AutoRadioSystem c = new AutoRadioSystem();
    c.selectRadio();
    double b = c.getCurrentStation();
    System.out.println(b);
  }
}

public class AMRadio extends Radio
{
  private static final double Max_Station = 1605;
  private static final double Min_Station = 535;
  private static final double Increment = 10;
  public AMRadio()
  {
    currentStation = Min_Station;
  }
  public  double getMax_Station()
  {
    return this.Max_Station;
  }
  public  double getMin_Station()
  {
    return this.Min_Station;
  }
  public  double getIncrement()
  {
    return this.Increment;
  }
  public String toString()
  {
    String message = ("AM " + this.currentStation);
    return message;
  } 
}

public class FMRadio extends Radio
{
  private static final double Max_Station = 108.0;
  private static final double Min_Station = 88.0;
  private static final double Increment = .01;
  public FMRadio()
  {
    currentStation = Min_Station;
  }
  public  double getMax_Station()
  {
    return this.Max_Station;
  }
  public  double getMin_Station()
  {
    return this.Min_Station;
  }
  public  double getIncrement()
  {
    return this.Increment;
  }
  public String toString()
  {
    String message = ("FM " + this.currentStation);
    return message;
  } 
}


public abstract class Radio
{
 double currentStation;

 RadioSelectionBar radioSelectionBar;
 public Radio()
 {

 }
 public abstract double getMax_Station();
 public abstract double getMin_Station();
 public abstract double getIncrement();
 public void up()
 {

 }
 public void down()
 {

 }
 public double getCurrentStaion()
 {
   return this.currentStation;
 }
 public void setCurrentStation(double freq)
 {
   this.currentStation = freq;
 }
 public void setStation(int buttonNumber, double station)
 {
 }
 public double getStation(int buttonNumber)
 {
   return 0.0;
 }
 public String toString()
  {
    String message = ("" + currentStation);
    return message;
  } 
 }
4

3 に答える 3

1

問題は、.getCurrentStation() で、selectedRadio と radioAM の両方が初期化されておらず、null であることです。

間違いは次のように始まります。

public void selectRadio()
{
    if (selectedRadio == radioAM)
    {
        selectedRadio = radioFM;
    }
}

ここでは、selectedRadio = null であるため、割り当て値を取得することはありません。

編集:あなたはこれを始めたばかりだと思うので、もう少し詳細が役立ちます。

  1. amRadio と radioAM の 2 つのフィールドを宣言し、そのうちの 1 つを初期化して別のフィールドを使用すると、間違いが発生します。
  2. selectedRadio に値を設定して比較しなかったため、常に false が返されます
  3. インスタンスの値を初期化するのに最適な場所は、コンストラクター メソッドです。ここでは AutoRadioSystem() です。

コードを次のように変更することもできます。

private Radio selectedRadio;
public AutoRadioSystem()
{
    selectedRadio = new FMRadio();
}
// To compare, using instanceOf, but better design will use enum value instead, up to you
于 2013-09-24T18:31:58.263 に答える
1

私は問題を発見したと思います

Radioオーバーロードごとに 2 つのフィールドがあります

private AMRadio radioAM;
...
Radio amRadio = new AMRadio();

しかし、比較しているものradioAMはインスタンス化されないため、常にnullです。


電話すると

if (selectedRadio == radioAM)

selectedRadioとの両方radioAMnullであるため、もちろんそれらは等しくなります。


完全に異なるインスタンスになることを意図radioAMしていない限り、そのような 2 つのフィールドを持つべきではありません。amRadio

ポリモーフィズムを使用しているため、後者を使用することをお勧めします

Radio amRadio = new AMRadio();
于 2013-09-24T18:32:09.170 に答える
0

selectedRadio、radioAM、および RadioFM のすべてのプロパティは null です。selectedRadio = RadioFM であるため、コンストラクターのコードは効果がありません。これは、 selectedRadio の値が変化せず、ゼロのままであることを意味します。

したがって、getCurrentStation の selectedRadio == radioAM (null == null) は常に true です。これにより、メソッド getCurrentStation の最初の if ブロックが常に適用され、常に「amradio」が返されます。

カイオ

于 2013-09-24T19:09:47.530 に答える