我遇到了问题,无法理解它。
我在类a
的方法dataAction
中将成员setDataAction(int a)
分配给成员Action
。
分配后,值仍然不同! a == -3
,dataAction == 0
。 Eclipse和Java都没有引起任何错误或抱怨。
环境:使用Eclipse Juno和JDK-7u25-win-64的Win7-64。
为防止在此方向发表任何评论,分配是在课程的实例上完成的。我已经在几台机器上试过了它,甚至建立了一个绝对没有病毒的原始机器,只有OS&环境!
可以在以下位置获得更好的调试器屏幕截图: 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
答案 0 :(得分:1)
回到基础。 Java确实正确分配 - 人们不能指望Java的这一部分存在错误。当你写x=a
而a是-3时,x之后会立即为-3。我在代码中看到的一些可能出错的事情:
多线程
使用AtomicInteger
更改您的代码并更改调用者,以便设置和获取期望相同的值,是对AtomicInteger
方法的一次原子调用,而不是单独的方法调用。 synchronized
在上面的屏幕截图中不起作用。
追溯问题
在分配之前记录a
和dataAction
。如果你想确定,再次在作业之后直接进行,但要注意,另一个线程可能已经跳到了中间并且也是setDataAction()
。我怀疑,你会发现0的一些奇怪的分配或-3的没有呼叫。
现在您看到了错误的作业,请在setDataAction()
添加一些代码。
// add in setDataAction()
if(a == the-wrong-value) try {
throw new Exception("wrong assignment: " + a);
} catch(Exception e) {
e.printStackTrace();
}
所以,你会发现错误的任务来自哪里,并能够追踪到底发生了什么。