当前位置: 首页 > 知识库问答 >
问题:

Android - Bitmap.CreateBitmap - 空指针异常

后化
2023-03-14

有时,当我试图创建模糊位图时,我会遇到“空指针异常”。

发生在这段代码中(我最近开始捕获异常,因此至少它不会使应用程序崩溃):

try
{
    using (Bitmap.Config config = Bitmap.Config.Rgb565) {
        return Bitmap.CreateBitmap (blurredBitmap, width, height, config);
    }
}
catch (Java.Lang.Exception exception)
{
    Util.Log(exception.ToString());
}

请参考这些图片以获得更多关于我传递给“CreateBitmap”方法的参数的细节:

以下是扩展的参数:

完全异常:

异常{Java。Lang.NullPointerException:类型为“Java”的异常。引发了“Lang.NullPointerException”。at系统。/Users/builder/data/lanes/2058/58099 c53/source/mono/MCS/class/corlib/System中的runtime . exceptiondispatchinfo . throw()[0x 0000 b]。Android系统的Runtime.ExceptionServices/ExceptionDispatchInfo.cs:61。runtime . jnienv . callstaticobjectmethod(IntPtr jclass,IntPtr jmethod,Android。/Users/builder/data/lanes/2058/58099 c53/source/Mono droid/src/Mono中的Runtime.JValue* parms) [0x00064]。Android/src/Runtime/jnienv . g . cs:1301 at Android。graphics . bitmap . create bitmap(System。Int32[]颜色,Int32宽度,Int32高度,Android。graphics . Config Config)[0x 00088]在/Users/builder/data/lanes/2058/58099 c53/source/Mono droid/src/Mono中。Android/平台/Android-22/src/generated/Android。Psonar上的Graphics.Bitmap.cs:735。apps . droid . payperplay . stack blur . getblurredbitmap(Android。d:\Dev\psonar\Source\Psonar中的Graphics.Bitmap original,Int32 radius) [0x00375]。应用程序\Psonar。Apps.Droid\Psonar。apps . droid . payperplay \ Utilities \ stack blur . cs:123-托管异常堆栈跟踪结束-Java . lang . nullpointerexception at Android . graphics . bitmap . create bitmap(bitmap . Java:687)at Android . graphics . bitmap . create bitmap(bitmap . Java:707)at dal vik . system . Native start . run(Native Method)} Java。Lang.NullPointerException

不确定这是否可能是 Xamarin 中的错误或传递的参数错误。

共有1个答案

宗政唯
2023-03-14

我收到了Xamarin团队成员之一Jonathan Pryor的回复:

NullPointerException来自Java代码:

android.graphics.Bitmap.create位图(Bitmap.java:687)android.graphics.Bitmap.create位图(Bitmap.java:707)dalvik.system.NativeStart.run(本机法)

快速查看各种版本,Jelly Bean可能适合:

https://github . com/Android/platform _ frameworks _ base/blob/JB-release/graphics/Java/Android/graphics/bitmap . Java # L687

    return nativeCreate(colors, offset, stride, width, height,
                        config.nativeInt, false);

快速浏览一下周围的方法主体显示,配置未检查空性,因此如果传递 null,这将导致 NullPointerException。

然而,问题是您没有传递null:

using (Bitmap.Config config = Bitmap.Config.Rgb565) {
    return Bitmap.CreateBitmap (blurredBitmap, width, height, config);
}

...还是你?

我建议您使用块删除

return Bitmap.CreateBitmap (blurredBitmap, width, height,
        Bitmap.Config.Rgb565);

以下是我认为可能发生的事情,但首先,题外话:

在Xamarin.Android的核心深处,Java对象与其相应的C#包装器对象之间存在映射。构造函数调用,Java.Lang.Object.GetObject()等将创建映射;Java.lang.Object.Dispose() 将删除映射。

其中的核心部分是对象标识:当Java实例暴露给C#代码并创建了C#包装器时,应继续为该Java实例重用相同的C#包装器实例。

一个隐含的结果是,任何实例实际上都是全局的,因为如果多个代码路径/线程/等等。获得同一个Java实例的JNI句柄,他们将获得相同的C#包装器。

