1

在一个 Android 程序中,我注意到一个变量的值似乎意外地发生了变化。这发生在我的应用程序的单实例活动中。我一定忽略了一些明显的东西,但我有一个知道 java 的同事看着它,她也没有看到任何东西。. .

我有一个非常简单的类,SignalItem ...

public class SignalItem {

    public int signal;
    public int position;

    public SignalItem () {
        signal = 0;
        position = 0;
    }
}

这是我使用它的例程(它曾经做更多的事情)。. .

 public static void add2Q(int signal, int position) {
    SignalItem sigI = new SignalItem();
    sigI.signal = signal;      // signal=0.   Step from here to ...
    sigI.position = position;  // ...here sigI.signal changes from 0 to 28! 
} 

在调试器中,输入参数信号和位置为 0。当我实例化 sigI 时,它的成员也是 0,因为它们应该是 0,因为这就是构造函数初始化它们的方式。但是当我从信号分配到位置分配时,sigI.signal 被设置为 28。如何/为什么?输入自变量信号保持为 0。

SignalItem 不是静态的 - 我可以创建它的多个实例(sigI2、sigI3 等)并且它们不受影响。不会重新输入 Add2Q - 在第一行设置的断点不会再次被命中。所有这一切都发生在同一个线程中(Thread[<1> main)由于 sigI 是在本地实例化的,它如何改变?

这不是调试器的工件 - 如果我将这些写入 logcat,它们都反映了我在调试器中看到的内容。提前致谢。

4

5 回答 5

3

有了给定的信息,没有任何东西可以修改 SignalItem 的该实例。

检查事项:

  • 您是否在运行您认为的代码?
  • 你确定这是同一个例子吗?
  • 您是否检查过调试器中的堆栈以查看另一个调用可能来自何处?
于 2013-06-14T19:27:48.293 回答
1

像这样定义对象可能更有意义:

public class SignalItem extends Object {

    public int signal;
    public int position;

    public SignalItem (int signal, int position) {
        this.signal = signal;
        this.position = position;
    }
}

然后你可以像这样调用你的构造函数:

public static void add2Q(int signal, int position) {
    SignalItem sigI = new SignalItem(signal, position);

}
于 2013-06-14T19:03:10.703 回答
1

当你的调试器上线时

sigI.signal = signal

它显示 sigI.signal == 0,那是因为它还没有执行该行。当它进入下一行时,它将执行前一行,并且 sigI.signal 将等于输入值信号。我认为你只是有一些调试器混淆或其他东西。

于 2013-06-14T18:59:17.137 回答
0

回去看看 Dave Newtons 的回答——你可能没有调试正在运行的代码。

这很容易发生 - 如果有另一个版本的 .java 文件或同名的 .class 文件,请摆脱它们并再次尝试所有操作。即使文件位于项目一无所知的目录中,即使文件位于 jar 或 zip 中,这种情况也可能发生并且确实发生。

于 2014-01-30T03:38:13.890 回答
0

我假设您正在扩展的“对象”是 java.lang.Object (这会使代码变得多余),如果不是,那可能就是您的问题所在。

尝试将您的成员变量设为私有并使用 setter 或构造函数设置它们。

于 2013-06-14T18:54:20.690 回答