簡體   English   中英

如何在 Android 上的 Bufferedreader 中修復 NullPointerException?

[英]How to fix NullPointerException in Bufferedreader on Android?

目標:在 Android 上的AsyncTask使用緩沖閱讀器讀取 HTML 文件。

問題:調試日志給出以下錯誤: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference 它在onPostExecute void 處給出錯誤。 在進一步調查中,我發現了以下代碼: TVCode.setText(result); 正在拋出NullPointerException 這意味着result = null 我不知道為什么result = null因為在普通 Java 上使用 Eclipse 的類似代碼工作正常。

更多信息:

安卓工作室:1.3.2

JDK:1.7.0_79-b15 amd64

權限:

<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Gradle: minSdkVersion 15, targetSdkVersion 23, compileSdkVersion 23

這是MainActivity.java的代碼:

public class MainActivity extends AppCompatActivity {


public static String ETURL = null;
public static final String TAG = MainActivity.class.getSimpleName();



    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

        TextView TVCode = (TextView) findViewById(R.id.TVCode);
        ImageButton BTSend = (ImageButton) findViewById(R.id.BTSend);
        final EditText ETURLInput = (EditText) findViewById(R.id.ETUrlInput);

        BTSend.setOnClickListener(new View.OnClickListener() {

                                      public void onClick(View v) {
                                          ETURL = ETURLInput.getText().toString();

                                          new aSync().execute(ETURLInput.getText().toString());


                                      }


                                  }
        );

}

private class aSync extends AsyncTask<String, Void, String> {

    @Override
    protected void onPreExecute() {

    }

    protected String doInBackground(String... ETURL)   {
        String line=null;
        String result="";


            try {
                URL url;

                url = new URL("" + ETURL);
                URLConnection conn = url.openConnection();


                BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                line=br.readLine();
                while (line!= null) {

                    result=result+line;
                    line=br.readLine();
                }

                br.close();

                return result;


            } catch (Exception e) {
               Log.e(TAG, "Error:", e);
            }


        return result;
    }

    protected void onPostExecute(String result)  {
        try {
            TextView TVCode = (TextView) findViewById(R.id.TVCode);
            TVCode.setText(result);
        }
        catch (Exception e){
            Log.e(TAG, "ERROR: ", e);
        }
    }
}

使固定:

TextView必須在onPreExecute方法而不是onPostExecute方法中聲明。 感謝大家的幫助和時間。

問題在於onPostExecute() 在這里,您嘗試使用findViewById() 但是沒有找到視圖。 因此問題。 您需要在活動或膨脹的布局上調用findViewById() 如果是活動,則需要將活動上下文傳遞給異步任務,如果是片段,則可以傳入膨脹視圖。

更多信息: 無法在 AsyncTask 中訪問“findViewById”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM