关于如何在LogCat中找问题以及处理问题
我们都说一个厉害的程序员,不是他敲代码敲的多快,敲得有多少,而是他处理问题的能力,就是当你碰到一个问题之后能尽快的解决。
那么我们怎么才能快速的找到我们的错误所在呢。其实在我们学习Java的时候就已经学习过了,异常处理机制就是帮我们找到问题的所在,而且在java中出现问题之后往往会在抛出的异常中有出错代码的行数的,双击之后就可以直接跳转并选择错误的行数。然后我们可以结合异常原因查找自己所写的代码错在哪里(最好是自己查找错误,因为代码是自己写的别人也不知道你写过什么,只能竟尽可能的帮你缩小查找的范围)。
先以Java为例,怎么查找和处理问题:
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
String age = "30d";
int number = Integer.parseInt(age);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("程序结束");
}
}
这是一个关于字符串转换数字所抛出的异常:
程序结束
java.lang.NumberFormatException: For input string: "30d"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at Test.main(Test.java:7)
at java.lang.NumberFormatException.forInputString(Unknown Source)
这是异常名称,其实这些异常都是比较常见的,当我们见得多了就能快速定位哪里出错了,就算不去看出错的代码行数,这里的代码行数也显示出来了at Test.main(Test.java:7),双击就可以直接定位到第七行,即
int number = Integer.parseInt(age);
然后就在往上查找
String age = "30d";
就能马上查找到是这个字符串的值有问题,字符串转换成数字,字符串里面的每个字符必须是数字,当然还有字符个数问题,只要对症下药就能解决问题。
然后就是关于Android里面的LogCat了,其实我们一般使用eclipse开发工具,开发环境其实是和一般的java开发是差不多的,那么问题的处理也应该是差不多的了
就以一个发送短信的Activity为例吧
package com.example.baseadapter;
import android.os.Bundle;
import android.app.Activity;
import android.telephony.SmsManager;
import android.telephony.gsm.SmsMessage;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class SMSActivity extends Activity implements OnClickListener{
private EditText et_content;
private TextView tv_number;
private Button send;
private String SMScontent;
private String number;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.massage_layout);
et_content = (EditText) findViewById(R.id.et_content);
tv_number = (TextView) findViewById(R.id.tv_number);
send = (Button) findViewById(R.id.btn_send);
number = getIntent().getStringExtra("number");
tv_number.setText(number);
SMScontent = et_content.getText().toString().trim();
send.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.sm, menu);
return true;
}
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
SmsManager sm = SmsManager.getDefault();
sm.sendTextMessage(number, null, SMScontent, null, null);
}
}
当我们启动Activity的时候是没有问题的,但是当我编辑完短信内容,然后点击发送的时候这个Activity就停止运行了,到底是什么原因呢?这时候我们就可以去查看我们的LogCat日志文件了
我们会发现这里有一大堆的信息,那么哪个是我们需要的呢?一般来说错误信息都是红色的,而且错误类型都是在前几行的
01-30 21:47:07.718: E/AndroidRuntime(20265): FATAL EXCEPTION: main
01-30 21:47:07.718: E/AndroidRuntime(20265): java.lang.IllegalArgumentException: Invalid message body
01-30 21:47:07.718: E/AndroidRuntime(20265): at android.telephony.SmsManager.sendTextMessage(SmsManager.java:81)
01-30 21:47:07.718: E/AndroidRuntime(20265): at com.example.baseadapter.SMSActivity.onClick(SMSActivity.java:52)
01-30 21:47:07.718: E/AndroidRuntime(20265): at android.view.View.performClick(View.java:4171)
01-30 21:47:07.718: E/AndroidRuntime(20265): at android.view.View$PerformClick.run(View.java:17097)
01-30 21:47:07.718: E/AndroidRuntime(20265): at android.os.Handler.handleCallback(Handler.java:615)
01-30 21:47:07.718: E/AndroidRuntime(20265): at android.os.Handler.dispatchMessage(Handler.java:92)
01-30 21:47:07.718: E/AndroidRuntime(20265): at android.os.Looper.loop(Looper.java:137)
01-30 21:47:07.718: E/AndroidRuntime(20265): at android.app.ActivityThread.main(ActivityThread.java:4914)
01-30 21:47:07.718: E/AndroidRuntime(20265): at java.lang.reflect.Method.invokeNative(Native Method)
01-30 21:47:07.718: E/AndroidRuntime(20265): at java.lang.reflect.Method.invoke(Method.java:511)
01-30 21:47:07.718: E/AndroidRuntime(20265): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:808)
01-30 21:47:07.718: E/AndroidRuntime(20265): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:575)
01-30 21:47:07.718: E/AndroidRuntime(20265): at dalvik.system.NativeStart.main(Native Method)
查看前面这里的第二行的时候就看到IllegalArgumentException此异常表明向方法传递了一个不合法或不正确的参数,这就是错误原因,然后就是查找相应的位置了。
然后我们再往下看几行
01-30 21:47:07.718: E/AndroidRuntime(20265): at android.telephony.SmsManager.sendTextMessage(SmsManager.java:81)
01-30 21:47:07.718: E/AndroidRuntime(20265): at com.example.baseadapter.SMSActivity.onClick(SMSActivity.java:52)
上面的其实是我们出现异常的真正原因,我们填写的参数不符合这个方法的参数要求,由于这个是Android系统的方法,我们也改变不了,所以我们只能再查找我们自己所创建的activity了,接着就看下一个错误代码的行数。仔细看一下我们可以看到错误行数的前面有我们的项目工程名,其实我们看的时候可以根据前面的工程名来筛选不需要的提示。找到错误行数就定位到相应的代码呗,当然你也可以自己去一个个的找(闲的蛋疼)
sm.sendTextMessage(number, null, SMScontent, null, null);
这里的有参数有问题,经过查找我发现这里的SMScontent的内容是null,为什么呢?
原来我们在启动这个activity的时候就已经给它赋值了,而一开始的时候EditText里面是没有数据的,当我们触发点击事件的时候也没有给他重新赋值,所以就有null,参数传递不符合要求的异常了。
然后我们将SMScontent = et_content.getText().toString().trim();挪到onClick方法中之后程序就能发送短信了。
其实查找错误也是一个追根溯源的过程,查找到问题源头就能解决问题。