Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不稳定的if语句&引用;“返回”;值,然后在退出之前,返回false子句的值 [更新]问题已通过“不稳定”if语句修复。答案在评论中。我提出了一个新问题来处理我的另一个问题-_Java_Android_Generics_If Statement - Fatal编程技术网

Java 不稳定的if语句&引用;“返回”;值,然后在退出之前,返回false子句的值 [更新]问题已通过“不稳定”if语句修复。答案在评论中。我提出了一个新问题来处理我的另一个问题-

Java 不稳定的if语句&引用;“返回”;值,然后在退出之前,返回false子句的值 [更新]问题已通过“不稳定”if语句修复。答案在评论中。我提出了一个新问题来处理我的另一个问题-,java,android,generics,if-statement,Java,Android,Generics,If Statement,我遇到了一个不应该发生的奇怪的if条件逻辑流 基本上,类Click中的方法listenOn(…)不应继续创建侦听器的新实例。一个已经足够好了,所以我要防止那些不必要的创造 然而,当我在MainActivity中设置一个简单的测试,在所有setOnClickListener检查listenOn(…)方法之前,我看到对该方法的第一次调用按预期工作,第二次似乎工作正常 …除了在true子句中出现return之后,它直接跳到false子句的return;但是,正在跳过新侦听器的创建 我不明白它为什么这样

我遇到了一个不应该发生的奇怪的if条件逻辑流

基本上,类
Click
中的方法
listenOn(…)
不应继续创建侦听器的新实例。一个已经足够好了,所以我要防止那些不必要的创造

然而,当我在
MainActivity
中设置一个简单的测试,在所有
setOnClickListener
检查
listenOn(…)
方法之前,我看到对该方法的第一次调用按预期工作,第二次似乎工作正常

…除了在true子句中出现
return
之后,它直接跳到false子句的
return
;但是,正在跳过新侦听器的创建

我不明白它为什么这样做。我的代码中有一个错误,因为无论我按下哪个按钮,它都只执行除法运算。我添加了泛型,这个问题可能就是由此产生的

顺便说一下,我正在尝试不同的方法来创建听众。我不是在寻找“最好的方法”或“标准的方法”,我在寻找学习不同的东西,所以不要攻击我用来创建听众的方法


我希望你能解释一下

if语句的行为

为什么单击任何按钮时只进行除法操作


Click.java
公共类点击{
私人信托业务;
private View.OnClickListener监听器;
公共点击(T操作){
这个操作=操作;
}
public View.OnClickListener listenerOn(最终维护活动UI){
// ******************************************************
//第一步-转到false子句,并返回新的侦听器
//第二遍-goes to true子句,返回旧侦听器,然后转到
//false子句并返回侦听器;但是,它跳过
//新的View.OnClickListener。为什么??
// ******************************************************
if(侦听器!=null){
返回侦听器;
}否则{
listener=新视图。OnClickListener(){
@凌驾
公共void onClick(视图v){
双倍总计,num1,num2;
num1=Double.parseDouble(UI.txtNumber1.getText().toString());
num2=Double.parseDouble(UI.txtNumber2.getText().toString());
总计=操作。执行(num1,num2);
UI.txtreult.setText(Double.toString(总计)+“--v5”);
}
};
返回侦听器;
}
}
}
MainActivity.java
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
按钮btnAdd=(按钮)findViewById(R.id.btnAddition);
按钮btnSub=(按钮)findViewById(R.id.btnSubtract);
按钮btnMul=(按钮)findViewById(R.id.btnMultiple);
按钮btnDiv=(按钮)findViewById(R.id.btnDivide);
txtNumber1=(EditText)findViewById(R.id.txtNumber1);
txtNumber2=(EditText)findViewById(R.id.txtNumber2);
txtResult=(EditText)findViewById(R.id.txtResult);
//测试-检查listenerOn()的if条件
// ******************************************************
单击=新建单击(添加操作);
View.OnClickListener-listener=单击.listenerOn(此);
listener=单击.listenerOn(此);
// ******************************************************
btnAdd.setOnClickListener(新建单击(添加.操作).listenerOn(此));
btnSub.setOnClickListener(新建Click(Subtract.OPERATION).listenerOn(this));
setOnClickListener(新建Click(Divide.OPERATION).listenerOn(this));
btnMul.setOnClickListener(新建Click(Multiply.OPERATION).listenerOn(this));
}

如果在调试器中运行代码,从方法退出时,通常会看到指令指针在方法帧末尾跳转。无论如何,条件行得通。关于操作的问题:请发布一些
操作
代码。我建议使用日志轻松查看它是否进入true或false子句。是的,我正在使用调试器,但我记得看到它们跳转到末尾括号,而不是返回语句。无论如何,我会很快更新我的代码。我可能很快会把这个问题改成与行动有关的问题。也许在下个月内hour@laalto我在这里为我的另一个问题创建了一个新问题-
public class Click<T extends Operation> {

    private T operation;

    private View.OnClickListener listener;

    public Click(T operation) {

        this.operation = operation;

    }

    public View.OnClickListener listenerOn(final MainActivity UI) {

        // ******************************************************
        // First pass - goes to false-clause, and returns that new listener
        // Second pass - goes to true-clause, returns the old listener, and then goes to the 
        //               false-clause and returns the listener; however, it skips the creation of 
        //               the new View.OnClickListener. Why??
        // ******************************************************
        if (listener != null) {

            return listener;

        } else {

            listener = new View.OnClickListener() {

                @Override
                public void onClick(View v) {

                    double total, num1, num2;

                    num1 = Double.parseDouble(UI.txtNumber1.getText().toString());
                    num2 = Double.parseDouble(UI.txtNumber2.getText().toString());

                    total = operation.execute(num1, num2);

                    UI.txtResult.setText(Double.toString(total) + " -v5");

                }
            };

            return listener;

        }
    }

}
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button btnAdd = (Button) findViewById(R.id.btnAddition);
    Button btnSub = (Button) findViewById(R.id.btnSubtract);
    Button btnMul = (Button) findViewById(R.id.btnMultiple);
    Button btnDiv = (Button) findViewById(R.id.btnDivide);

    txtNumber1 = (EditText) findViewById(R.id.txtNumber1);
    txtNumber2 = (EditText) findViewById(R.id.txtNumber2);
    txtResult = (EditText) findViewById(R.id.txtResult);

    // Testing - Checks the if-conditional of listenerOn()
    // ******************************************************
    Click click = new Click<>(Add.OPERATION);
    View.OnClickListener listener = click.listenerOn(this);

    listener = click.listenerOn(this);
    // ******************************************************


    btnAdd.setOnClickListener(new Click<>(Add.OPERATION).listenerOn(this));
    btnSub.setOnClickListener(new Click<>(Subtract.OPERATION).listenerOn(this));
    btnDiv.setOnClickListener(new Click<>(Divide.OPERATION).listenerOn(this));
    btnMul.setOnClickListener(new Click<>(Multiply.OPERATION).listenerOn(this));

}