为什么我在这里得到NullPointerException?

时间:2014-05-29 14:19:06

标签: android

此代码以前工作正常。我没有改变任何东西。因为我已经把我的类作为一个片段并将滑动插入到另一个片段,它不起作用。

如果'

,我会得到例外
    if (checkInput(tvWaybillDate.getText().toString(), etFlightNo.getText().toString(), etLitresObserved.getText().toString(), etTempObserved.getText().toString(), etDensity
                        .getText().toString(), strAirlinesId, strAirportsId, tvBouzer.getText().toString(), strLocationID, tvVCF.getText().toString(), tvLitres.getText().toString(), tvMT
                        .getText().toString(), tvA15.getText().toString()) == 13) {
.............
}

我的字段确实为空或某些""。但我在checkInput中检查它们的值。

checkInput:

private int checkInput(String waybillDate, String flightNo, String litresObserved, String tempObserved, String density, String airlineId, String airportId, String bouzer,
        String locationId, String vcf, String litres, String mt, String a15) {
    int count = 0;
    valueList = new ArrayList<String>();

    if (!waybillDate.equals("")) {
        count++;
    } else {
        valueList.add("Waybill Date");
    }

    if (!flightNo.equals("") && !flightNo.equals("0") && flightNo != null) {
        count++;
    } else {
        valueList.add("Flight No");
    }

    if (!litresObserved.equals("") && !litresObserved.equals("0") && litresObserved != null) {
        count++;
    } else {
        valueList.add("Litres Observed");
    }

    if (!tempObserved.equals("") && !tempObserved.equals("0") && tempObserved != null) {
        count++;
        } else {
            valueList.add("Temp Observed");
        }
    .
    .
    .
    .
    .
    .}

以下是我得到的例外情况:

05-29 17:11:21.063: E/AndroidRuntime(10039): FATAL EXCEPTION: AsyncTask #3
05-29 17:11:21.063: E/AndroidRuntime(10039): java.lang.RuntimeException: An error occured while executing doInBackground()
05-29 17:11:21.063: E/AndroidRuntime(10039):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
05-29 17:11:21.063: E/AndroidRuntime(10039):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
05-29 17:11:21.063: E/AndroidRuntime(10039):    at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
05-29 17:11:21.063: E/AndroidRuntime(10039):    at java.util.concurrent.FutureTask.run(FutureTask.java:239)
05-29 17:11:21.063: E/AndroidRuntime(10039):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
05-29 17:11:21.063: E/AndroidRuntime(10039):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
05-29 17:11:21.063: E/AndroidRuntime(10039):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
05-29 17:11:21.063: E/AndroidRuntime(10039):    at java.lang.Thread.run(Thread.java:838)
05-29 17:11:21.063: E/AndroidRuntime(10039): Caused by: java.lang.NullPointerException
05-29 17:11:21.063: E/AndroidRuntime(10039):    at petrolina.pptaviation.NewWaybillPage1.sendWaybill(NewWaybillPage1.java:468)
05-29 17:11:21.063: E/AndroidRuntime(10039):    at petrolina.pptaviation.NewWaybillPage1.access$28(NewWaybillPage1.java:465)
05-29 17:11:21.063: E/AndroidRuntime(10039):    at petrolina.pptaviation.NewWaybillPage1$AsyncSend.doInBackground(NewWaybillPage1.java:1717)
05-29 17:11:21.063: E/AndroidRuntime(10039):    at petrolina.pptaviation.NewWaybillPage1$AsyncSend.doInBackground(NewWaybillPage1.java:1)
05-29 17:11:21.063: E/AndroidRuntime(10039):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
05-29 17:11:21.063: E/AndroidRuntime(10039):    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
05-29 17:11:21.063: E/AndroidRuntime(10039):    ... 4 more

任何想法都错了吗?

2 个答案:

答案 0 :(得分:0)

在if语句之前是否初始化了像tvWaybillDate这样的视图?

类似的东西:

TextView tvWaybillDate = (TextView) findViewById(R.id.xxx);

其中xxx是布局中的id。

此外,在函数checkInput中,您应检查字符串是否为空,然后再检查它们是否为空。所以,而不是:

if (!waybillDate.equals(""))

你应该写

if(waybillDate!= null&amp;&amp;!waybillDate.equals(“”))

每个字符串

答案 1 :(得分:0)

如果您设置&#34;为什么TextView可能为null?在onCreate()中,您可能会尝试在视图本身实际可见之前设置它们。当您确定在视图中绘制视图时,您需要使用视图。为此,将您的视图集移动到onStart,即:

@Override
public void onStart(){
     super.onStart();
     tvWaybillDate.setText("some text");
     ...
}

这取决于您的活动http://developer.android.com/training/basics/activity-lifecycle/starting.html或片段http://developer.android.com/guide/components/fragments.html

的生命周期

尝试将null作为参数传递是可以的,但是尝试将null转换为对象或基元是错误的来源。您需要将自己的视图或它们包含的文本字符序列传递给您的方法。例如:

 tvWaybillDate.getText().toString(); 
如果tvWaybillDate为null,

将抛出NPE;你不能将null转换为字符串。但是传递

 checkInput(tvWaybillDate, ...

 ...

 public void checkInput(TextView tvWaybillDate, ...){
     int count = 0;
     if(tvWaybillDate != null) count++;
     ...
     return count;
 }

这样做,或类似的事情,例如为你的所有观点传递CharacterSequence tvWaybillDate.getText(),你应该没事。