这让我们回到了我的假设和你的代码块:Bitmap.Config是一个Java枚举,这意味着每个成员都是一个Java对象。此外,它们是全局值,因此每个线程都可以访问这些成员,这意味着 C# Bitmap.Config.Rgb565 实例实际上是一个全局变量

您正在处理的全局变量。

这是“很好”,因为下次访问Bitmap. Config. Rgb565时,将创建一个新的包装器。

然而,问题是如果您有多个线程同时访问Bitmap. Config. Rgb565,每个线程都试图处理一个实例。此时,两个线程可能引用相同的包装器实例是完全合理的,因此来自一个线程的Dispse()将使另一个线程使用的实例无效。

这将导致<code>null</code>被传递到位图。createBitmap()调用,这正是您所观察到的。

请尝试使用块删除,看看这是否有帮助。

整个线程都可以在这里访问。

然后我问:

乔纳森·普赖尔为这个建议欢呼。我的问题是,如果我删除using语句,它会导致内存泄漏吗?意思是如果我停止处理新的配置实例?

他回答道:

这就是GC的作用!

(此处插入咳嗽和笑声。)

我们可以狡辩很多。我会争辩说这不是内存泄漏,因为内存根深蒂固且众所周知;不断访问 Bitmap.Config.Rgb565 将返回之前创建的实例,而不是不断创建新实例。因此,没有“泄漏”。

相反,我会辩称,该实例和潜在的GREF是一种“税收”;这是“烧掉”的,是做生意的成本的一部分。虽然将这些成本降到最低“很好”,但移除所有这些成本是不现实的(例如,我们通过.class_ref“丢失”了每个类的GREF,它用于查找方法ID…),至少在当前架构中是不可行的。

(我也想不出会导致不同成本/“税收”的替代架构。虽然我确实有一些关于允许某些领域改进的想法,但它们并不大。)

我建议不要太担心Bitmap.Config.Rgb565和类似的成员,除非/直到分析器或GREF计数显示其他情况。

 类似资料:
  • 08-0712:11:44.453:I/Choreographer(1257):跳过126帧! 应用程序可能在主线程上做了太多工作。08-07 12:11:46.313:I/Choreographer(1257):跳过了131帧! 应用程序可能在主线程上做了太多工作。08-07 12:11:48.033:I/Choreographer(1257):跳过了33个帧! 应用程序可能在主线程上做了太多的

  • 问题内容: 有可能这可能是一个双重问题。我将String变量初始化为null。我可能会或可能不会使用一个值更新它。现在我想检查此变量是否不等于null以及我尝试执行的操作是否会得到null指针异常。空指针异常,因为它代价高昂。是否有任何有效的解决方法.TIA 问题答案: 如果您使用 你 不会 得到。 我怀疑你在做什么: 这是因为null 而引发,而不是因为null。 如果仍然无法解释,请发布您用于

  • 我已经更新了我的项目中的一些依赖关系之后,我的Hibernate配置类显示Nullpointerx的。 我将SpringDataJPA存储库与hibernate一起使用,已经超过24小时了,仍然没有找到任何关于小问题的适当解决方案。 我已经尝试过的一些解决方案:- 使用@bean(name=“entityManagerFactory”)提供bean名称 我面临的问题 波姆。xml文件 配置类 db

  • 我一直在youtube上学习android的自定义视图等等。在我尝试做一个表面视图(相当简单的描述在这个视频)。 我所做的事情与视频中所显示的几乎是同步的。

  • 当我试图从DB查询结果时,我得到一个空指针异常。以下是错误: 这是错误产生的函数。 如果我启动应用程序信息服务(=new ApplicationInfoService()),我会得到一个指向我的服务类的空指针错误,在这里进行查询 错误转到createQuery行,如果我打印出EntityManager,它将返回“null”。为什么我的Entitymanager不能初始化。我在我的登录系统中使用了几

  • 问题内容: 我有一个非常简单的应用程序,它只是一个带有选项卡视图的活动。 我已经初始化并将所有内容强制转换为应有的值,但是不断出现空指针错误,该错误始终链接回 tabHost.setup(); 我正在使用android studio,并且是java的新手。这个问题在这里已经问了很多,但所有答案都只是说要包含setup(),而我已经做到了。 这是我的.java文件: 我的代码和一些在线教程之间的唯一