很多时候我们写代码会出现一些奇奇怪怪的bug,常见的就是语法错误和逻辑错误,一般来说,小白容易出现逻辑错误,这个错误没有什么好的办法,就是多敲代码,如果是语法错误,一般编译器会有提示,但有时候一些小的语法错误编译器无法识别,但是却会将程序崩溃,今天我遇到了一个,大家可以看着代码,看能否找到,注意,编译器是没有报错的:
package com.example.startactivity;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class WeightAnswerActivity extends AppCompatActivity {
//2.1 创建好各个变量
TextView tv_resultSex,tv_resultHign,tv_resultWeight,tv_resultWeight2;
Button btn_back2;
//接收数据的变量
String sex,high;
Double weight;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_weight_answer);
//调用函数
initparams();
datadeal();
}
//2.2 初始化变量
private void initparams(){
tv_resultSex=findViewById(R.id.tv_resultSex);
tv_resultHign=findViewById(R.id.tv_resultHign);
tv_resultWeight=findViewById(R.id.tv_resultWeight);
btn_back2=findViewById(R.id.btn_back2);
tv_resultWeight2=findViewById(R.id.tv_resultWeight2);
}
//2.3 收集数据并处理
private void datadeal(){
//3.2 使用bundle的intent接收
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
high = bundle.getString("high");
sex = bundle.getString("sex");
//double high2 = Double.parseDouble(high);
//选择男女判断公式得到结果
if(sex.equals("男")){
weight = (Integer.getInteger(high)-80)*0.7;
}else{
weight = (Integer.getInteger(high)-70)*0.6;
}
Intent intent1 = new Intent();
Bundle resultBundle = new Bundle();
resultBundle.putDouble("weight",weight);
intent1.putExtras(resultBundle);
setResult(2003,intent1);
//2.4 显示到页面
//因为在处理数字类型的数据时需要给一个默认值
tv_resultSex.setText("你的性别为:"+sex);
tv_resultHign.setText("你的身高为:"+high +"cm");
tv_resultWeight.setText("你的体重为:");
tv_resultWeight2.setText(" "+weight +"kg");
}
//5.1 当用户点击时销毁该实例
public void btn_cancle2(View view) {
finish();
}
}
1、看着代码其实好像没有什么问题,但我告诉大家,这段代码是有语法错误的,细心的人会看到我注释了一段内容:
double high2 = Double.parseDouble(high);
那么我们怎么来找这个错误呢?
2、想要找到错误,我们先要发现错误,比如我这里运行程序:
看到我们点击提交的时候,本应该出现的计算结果没有出现,而是直接闪退;
在这之前,一定要清楚自己写的代码的运行环节,如果除了错误就可以大致推测出自己的代码在哪一个环节出了问题
3、我们可以使用debug,也就是调试程序来找到问题,当然看报错可以大致知道是什么问题,
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference
但也只是知道什么问题而已,我们还需要知道程序运行中一些变量值的变化或者是函数的调用情况;
这里是程序报的错,意思就是给了一个空值,程序是在跳转的时候出问题的,那么我们就到跳转的后面的环节查找,也通过点击运行窗口的蓝字也可以定位到那里,
at com.example.startactivity.WeightAnswerActivity.datadeal(WeightAnswerActivity.java:48)
at com.example.startactivity.WeightAnswerActivity.onCreate(WeightAnswerActivity.java:25)
所以我们就到那里打上一个断点:
一般我们在确保没有问题的一行打上断点,然后点击右上角的小虫子进入调试,程序运行到哪里的时候会停止并且在调试窗口会显示所有变量的值变化情况,
4、启动调试运行程序:
这时候手机会提示等待调试的信息,过一会就会进去:
可以看到我们的调试窗口就会有我们设置的变量的数据:
可以看到weiht还是一个null值,我们在下面的语句再打一个断点看看:
点击左下角的绿色向右的箭头执行下一步:
这时候手机已经弹出了界面,调试也退出了,说明我们的weight获取值的时候出了问题,我们查找weight这个值的定义和获取过程,往上翻代码一直到定义的时候,这时候可以推测我们程序崩溃的原因就是weight这个值获取的时候出了问题:
Double weight;
Integer.getInteger(high)
不难发现,我们在进行数据类型转换的时候,将一个integer类型的值给了weight,所以这里除了问题;
4、解决问题,发现问题之后,我们试着将high直接赋值给weight:
可以看到编译器给了我们几个建议,我们选择最后一个,然后修改代码:
运行程序:
好了,完美运行;
大家学会了吗,遇到bug不用慌,先分析是哪一部分出了问题,然后在出问题的一行打上断点,查看各个变量的值,然后就可以知道哪一个出了问题,然后从定义开始找代码,看看是哪里除了问题在修改代码就可以了;