Java 安卓计算器应用程序在单击操作员时强制关闭';被点击
我是一名应用程序开发新手,目前我偶然发现了一个问题,即每当点击任何操作员时,应用程序都会崩溃。如果我对运算符使用catch异常,则该值将在TextView中显示NaN 任何专业知识或反馈都将不胜感激 下面是来自logcat的错误:Java 安卓计算器应用程序在单击操作员时强制关闭';被点击,java,android,android-studio,Java,Android,Android Studio,我是一名应用程序开发新手,目前我偶然发现了一个问题,即每当点击任何操作员时,应用程序都会崩溃。如果我对运算符使用catch异常,则该值将在TextView中显示NaN 任何专业知识或反馈都将不胜感激 下面是来自logcat的错误: --------- beginning of crash E/AndroidRuntime: FATAL EXCEPTION: main Process: com.math.fundamentalmath, PID: 3619 java.lang.NullPointe
--------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.math.fundamentalmath, PID: 3619
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.widget.TextView.getText()' on a null object reference
at com.math.fundamentalmath.CalculatorFragment.compute(CalculatorFragment.java:62)
at com.math.fundamentalmath.CalculatorFragment.access$000(CalculatorFragment.java:16)
at com.math.fundamentalmath.CalculatorFragment$17.onClick(CalculatorFragment.java:231)
at android.view.View.performClick(View.java:7125)
at android.view.View.performClickInternal(View.java:7102)
at android.view.View.access$3500(View.java:801)
at android.view.View$PerformClick.run(View.java:27336)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
public class CalculatorFragment extends Fragment {
private TextView show,result;
private Button b_square,b_square_root,b_delete,b_reset,b_9,b_8,b_7,b_6,b_5,b_4,b_3,b_2,b_1,b_0,b_dot,b_div,b_mul,b_min,b_plus,b_equal;
private final char ADDITION = '+';
private final char SUBTRACTION = '-';
private final char MULTIPLICATION = '*';
private final char DIVISION = '/';
private final char EQU = '0';
private final char SQR = '²';
private final char SQRT = '√';
private double val1 = Double.NaN;
private double val2;
private char ACTION;
private void compute() {
if (!Double.isNaN(val1)) {
val2 = Double.parseDouble(show.getText().toString());
switch (ACTION){
case ADDITION:
val1 = val1 + val2;
break;
case SUBTRACTION:
val1 = val1 - val2;
break;
case MULTIPLICATION:
val1 = val1 * val2;
break;
case DIVISION:
val1 = val1 / val2;
break;
case SQR:
val1 = Math.pow(val1,2);
break;
case SQRT:
val1 = Math.sqrt(val1);
break;
case EQU:
break;
}
}
else{
val2 = Double.parseDouble(show.getText().toString());
}
}
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_calculator, container, false);
final TextView show = (TextView ) v.findViewById(R.id.show);
final TextView result = (TextView ) v.findViewById(R.id.result);
final Button b_square = (Button) v.findViewById(R.id.b_square);
final Button b_square_root = (Button) v.findViewById(R.id.b_square_root);
final Button b_delete = (Button) v.findViewById(R.id.b_delete);
final Button b_reset = (Button) v.findViewById(R.id.b_reset);
final Button b_9 = (Button) v.findViewById(R.id.b_9);
final Button b_8 = (Button) v.findViewById(R.id.b_8);
final Button b_7 = (Button) v.findViewById(R.id.b_7);
final Button b_6 = (Button) v.findViewById(R.id.b_6);
final Button b_5 = (Button) v.findViewById(R.id.b_5);
final Button b_4 = (Button) v.findViewById(R.id.b_4);
final Button b_3 = (Button) v.findViewById(R.id.b_3);
final Button b_2 = (Button) v.findViewById(R.id.b_2);
final Button b_1 = (Button) v.findViewById(R.id.b_1);
final Button b_0 = (Button) v.findViewById(R.id.b_0);
final Button b_dot = (Button) v.findViewById(R.id.b_dot);
final Button b_div = (Button) v.findViewById(R.id.b_div);
final Button b_mul = (Button) v.findViewById(R.id.b_mul);
final Button b_min = (Button) v.findViewById(R.id.b_min);
final Button b_plus = (Button) v.findViewById(R.id.b_plus);
final Button b_equal = (Button) v.findViewById(R.id.b_equal);
b_square.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
compute();
ACTION = SQR;
result.setText(String.valueOf(val1) + "²");
show.setText(null);
}
});
b_square_root.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
compute();
ACTION = SQRT;
result.setText(String.valueOf(val1) + "√");
show.setText(null);
}
});
b_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(show.getText().length()>0){
CharSequence name = show.getText().toString();
show.setText(name.subSequence(0, name.length()-1));
}
else{
val1 = Double.NaN;
val2 = Double.NaN;
show.setText(null);
result.setText(null);
}
}
});
b_reset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentTransaction fragmentTransaction1 = getFragmentManager().beginTransaction();
fragmentTransaction1.replace(R.id.fragment_container,new CalculatorFragment());
fragmentTransaction1.addToBackStack(null);
fragmentTransaction1.commit();
}
});
b_9.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + "9");
}
});
b_8.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + "8");
}
});
b_7.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + "7");
}
});
b_6.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + "6");
}
});
b_5.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + "5");
}
});
b_4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + "4");
}
});
b_3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + "3");
}
});
b_2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + "2");
}
});
b_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + "1");
}
});
b_0.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + "0");
}
});
b_dot.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + ".");
}
});
b_div.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
compute();
ACTION = DIVISION;
result.setText(String.valueOf(val1) + "/");
show.setText(null);
}
});
b_mul.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
compute();
ACTION = MULTIPLICATION;
result.setText(String.valueOf(val1) + "X");
show.setText(null);
}
});
b_min.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
compute();
ACTION = SUBTRACTION;
result.setText(String.valueOf(val1) + "-");
show.setText(null);
}
});
b_plus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
compute();
ACTION = ADDITION;
result.setText(String.valueOf(val1) + "+");
show.setText(null);
}
});
b_equal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
compute();
ACTION = EQU;
result.setText(result.getText().toString() + String.valueOf(val2) + "=");
show.setText(null);
}
});
return v;
}
}
下面的源代码:
--------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.math.fundamentalmath, PID: 3619
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.widget.TextView.getText()' on a null object reference
at com.math.fundamentalmath.CalculatorFragment.compute(CalculatorFragment.java:62)
at com.math.fundamentalmath.CalculatorFragment.access$000(CalculatorFragment.java:16)
at com.math.fundamentalmath.CalculatorFragment$17.onClick(CalculatorFragment.java:231)
at android.view.View.performClick(View.java:7125)
at android.view.View.performClickInternal(View.java:7102)
at android.view.View.access$3500(View.java:801)
at android.view.View$PerformClick.run(View.java:27336)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
public class CalculatorFragment extends Fragment {
private TextView show,result;
private Button b_square,b_square_root,b_delete,b_reset,b_9,b_8,b_7,b_6,b_5,b_4,b_3,b_2,b_1,b_0,b_dot,b_div,b_mul,b_min,b_plus,b_equal;
private final char ADDITION = '+';
private final char SUBTRACTION = '-';
private final char MULTIPLICATION = '*';
private final char DIVISION = '/';
private final char EQU = '0';
private final char SQR = '²';
private final char SQRT = '√';
private double val1 = Double.NaN;
private double val2;
private char ACTION;
private void compute() {
if (!Double.isNaN(val1)) {
val2 = Double.parseDouble(show.getText().toString());
switch (ACTION){
case ADDITION:
val1 = val1 + val2;
break;
case SUBTRACTION:
val1 = val1 - val2;
break;
case MULTIPLICATION:
val1 = val1 * val2;
break;
case DIVISION:
val1 = val1 / val2;
break;
case SQR:
val1 = Math.pow(val1,2);
break;
case SQRT:
val1 = Math.sqrt(val1);
break;
case EQU:
break;
}
}
else{
val2 = Double.parseDouble(show.getText().toString());
}
}
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_calculator, container, false);
final TextView show = (TextView ) v.findViewById(R.id.show);
final TextView result = (TextView ) v.findViewById(R.id.result);
final Button b_square = (Button) v.findViewById(R.id.b_square);
final Button b_square_root = (Button) v.findViewById(R.id.b_square_root);
final Button b_delete = (Button) v.findViewById(R.id.b_delete);
final Button b_reset = (Button) v.findViewById(R.id.b_reset);
final Button b_9 = (Button) v.findViewById(R.id.b_9);
final Button b_8 = (Button) v.findViewById(R.id.b_8);
final Button b_7 = (Button) v.findViewById(R.id.b_7);
final Button b_6 = (Button) v.findViewById(R.id.b_6);
final Button b_5 = (Button) v.findViewById(R.id.b_5);
final Button b_4 = (Button) v.findViewById(R.id.b_4);
final Button b_3 = (Button) v.findViewById(R.id.b_3);
final Button b_2 = (Button) v.findViewById(R.id.b_2);
final Button b_1 = (Button) v.findViewById(R.id.b_1);
final Button b_0 = (Button) v.findViewById(R.id.b_0);
final Button b_dot = (Button) v.findViewById(R.id.b_dot);
final Button b_div = (Button) v.findViewById(R.id.b_div);
final Button b_mul = (Button) v.findViewById(R.id.b_mul);
final Button b_min = (Button) v.findViewById(R.id.b_min);
final Button b_plus = (Button) v.findViewById(R.id.b_plus);
final Button b_equal = (Button) v.findViewById(R.id.b_equal);
b_square.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
compute();
ACTION = SQR;
result.setText(String.valueOf(val1) + "²");
show.setText(null);
}
});
b_square_root.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
compute();
ACTION = SQRT;
result.setText(String.valueOf(val1) + "√");
show.setText(null);
}
});
b_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(show.getText().length()>0){
CharSequence name = show.getText().toString();
show.setText(name.subSequence(0, name.length()-1));
}
else{
val1 = Double.NaN;
val2 = Double.NaN;
show.setText(null);
result.setText(null);
}
}
});
b_reset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentTransaction fragmentTransaction1 = getFragmentManager().beginTransaction();
fragmentTransaction1.replace(R.id.fragment_container,new CalculatorFragment());
fragmentTransaction1.addToBackStack(null);
fragmentTransaction1.commit();
}
});
b_9.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + "9");
}
});
b_8.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + "8");
}
});
b_7.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + "7");
}
});
b_6.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + "6");
}
});
b_5.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + "5");
}
});
b_4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + "4");
}
});
b_3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + "3");
}
});
b_2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + "2");
}
});
b_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + "1");
}
});
b_0.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + "0");
}
});
b_dot.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText(show.getText().toString() + ".");
}
});
b_div.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
compute();
ACTION = DIVISION;
result.setText(String.valueOf(val1) + "/");
show.setText(null);
}
});
b_mul.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
compute();
ACTION = MULTIPLICATION;
result.setText(String.valueOf(val1) + "X");
show.setText(null);
}
});
b_min.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
compute();
ACTION = SUBTRACTION;
result.setText(String.valueOf(val1) + "-");
show.setText(null);
}
});
b_plus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
compute();
ACTION = ADDITION;
result.setText(String.valueOf(val1) + "+");
show.setText(null);
}
});
b_equal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
compute();
ACTION = EQU;
result.setText(result.getText().toString() + String.valueOf(val2) + "=");
show.setText(null);
}
});
return v;
}
}
您在类的开头定义所有视图,然后从不分配它们。您正在
onCreateView
中创建全新的视图,但试图在compute()
中访问它们compute()
无权访问这些,它只能访问(未分配的)类级别的
您应该设置一个值,而不是重新定义show
。因此,替换final TextView show=(TextView)v.findViewById(R.id.show)代码>与show=(TextView)v.findViewById(R.id.show)代码>
我不打算对整个代码做太多评论,但您可能需要深入研究。此外,考虑是否可以编写相同的代码<强>曾经< /强>,而不是用一个字符更改了10次。p> 您使用调试器发现了什么?