【问题标题】:How to fix NullPointerException in Bufferedreader on Android?如何修复 Android 上 Bufferedreader 中的 NullPointerException?
【发布时间】:2015-10-19 19:39:33
【问题描述】:

目标: 在 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,工作正常。

更多信息:

Android Studio: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" />

分级: 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 方法中声明。感谢大家的帮助和时间。

【问题讨论】:

  • 请发布 nullPointerException。哪一行?
  • 当你在它的时候......请编辑你的问题以正确缩进。您希望我们花时间帮助您;所以你应该花一些时间以一种立即可读的形式提供你的输入。格式化事项;因为没有它,人们必须花费更多的时间来掌握您的问题的内容!
  • result 的值是多少?不要在onPostExecute() 方法中再次初始化textView。你已经在onCreate()方法中初始化了。
  • 在执行后评论textview的udation,只打印结果检查结果是什么。
  • @PiyushGupta 我在 onPostExecute 中再次声明它的原因是因为 Android Studio 给出了错误:Cannot resolve symbol TVCode

标签: java android nullpointerexception bufferedreader


【解决方案1】:

问题在于onPostExecute()。在这里,您尝试使用findViewById()。但是没有发现。因此问题。您需要在活动或膨胀布局上调用findViewById()。如果是活动,则需要将活动上下文传递给异步任务,如果是片段,则可以传入膨胀视图。

更多信息在这里:Can't access "findViewById" in AsyncTask

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 2019-10-13
    • 1970-01-01
    • 2015-05-16
    相关资源
    最近更新 更多