Java Android:创建新对象并使用Synchronized连续操作/调用新方法
我试图让用户创建一个新的流对象,并将其添加到ArrayList中,以便在按下工具栏上的“+”时跟踪 我正在与Java的多线程技术作斗争,因为我需要对象及其属性的方法在对象实例化之前运行,这导致了各种各样的问题 我希望我的方法可以连续执行(例如,show dialog、get name、use object constructor、add new object to list),这就是为什么我尝试对我声明但未实例化的对象使用Java Android:创建新对象并使用Synchronized连续操作/调用新方法,java,android,multithreading,oop,Java,Android,Multithreading,Oop,我试图让用户创建一个新的流对象,并将其添加到ArrayList中,以便在按下工具栏上的“+”时跟踪 我正在与Java的多线程技术作斗争,因为我需要对象及其属性的方法在对象实例化之前运行,这导致了各种各样的问题 我希望我的方法可以连续执行(例如,show dialog、get name、use object constructor、add new object to list),这就是为什么我尝试对我声明但未实例化的对象使用Synchronized操作的原因 此策略似乎无法工作,因为锁定的对象不能
Synchronized
操作的原因
此策略似乎无法工作,因为锁定的对象不能为null
java.lang.NullPointerException: Null reference used for synchronization (monitor-enter)
关于如何让我的方法像下面的伪代码一样以串行方式运行的想法:
private Flow newFlow; //Blank flow object declared.
private static List<Flow> flowsInStream = new ArrayList<Flow>();
synchronized (newFlow) {
flowDialog();
// presents user a dialog box to receive input.
// takes user input, invokes separate method to actually instantiate
// the newFlow object using the user input.
// Originally blank newFlow object now has:
// newFlow.name = userInput
// --X END X--
addToStream(newFlow);
// adds the newly instantiated newFlow object to the flowsInStream
// array to keep track of them.
// --X END X--
executedCorrectly();
// displays log message showing both the newFlow.name & the current
// elements in the flowsInStream array.
// --X END X--
} // end of synchronized
如果有任何额外的代码可以帮助,请告诉我,我很乐意发布一些。如果可能的话,请在你的回答中提及我在尝试这一点时缺乏的技术理解
收到错误:
java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.String nhacks16.flow.Main.Flow.getFlowName()' on a null object
reference
当
newFlow
仍为null
时,您正在使用synchronized(newFlow)
。不能对null
引用使用synchronized
。如果确实要同步,请创建不同的对象
(任何对象
都可以)并在该对象上同步,或在此
上同步(只需使用已同步{
,不带括号).哪一个是正确的,取决于您要防止哪种并行,这就引出了下一点:
我看不到任何多线程,所以我不确定您是否需要同步。您正在使用
synchronized(newFlow)
,当newFlow
仍然为null
时。您不能在null
引用上使用synchronized
。如果确实要同步,请创建不同的对象(任何对象
都可以)并在该对象上同步,或在此
上同步(只需使用已同步{
,不带括号)。哪一个是正确的,取决于您要防止的并行类型,这就引出了下一点:
我没有看到任何多线程,所以我不确定您是否需要同步。@mastov完全正确,因为代码中似乎没有任何多线程,我的newFlow对象为null
。但我只是想在阅读了他的评论和我的一个朋友poi之后澄清我自己的技术错误把它弄出来,以防别人发现有用
我的印象是对话框冻结了所有活动(即方法:addToStream(offflow);
和executedtorreceived();
将等待flowDialog()
完成后再执行)
因此,因为这些方法似乎是在对话框消失之前执行的,所以我觉得它们运行在不同的线程上
出现nullPointerException的原因是,在用户单击按钮并输入文本之前,对象未实例化。因此,一旦设置了flowDialog,下一个方法将运行,但由于flow对象未实例化,因此抛出了null异常!@mastov在目前,代码中似乎没有任何多线程,我的newFlow对象是null
。但我只是想在阅读了他的评论后澄清我自己的技术错误,我的一个朋友指出了这一点,以防其他人发现有用
我的印象是对话框冻结了所有活动(即方法:addToStream(offflow);
和executedtorreceived();
将等待flowDialog()
完成后再执行)
因此,因为这些方法似乎是在对话框消失之前执行的,所以我觉得它们运行在不同的线程上
出现nullPointerException的原因是,在用户单击按钮并输入文本之前,对象没有实例化。因此,一旦设置了flowDialog,下一个方法将运行,但由于flow对象没有实例化,它抛出了null异常!嗨,mastov,感谢您的回复。您怎么办如果不使用synchronize,我会使这些方法以串行方式运行?我希望我的第二个方法(addToStream)在执行前等待第一个方法(flowDialog)完成。@Robertsimos:如果不使用多线程,它们将“串行”执行不需要做任何事情。是什么让你认为有多线程在进行?最初我只是在没有同步块的情况下一个接一个地放置方法,我会得到日志消息:“由于新流对象的名称为空,所以正确执行了同步活动”我认为这意味着日志消息在使用flowDialog()实例化对象之前抓取了newFlow.name@Robertsimos:我认为这与多线程无关。但是为了让我们能够弄清楚为什么会发生这种情况,请发布相关的代码。@Robertsimos:据我所知,offflow
变为null
的唯一方法是“负按钮”已单击。在这种情况下,theFlow
从未初始化,但方法正确执行
仍会执行,从而访问null
对象。您好,马斯托夫,谢谢您的回复。如果不使用同步,如何使方法串行运行?我希望第二个方法(addToStream)等到第一个方法(flowDialog)在执行之前已完成。@Robertsimos:如果您不使用多线程,它们将“串行”执行,而无需执行任何操作。是什么让您认为正在进行多线程处理?最初我只是将这些方法
public class Flow {
private String flowName;
public Flow() {
} // End of default constructor
public Flow(String flowName) {
this.flowName = flowName;
} // End of constructor
/** Getters & Setters **/
public void setFlowName(String flowName) {
this.flowName = flowName;
}
public String getFlowName() {
return this.flowName;
}
java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.String nhacks16.flow.Main.Flow.getFlowName()' on a null object
reference