写了一个计算器,写了一部分Mainactivity代码,然后模拟机调试 点击按钮后闪退了,这是为啥啊?没搜到相关的解决办法,有人说是逻辑错误but代码没报红出错🧐好懵啊
MainActivity.java代码如下:
package com.example.calculatortest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
//显示计算过程及结果
private EditText et_show;
//各个按钮
private Button one,two,three,four,five,six,seven,eight,nine,zero,
clear,backspace,add,sub,mul,div,point,equal,percent,sqrt;
//输入的第一个数和第二个数
double num1= 0 ,num2= 0;
//计算结果
double result = 0;
//用来判断是哪一种运算
public int flag=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText et_show=(EditText)findViewById(R.id.et_show);
//数字0~9
Button zero=(Button)findViewById(R.id.zero);
Button one=(Button)findViewById(R.id.one);
Button two=(Button)findViewById(R.id.two);
Button three=(Button)findViewById(R.id.three);
Button four=(Button)findViewById(R.id.four);
Button five=(Button)findViewById(R.id.five);
Button six=(Button)findViewById(R.id.six);
Button seven=(Button)findViewById(R.id.seven);
Button eight=(Button)findViewById(R.id.eight);
Button nine=(Button)findViewById(R.id.nine);
//清空&退格
Button clear=(Button)findViewById(R.id.clear);
Button backspace=(Button)findViewById(R.id.bksp);
//运算符
Button add=(Button)findViewById(R.id.add);
Button sub=(Button)findViewById(R.id.sub);
Button mul=(Button)findViewById(R.id.mul);
Button div=(Button)findViewById(R.id.div);
Button point=(Button)findViewById(R.id.point);
Button equal=(Button)findViewById(R.id.equal);
Button percent=(Button)findViewById(R.id.percent);
Button sqrt=(Button)findViewById(R.id.sqrt);
//设置监听事件,为所有按钮设置同一个监听器
zero.setOnClickListener(new ButtonListener());
one.setOnClickListener(new ButtonListener());
two.setOnClickListener(new ButtonListener());
three.setOnClickListener(new ButtonListener());
four.setOnClickListener(new ButtonListener());
five.setOnClickListener(new ButtonListener());
six.setOnClickListener(new ButtonListener());
seven.setOnClickListener(new ButtonListener());
eight.setOnClickListener(new ButtonListener());
nine.setOnClickListener(new ButtonListener());
clear.setOnClickListener(new ButtonListener());
backspace.setOnClickListener(new ButtonListener());
add.setOnClickListener(new ButtonListener());
sub.setOnClickListener(new ButtonListener());
mul.setOnClickListener(new ButtonListener());
div.setOnClickListener(new ButtonListener());
equal.setOnClickListener(new ButtonListener());
percent.setOnClickListener(new ButtonListener());
sqrt.setOnClickListener(new ButtonListener());
}
class ButtonListener implements View.OnClickListener{
public void onClick(View v){
//用switch()方法判断点击的按钮id
switch(v.getId()){
case R.id.clear:
et_show.setText(null);
break;
case R.id.zero:
String str0 = et_show.getText().toString();
str0+="0";
et_show.setText(str0);
case R.id.one:
String str1 = et_show.getText().toString();
str1+="1";
et_show.setText(str1);
case R.id.two:
String str2 = et_show.getText().toString();
str2+="2";
et_show.setText(str2);
case R.id.three:
String str3 = et_show.getText().toString();
str3+="3";
et_show.setText(str3);
case R.id.four:
String str4 = et_show.getText().toString();
str4+="4";
et_show.setText(str4);
case R.id.five:
String str5 = et_show.getText().toString();
str5+="5";
et_show.setText(str5);
case R.id.six:
String str6 = et_show.getText().toString();
str6+="6";
et_show.setText(str6);
case R.id.seven:
String str7 = et_show.getText().toString();
str7+="7";
et_show.setText(str7);
case R.id.eight:
String str8 = et_show.getText().toString();
str8+="8";
et_show.setText(str8);
case R.id.nine:
String str9 = et_show.getText().toString();
str9+="9";
et_show.setText(str9);
case R.id.point:
String str_point = et_show.getText().toString();
str_point+=".";
et_show.setText(str_point);
case R.id.add:
String str_add = et_show.getText().toString();
if(str_add.equals(null)){
return;
}
num1 = Double.valueOf(str_add);
et_show.setText(null);
flag = 1;
break;
case R.id.sub:
String str_sub = et_show.getText().toString();
if(str_sub.equals(null)){
return;
}
num1 = Double.valueOf(str_sub);
et_show.setText(null);
flag = 2;
break;
case R.id.mul:
String str_mul = et_show.getText().toString();
if(str_mul.equals(null)){
return;
}
num1 = Double.valueOf(str_mul);
et_show.setText(null);
flag = 3;
break;
case R.id.div:
String str_div = et_show.getText().toString();
if(str_div.equals(null)){
return;
}
num1 = Double.valueOf(str_div);
et_show.setText(null);
flag = 4;
break;
case R.id.equal:
String str_equal = et_show.getText().toString();
num2 = Double.valueOf(str_equal);
et_show.setText(null);
switch (flag){
case 1:
result = num1+num2;
et_show.setText(String.valueOf(num1)+"+"+String.valueOf(num2)+"="+String.valueOf(result));
break;
case 2:
result = num1-num2;
et_show.setText(String.valueOf(num1)+"-"+String.valueOf(num2)+"="+String.valueOf(result));
break;
case 3:
result = num1*num2;
et_show.setText(String.valueOf(num1)+"×"+String.valueOf(num2)+"="+String.valueOf(result));
break;
case 4:
if(num2==0){
et_show.setText("被除数不能为0!");
}else{
result = num1/num2;
et_show.setText(String.valueOf(num1)+"÷"+String.valueOf(num2)+"="+String.valueOf(result));
}
break;
default:
result = 0;
break;
}
}
}
}
}
activity_main.xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/et_show"
android:layout_width="match_parent"
android:layout_height="250dp"
android:textSize="40sp"
android:enabled="false"/>
<GridLayout
android:layout_width="330dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:columnCount="4"
android:rowCount="5"
android:layout_marginTop="15dp">
<Button
android:id="@+id/add"
android:background="@drawable/btn_shape"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:textSize="25sp"
android:text="+"
android:textColor="#000000"/>
<Button
android:id="@+id/sub"
android:background="@drawable/btn_shape"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginRight="10dp"
android:textSize="25sp"
android:text="-"
android:textColor="#000000"/>
<Button
android:id="@+id/mul"
android:background="@drawable/btn_shape"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginRight="10dp"
android:textSize="25sp"
android:text="×"
android:textColor="#000000"/>
<Button
android:id="@+id/div"
android:background="@drawable/btn_shape"
android:layout_width="72dp"
android:layout_height="72dp"
android:textSize="25sp"
android:text="÷"
android:textColor="#000000"/>
<Button
android:id="@+id/seven"
android:background="@drawable/btn_shape"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="8dp"
android:textSize="25sp"
android:text="7"
android:textColor="#000000"/>
<Button
android:id="@+id/eight"
android:background="@drawable/btn_shape"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginRight="10dp"
android:layout_marginTop="8dp"
android:textSize="25sp"
android:text="8"
android:textColor="#000000"/>
<Button
android:id="@+id/nine"
android:background="@drawable/btn_shape"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginRight="10dp"
android:layout_marginTop="8dp"
android:textSize="25sp"
android:text="9"
android:textColor="#000000"/>
<Button
android:id="@+id/clear"
android:background="@drawable/btn_shape"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginTop="8dp"
android:textSize="25sp"
android:text="C"
android:textColor="#000000"/>
<Button
android:id="@+id/four"
android:background="@drawable/btn_shape"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="8dp"
android:textSize="25sp"
android:text="4"
android:textColor="#000000"/>
<Button
android:id="@+id/five"
android:background="@drawable/btn_shape"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginRight="10dp"
android:layout_marginTop="8dp"
android:textSize="25sp"
android:text="5"
android:textColor="#000000"/>
<Button
android:id="@+id/six"
android:background="@drawable/btn_shape"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginRight="10dp"
android:layout_marginTop="8dp"
android:textSize="25sp"
android:text="6"
android:textColor="#000000"/>
<Button
android:id="@+id/bksp"
android:background="@drawable/btn_shape"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginTop="8dp"
android:textSize="25sp"
android:text="bksp"
android:textColor="#000000"/>
<Button
android:id="@+id/one"
android:background="@drawable/btn_shape"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="8dp"
android:textSize="25sp"
android:text="1"
android:textColor="#000000"/>
<Button
android:id="@+id/two"
android:background="@drawable/btn_shape"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginRight="10dp"
android:layout_marginTop="8dp"
android:textSize="25sp"
android:text="2"
android:textColor="#000000"/>
<Button
android:id="@+id/three"
android:background="@drawable/btn_shape"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginRight="10dp"
android:layout_marginTop="8dp"
android:textSize="25sp"
android:text="3"
android:textColor="#000000"/>
<Button
android:id="@+id/percent"
android:background="@drawable/btn_shape"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginTop="8dp"
android:textSize="25sp"
android:text="%"
android:textColor="#000000"/>
<Button
android:id="@+id/sqrt"
android:background="@drawable/btn_shape"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="8dp"
android:textSize="25sp"
android:text="√"
android:textColor="#000000"/>
<Button
android:id="@+id/zero"
android:background="@drawable/btn_shape"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginRight="10dp"
android:layout_marginTop="8dp"
android:textSize="25sp"
android:text="0"
android:textColor="#000000"/>
<Button
android:id="@+id/point"
android:background="@drawable/btn_shape"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginRight="10dp"
android:layout_marginTop="8dp"
android:textSize="25sp"
android:text="."
android:textColor="#000000"/>
<Button
android:id="@+id/equal"
android:background="@drawable/btn_shape"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginTop="8dp"
android:textSize="25sp"
android:text="="
android:textColor="#000000"/>
</GridLayout>
</LinearLayout>
模拟器运行效果图:
(用转换软件转换了下gif,有水印别介意)
首先闪退肯定是报错了,提问请把日志发出来。光说闪退,怎么解决问题,日志都没有我不明白你是怎么百度的。
然后你这个一看就知道是空指针错误了,你定义一个全局变量et_show,又定义一个局部变量et_show,只初始化了局部变量et_show。
点击事件中使用的是全局et_show,肯定会报错。建议巩固下java基础。
题主代码写的很漂亮,但是效率低。
让所有click事件公用一个click事件处理函数想法没问题。写法有问题。 按照题主写的每个onclick 事件都会持有一个包含所有click处理逻辑的函数体。明显是冗余。
zero.setOnClickListener(this);
one.setOnClickListener(this);
two.setOnClickListener(this);
...
...
上面这样更合理。
点击报错原因。和一楼解答一致。