Java Android:创建新对象并使用Synchronized连续操作/调用新方法

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操作的原因 此策略似乎无法工作,因为锁定的对象不能

我试图让用户创建一个新的流对象,并将其添加到ArrayList中,以便在按下工具栏上的“+”时跟踪

我正在与Java的多线程技术作斗争,因为我需要对象及其属性的方法在对象实例化之前运行,这导致了各种各样的问题

我希望我的方法可以连续执行(例如,show dialog、get name、use object constructor、add new object to list),这就是为什么我尝试对我声明但未实例化的对象使用
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