Android Java开发中endsWith()方法失效问题求助
问题分析与解决办法
嘿,我一眼就瞅出你遇到的问题根源了!你在BtnEqual的逻辑里犯了一个小语法错误,导致不管输入字符串末尾是不是操作符,都会执行删除最后一个字符的操作。
问题所在
看你这段代码:
case R.id.BtnEqual: if(Tv.getText().toString().endsWith("+") || Tv.getText().toString().endsWith("-") || Tv.getText().toString().endsWith("*") || Tv.getText().toString().endsWith("/")); { Tv.setText(Tv.getText().toString().substring(0, (Tv.getText().toString().length()-1))); //Removing last operator } break;
注意到if(...)后面的那个分号了吗?这个分号会让if语句的逻辑体变成空语句,后面的大括号代码就变成了无条件执行的独立代码块。也就是说,不管if的条件是否成立,删除最后一个字符的操作都会跑一遍,这就解释了为什么不管末尾是不是操作符都会删字符。
修正后的代码
只需要把那个多余的分号删掉就行,同时我们可以优化一下代码,把字符串先存起来,避免重复调用Tv.getText().toString():
case R.id.BtnEqual: String currentText = Tv.getText().toString(); if(currentText.endsWith("+") || currentText.endsWith("-") || currentText.endsWith("*") || currentText.endsWith("/")) { Tv.setText(currentText.substring(0, currentText.length() - 1)); } // 这里可以后续添加运算逻辑 break;
额外优化建议
你代码里判断是否以操作符结尾的逻辑重复出现了好多次(在各个操作符按钮的点击事件里),可以把这个逻辑抽成一个单独的方法,让代码更简洁易维护:
private boolean endsWithOperator(String text) { return text.endsWith("+") || text.endsWith("-") || text.endsWith("*") || text.endsWith("/"); }
这样不管是在操作符按钮还是等于按钮里,都可以直接调用这个方法:
// 比如在BtnAdd里: if(endsWithOperator(Disp)) { Toast.makeText(this, "+ not allowed at this point!", Toast.LENGTH_SHORT).show(); } else { Tv.append("+"); } // 在BtnEqual里: String currentText = Tv.getText().toString(); if(endsWithOperator(currentText)) { Tv.setText(currentText.substring(0, currentText.length() - 1)); }
这样修改后,你的逻辑就会正常工作:只有当末尾是操作符时,才会删除最后一个字符,否则不会执行这个操作,接下来你就可以放心地添加运算逻辑啦。
内容的提问来源于stack exchange,提问作者Anirban
相关产品推荐
相关产品推荐

