如何在 Android 上修复 Bufferedreader 中的 NullPointerException?
How to fix NullPointerException in Bufferedreader on Android?
目标:
在 Android.
上的 AsyncTask
中使用缓冲 reader 读取 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、using Eclipse[ 上的类似代码=53=],工作正常。
更多信息:
Android 工作室: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()
。但是找不到风景。因此问题。您需要在 activity 或膨胀布局上调用 findViewById()
。如果是 activity,则需要将 activity 上下文传递给异步任务,如果是片段,则可以传递膨胀视图。
更多信息在这里:Can't access "findViewById" in AsyncTask
目标: 在 Android.
上的AsyncTask
中使用缓冲 reader 读取 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、using Eclipse[ 上的类似代码=53=],工作正常。
更多信息:
Android 工作室: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()
。但是找不到风景。因此问题。您需要在 activity 或膨胀布局上调用 findViewById()
。如果是 activity,则需要将 activity 上下文传递给异步任务,如果是片段,则可以传递膨胀视图。
更多信息在这里:Can't access "findViewById" in AsyncTask