【问题标题】:Logic error possibly misunderstanding in java assignmentjava赋值中可能存在逻辑错误
【发布时间】:2013-09-24 18:12:43
【问题描述】:

我在让这个项目正常工作时遇到了很多问题,但我目前一直在努力让这个课程正常工作。它的假设是从广播类中获取当前电台并将其传递给该类。问题是我试图在 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;
  } 
 }

【问题讨论】:

  • 良好的 SSCCE。您从选择 FM 开始,无法更改它。问题可能出在您的 getCurrentStaion() 方法实现中。此外,对于多态性,您不需要检查 if
  • @SotiriosDelimanolis 确实如此,但 OP 说在获取它时,你会得到 AM 收音机。这引出了一个问题,OP 真的是指所说的话吗,这就是所有代码吗?
  • 我怀疑问题出在您的 FMRadio 类中的 GetCurrentStation 上。可以发一下吗?
  • @Renan 我的印象是getCurrentStaion 为两个无线电返回相同的值。
  • 最好把 Radio、FM&AM&XMRadio 课程的内容也贴出来。但是根据您当前的代码,我猜您的代码中存在错误-如果所有 FM&AM&XM 都从 Radio 扩展,那么您是否正确覆盖了 .getCurrentStation(),我在您的代码中看到了拼写错误( getCurrentStation() 与 getCurrentStaion() )

标签: java logic


【解决方案1】:

问题是,在 .getCurrentStation() 中,selectedRadio 和 radioAM 都不是 init 并且为 null。

错误开始于:

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

这里,selectedRadio = null,所以它永远不会被赋值。

编辑:我相信你才刚刚开始,所以更多细节会有所帮助。

  1. 在声明两个字段 amRadio 和 radioAM 时会出错,然后初始化其中一个并使用另一个。
  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

【讨论】:

    【解决方案2】:

    我想我找到了问题

    每个 Radio 重载有 2 个字段

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

    但是您要与之比较的那个:radioAM 永远不会被实例化,因此始终为空。


    当你打电话时

    if (selectedRadio == radioAM)
    

    selectedRadioradioAM 都是 null,所以它们当然是相等的


    除非您打算将 radioAMamRadio 设为完全不同的实例,否则您不应该有 2 个这样的字段。

    由于您使用的是多态性,您可能希望使用后者

    Radio amRadio = new AMRadio();
    

    【讨论】:

      【解决方案3】:

      selectedRadio、radioAM 和 RadioFM 的所有属性均为空。构造函数中的代码没有效果,因为 selectedRadio = RadioFM。这意味着 selectedRadio 的值不会改变并保持为零。

      因此,getCurrentStation 中的 selectedRadio == radioAM (null == null) 始终为真。这将始终应用您的方法 getCurrentStation 中的第一个 if 块,并始终返回“amradio”。

      菜鸟

      【讨论】:

        猜你喜欢
        • 2017-12-17
        • 1970-01-01
        • 1970-01-01
        • 2010-12-22
        • 1970-01-01
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多