Java 如何排除NullPointerException故障?

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

下面的程序抛出一个NullPointerException。在日志cat中,它显示:

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);