Java 如何排除NullPointerException故障?
下面的程序抛出一个NullPointerException。在日志cat中,它显示:Java 如何排除NullPointerException故障?,java,android,nullpointerexception,Java,Android,Nullpointerexception,下面的程序抛出一个NullPointerException。在日志cat中,它显示: 01-09 20:40:34.366: D/RemoteIt(2809): java.lang.NullPointerException 单击按钮时,它不会转到Mousefragment类。我试图解决它,但我不能-如何解决这个问题 public class connect extends ListActivity implements OnClickListener{ WifiApManager wifi
01-09 20:40:34.366: D/RemoteIt(2809): java.lang.NullPointerException
单击按钮时,它不会转到Mousefragment类。我试图解决它,但我不能-如何解决这个问题
public class connect extends ListActivity implements OnClickListener{
WifiApManager wifiApManager;
TextView tv;
Button ipscan,con;
ListView lv;
EditText tbIp;
private static final String TAG = "RemoteIt";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.connect);
tv =(TextView) findViewById(R.id.iptv);
ipscan=(Button) findViewById(R.id.scan);
con=(Button) findViewById(R.id.connect);
tbIp=(EditText) findViewById(R.id.etIp);
ipscan.setOnClickListener(this);
con.setOnClickListener(this);
lv = getListView();
}
class scan extends AsyncTask<Void, Void, ArrayList<ClientScanResult>>{
public Context context;
public scan(Context c) // constructor to take Context
{
context = c; // Initialize your Context variable
}
protected ArrayList<ClientScanResult> doInBackground(Void... params) {
wifiApManager = new WifiApManager(context); // use the variable here
return wifiApManager.getClientList(false);
}
protected void onPostExecute(ArrayList<ClientScanResult> clients){
CustomArrayAdapter cus = new CustomArrayAdapter(connect.this,clients);
lv.setAdapter(cus);
}
}
@Override
public void onClick(View v) {
// TODO Click Action...
if(v == ipscan){
scan myScan = new scan(this); // pass the context to the constructor
myScan.execute();
}
if(v == con){
onConnectButton();
}
}
private void onConnectButton() {
// TODO When Btn s Clicked...
String ip = this.tbIp.getText().toString();
if (ip.matches("^[0-9]{1,4}\\.[0-9]{1,4}\\.[0-9]{1,4}\\.[0-9]{1,4}$")) {
try {
Settings.setIp(ip);
Intent intent = new Intent(connect.this,MouseFragment.class);
connect.this.startActivity(intent);
//Intent i = new Intent(this, MouseFragment.class);
//this.startActivity(i);
this.finish();
} catch (Exception ex) {
Toast.makeText(this, this.getResources().getText(R.string.invalid_ip), Toast.LENGTH_LONG).show(); **//this toast is displayed**
Log.d(TAG, ex.toString());
}
} else {
//this.tvError.setText("Invalid IP address");
//this.tvError.setVisibility(View.VISIBLE);
Toast.makeText(this, this.getResources().getText(R.string.in_valid), Toast.LENGTH_LONG).show();
}
};
/** OS kills process */
public void onDestroy() {
super.onDestroy();
}
/** App starts anything it needs to start */
public void onStart() {
super.onStart();
}
/** App kills anything it started */
public void onStop() {
super.onStop();
}
}
单击按钮多少次会显示异常,并显示无效的ip toast消息如前所述,您的问题询问如何对此进行故障排除 您需要找出抛出异常的行上的null值。要做到这一点,您需要查看堆栈跟踪,看看是哪一行导致了问题。然后,您可以使用调试器或一张纸和一支铅笔逐步完成您的程序,或者只添加print语句来确定哪个变量为null
当您知道哪个变量为null时,您可以追溯到整个程序,找出它为null的原因。当您知道它为什么为空时,您可以修复您的问题。关键问题是您在catch子句中做了什么。只需将Log.d更改为exception.printStackTraceprintStackTrace,这将为您提供有关导致问题的行的更多信息。首先,故障排除异常称为调试。其次,有几种调试方法 1. 对于启动,您应该找出导致异常的行。可以通过查看堆栈跟踪的最顶行来完成此操作。如果这不是对您编写的代码的引用,请检查下一行,然后检查下一行,等等,直到找到您编写的代码。如果找不到这样的行,请跳到步骤3 2. 找到该行后,在该行之前添加几个print语句以打印当前变量。例如:
Log.d("DEBUG", "myVariable = " + myVariable == null ? "null" : myVariable);
然后运行它并检查输出
3.
最后一步是使用。如果知道代码中断的行,请通过左键单击行号添加断点。如果没有,只需在onCreate的第一行添加断点。上面的链接详细介绍了如何使用此功能
还要记住,Android附带了许多调试工具。您可以阅读它们。还请指出代码中哪一行引发了异常。扫描应以大写字母开头为什么v==ipscan,为什么不直接用getid切换大小写。添加日志文件并检查值为null的位置。我认为你的ip没有价值..发布了StackTraceGraat方法的答案。这就是问题所在:-调试以查找空值,然后查找导致空值的原因:一liner@NarendraPathai当然,但是很多新手不知道调试意味着什么。在一个完美的世界里,他们会去查阅,但在这个世界里,他们通常会忽略这些建议。向他们展示这是多么容易可以走很长的路+一个好答案。我只是开玩笑说了句俏皮话:但我同意你说的话。
Log.d("DEBUG", "myVariable = " + myVariable == null ? "null" : myVariable);