Android 将int赋值为整数

Android 将int赋值为整数,android,nullpointerexception,Android,Nullpointerexception,我定义了一个类(作为c中宏的替代) 和另一个“全局变量”类 我是这样分配的: GlobalsVars.gi1 = Constants.i1; if (GlobalVars.gi1 == Constants.i1) 虽然我没有收到任何编译器警告,并且它可以在1000个测试用例中工作,但这是否可能导致GlobalVars.gi1在特殊情况下变为null,比如在运行各种版本的某些Android设备上 编辑: 我这样比较: GlobalsVars.gi1 = Constants.i1; if (G

我定义了一个类(作为c中宏的替代)

和另一个“全局变量”类

我是这样分配的:

GlobalsVars.gi1 = Constants.i1;
if (GlobalVars.gi1 == Constants.i1)
虽然我没有收到任何编译器警告,并且它可以在1000个测试用例中工作,但这是否可能导致GlobalVars.gi1在特殊情况下变为null,比如在运行各种版本的某些Android设备上

编辑:

我这样比较:

GlobalsVars.gi1 = Constants.i1;
if (GlobalVars.gi1 == Constants.i1)

这就是发生NullPointerException错误的地方

在所有情况下都可以正常工作。它使用Java语言的一个名为autoboxing的特性来完成从Integer对象到int原语的转换


运行哪一版本的Android并不重要。

这在任何情况下都可以正常工作。它使用Java语言的一个名为autoboxing的特性来完成从Integer对象到int原语的转换


运行哪一版本的Android并不重要。

代码应该在所有当前设备上都能正常运行

这至少有一个问题:

在Android上不建议使用静态全局变量。没有关于如何处理静态类变量的规范


这意味着,在某个时刻,如果设备需要大量内存,那么整个应用程序可能会从内存中删除,如果应用程序被带回前台,那么所有活动都将从保存的实例状态重建,但要知道,您不能依赖静态变量来保持可用。这不是int和Integer的问题。如果从内存中删除应用程序,并且在重新创建应用程序后再次加载所有类,则静态变量的持久性存在问题。

代码应在所有当前设备上正常运行

这至少有一个问题:

在Android上不建议使用静态全局变量。没有关于如何处理静态类变量的规范


这意味着,在某个时刻,如果设备需要大量内存,那么整个应用程序可能会从内存中删除,如果应用程序被带回前台,那么所有活动都将从保存的实例状态重建,但要知道,您不能依赖静态变量来保持可用。这不是int和Integer的问题。如果你的应用程序被从内存中删除,并且重新创建应用程序后,所有类都被重新加载,那么静态变量的持久性就会出现问题。

感谢你的快速回复,我之所以这么问,是因为我在一个比较if(GlobalVars.gi1==Constants.i1)的地方收到了我的应用程序的崩溃报告-自动装箱也解决了这一问题吗?它应按此处所述为您自动转换:。您提到了空指针异常-请确保整数值不为空!谢谢-但是整数值不能为null,因为我在类常量中声明了它,如上所示。是这样吗?或者在某些情况下它可以是空的(比如Janusz decribed)。(我从不在任何地方更改此值)但整数变量为null。正如Janusz所描述的:您可以看到,在
onPause()
函数之后,进程可能会被终止(我不知道您在哪里设置了GlobalVars,但它们可能不会被重建并保持为
null
)--这与
Integer gi=I无关
整数gi=新整数(i)(如前所述:这是一个偶发错误-如果声明会导致问题,那么错误的发生将是系统性的)感谢您的快速回复,我之所以这么问,是因为我在一个地方收到了我的应用程序的崩溃报告,其中比较了if(GlobalVars.gi1==Constants.i1)-自动装箱也解决了这一问题吗?它应按此处所述为您自动转换:。您提到了空指针异常-请确保整数值不为空!谢谢-但是整数值不能为null,因为我在类常量中声明了它,如上所示。是这样吗?或者在某些情况下它可以是空的(比如Janusz decribed)。(我从不在任何地方更改此值)但整数变量为null。正如Janusz所描述的:您可以看到,在
onPause()
函数之后,进程可能会被终止(我不知道您在哪里设置了GlobalVars,但它们可能不会被重建并保持为
null
)--这与
Integer gi=I无关
整数gi=新整数(i)(如前所述:这是一个偶发错误-如果声明会导致问题,那么错误的发生将是系统性的),因此这是否意味着在这些情况下不会重建静态值,而会重建非静态变量。那么我是否应该将它们声明为公共int i1=1?发生这种情况时,不会自动重新生成任何变量。您的活动接收回调(如果您实现了回调),以便您保存和恢复状态;定义这意味着什么完全取决于您。我建议将值存储到
onPause()
回调上更持久的内存中,并恢复
onResume()中的值。
因此,这是否意味着在这些情况下不会重建静态值,而会重建非静态变量。那么我是否应该将它们声明为公共int i1=1?发生这种情况时,不会自动重新生成任何变量。您的活动接收回调(如果您实现了回调),以便您保存和恢复状态;定义这意味着什么完全取决于您。我建议将值存储到
onPause()
回调上更持久的内存中,并恢复
onResume()中的值