gpt4 book ai didi

Java奇怪的赋值问题

转载 作者:搜寻专家 更新时间:2023-11-01 03:39:28 24 4
gpt4 key购买 nike

我遇到了一个问题,无法解决。

我在 Action 类的方法 setDataAction(int a) 中将整数 a 分配给成员 dataAction

赋值后值还是不一样! a == -3dataAction == 0。 Eclipse 和 Java 均未引发任何错误或投诉。

环境:带有 Eclipse Juno 和 JDK-7u25-win-64 的 Win7-64。

为了防止在这个方向上有任何评论,分配是在类的一个实例上完成的。我已经在几台机器上试过了,甚至设置了一台绝对没有病毒、只有操作系统和环境的原始机器!

调试器屏幕截图的更好图片也可在以下位置获得: http://setosix.eu/Java_Assignment_Problem.jpg/.gif/.png

    // Class to hold return values of the applet to determine further action
class Action implements Constants {
int dataAction;
int appletAction;
int dataResult;

Action() {
dataAction = MOVE_NOT;
appletAction = ACT_CONTINUE;
dataResult = LV_OK;
}

public void setDataAction(int a) {
dataAction = a;
}
}

// here the 'Action' instance is created
public class TableResource extends Database {
private Connection dbLink;
private Statement stmt;
protected ResultSet rs;
// hold the return values of applet
protected Action nextAction;

protected TableResource() {
dbLink = getInstance().getConnection();
rs = null;
stmt = null;
nextAction = new Action();
}
...

// data class for 'AppletMandanten'
public class DataMandanten extends TableResource implements Data {
...

// constants are defined here
public interface Constants {
// constants defining moves in record-/browse-mode
public static final int MOVE_NOT = 0;
public static final int MOVE_FIRST = -1;
public static final int MOVE_LAST = -2;
public static final int MOVE_NEXT = -3;
public static final int MOVE_PREVIOUS = -4;
public static final int MOVE_NEXTPAGE = -5;
public static final int MOVE_PREVPAGE = -6;
...


// interface ‘Data’ extends interface ‘Constants’
public interface Data extends Constants {
...


// in this class the instance ‘data’ is creates
public class ModulMandanten extends EventHandler implements Data {
...

// main control of applet
public int control() {
int leave = LV_OK;
DataMandanten data;

// connect to database
db = Database.getInstance();

if( db.dbConnect() < 0 ) {
Intelligence.out( 1, "ERROR in ("+"RWG"+"): Failed to connect to Server!");
leave = LV_ERROR;
}

// here ‘data’ instance is created
data = new DataMandanten();
...


public abstract class Applet extends ModulMandanten {
...

// here the invocation takes place
public class AppletMandanten extends Applet {
...

// handle events in class ‘AppleMandanten’ (derives from ‘ActionPerformed()’
private void eventHandler( ActionEvent event ) {
...
// invocation is called in method 'eventHandler', class 'AppletMandanten'
switch (eventName){
case ("btnNext"): {
// 'next' button pressed
data.nextAction.setDataAction( MOVE_NEXT );
// alternatively: doesn't work neither
data.nextAction.setDataAction = MOVE_NEXT;
// 'data.nextAction.setDataAction' printed to console ( != MOVE_NEXT )
System.out.println(Integer.toString(data.nextAction.dataAction));
break;
// !!! after this 'dataAction' isn't touched again !!!
}
...

Java assignment issue in Eclipse debug mode http://setosix.eu/Java_Assignment_Problem.jpg

最佳答案

回到基础。 Java 会正确地进行赋值——不能指望 Java 的这一部分会出现错误。当您编写 x=a 并且 a 为 -3 时,x 将立即为 -3。我在您的代码中看到的一些可能出错的地方:

多线程

使用 AtomicInteger 更改您的代码并更改调用者,以便在期望相同值的同时设置和获取是对 AtomicInteger 方法的一次原子调用,而不是分开方法调用。 synchronized 在上面的屏幕截图中不起作用。

追溯问题

在分配之前记录 adataAction。如果您想确定,直接在赋值之后再次执行,但请注意,另一个线程可能已经跳到中间并执行了 setDataAction()。我预计,您会发现一些奇怪的 0 赋值或没有调用 -3。

既然您看到了错误的分配,请向您的 setDataAction() 添加一些代码。

// add in setDataAction()
if(a == the-wrong-value) try {
throw new Exception("wrong assignment: " + a);
} catch(Exception e) {
e.printStackTrace();
}

因此,您会发现错误分配的来源,并能够追踪真正发生的事情。

关于Java奇怪的赋值问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18276667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com