【发布时间】:2012-04-21 13:40:26
【问题描述】:
我有一个带有 ImageView 的 Activity,如果它是空的并被单击,则应该从 Internet 加载图像并将其保存到内部存储中。所以活动看起来像这样:
public class PlaceCreate extends Activity {
Context context;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.create);
context = this;
ImageView img = (ImageView) findViewById(R.id.imageView);
img.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
EditText edit = (EditText)findViewById(R.id.editTextName);
Download(edit.getText().toString());
}
});
}
private boolean Download(String Name)
{
try
{
URL u = new URL("http://example.com/img.png");
HttpURLConnection c = (HttpURLConnection)u.openConnection();
c.setRequestMethod("GET");
c.setDoOutput(true);
c.connect();
FileOutputStream f = context.openFileOutput(Name, Context.MODE_PRIVATE);
InputStream in = c.getInputStream();
byte[] buffer = new byte[1024];
int len1 = 0;
while((len1 = in.read(buffer)) > 0 )
{
f.write(buffer, 0, len1);
}
f.close();
FileInputStream is = openFileInput(Name);
Bitmap bitmap = BitmapFactory.decodeStream(is);
is.close();
ImageView img = (ImageView) findViewById(R.id.imageViewPlan);
img.setImageBitmap(bitmap);
}
catch(IOException e)
{
return false;
}
return true;
}}
问题是我得到 NullPointerException 与openFileOutput 一致。我发现了几个类似的问题,但所有答案都暗示null 是一个缺失的上下文。由于在这种情况下它是一个活动,它显然有一个上下文(this),并且它不为空。我试图通过context 成员调用openFileOutput(隐含this)。任何一种方法都失败了。此外,我尝试将 v.getContext() 从 onClick 传递到 Download 作为附加参数,并且该值不为空,但也产生了相同的异常。 (如果很重要,请求的文件名是有效的文件名,例如“abc”。)
有人能解释一下吗?
这是堆栈的示例:
04-22 00:45:10.659: W/dalvikvm(330): threadid=1: thread exiting with uncaught exception (group=0x40015560)
04-22 00:45:10.909: E/AndroidRuntime(330): FATAL EXCEPTION: main
04-22 00:45:10.909: E/AndroidRuntime(330): java.lang.NullPointerException
04-22 00:45:10.909: E/AndroidRuntime(330): at android.app.ContextImpl.openFileOutput(ContextImpl.java:420)
04-22 00:45:10.909: E/AndroidRuntime(330): at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:158)
04-22 00:45:10.909: E/AndroidRuntime(330): at com.example.scanner.PlaceCreate.Download(PlaceCreate.java:93)
04-22 00:45:10.909: E/AndroidRuntime(330): at com.example.scanner.PlaceCreate.access$0(PlaceCreate.java:84)
04-22 00:45:10.909: E/AndroidRuntime(330): at com.example.scanner.PlaceCreate$3.onClick(PlaceCreate.java:67)
04-22 00:45:10.909: E/AndroidRuntime(330): at android.view.View.performClick(View.java:2485)
04-22 00:45:10.909: E/AndroidRuntime(330): at android.view.View$PerformClick.run(View.java:9080)
04-22 00:45:10.909: E/AndroidRuntime(330): at android.os.Handler.handleCallback(Handler.java:587)
04-22 00:45:10.909: E/AndroidRuntime(330): at android.os.Handler.dispatchMessage(Handler.java:92)
04-22 00:45:10.909: E/AndroidRuntime(330): at android.os.Looper.loop(Looper.java:123)
04-22 00:45:10.909: E/AndroidRuntime(330): at android.app.ActivityThread.main(ActivityThread.java:3683)
04-22 00:45:10.909: E/AndroidRuntime(330): at java.lang.reflect.Method.invokeNative(Native Method)
04-22 00:45:10.909: E/AndroidRuntime(330): at java.lang.reflect.Method.invoke(Method.java:507)
04-22 00:45:10.909: E/AndroidRuntime(330): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-22 00:45:10.909: E/AndroidRuntime(330): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-22 00:45:10.909: E/AndroidRuntime(330): at dalvik.system.NativeStart.main(Native Method)
还有一些发现。根据堆栈,错误发生在ContextImpl 文件中,我看到parent 局部变量在此方法中为空。代码如下:
public FileOutputStream openFileOutput(String name, int mode)
throws FileNotFoundException {
final boolean append = (mode&MODE_APPEND) != 0;
File f = makeFilename(getFilesDir(), name);
try {
FileOutputStream fos = new FileOutputStream(f, append);
setFilePermissionsFromMode(f.getPath(), mode, 0);
return fos;
} catch (FileNotFoundException e) {
}
File parent = f.getParentFile();
parent.mkdir();
FileUtils.setPermissions(
parent.getPath(),
FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
-1, -1);
FileOutputStream fos = new FileOutputStream(f, append);
setFilePermissionsFromMode(f.getPath(), mode, 0);
return fos;
}
所以现在的问题是如何确保对 f.getParentFile() 的调用不会返回 null,为什么它有时会起作用?
【问题讨论】:
-
当您说...名称是一个有效的文件名,例如“abc”时,这是您尝试过的实际文件名吗?
-
请提供完整的堆栈跟踪。
-
@MisterSquonk:是的,我也试过'abc'。这个名字有什么问题?
-
@CommonsWare:奇怪,但重启后我无法得到异常,代码可以工作。很抱歉提出一个问题,这在代码中似乎没有根据。
-
@CommonsWare:嗯,又回来了,这是堆栈:
标签: android nullpointerexception