- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当用户选择不同的语言环境时,我尝试启动新 Activity 时遇到空指针异常。它似乎发生在标记的 Intent 行中。 (我是菜鸟所以简单的解释!)谢谢
public void changeLocale(String locale){
try{
String l=locale;
if(l.equals("uk")){
this.isUk=true;
Log.i(Log_tag,"isUk is true");
//Toast.makeText(this, "UK region selected in Prefs", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Prefs.this, UK.class);//<---ERROR IS OCCURING HERE
startActivity(intent);
}else if(l.equals("eu")){
this.isEu=true;
Toast.makeText(this, "EU region selected", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Prefs.this, EU.class);
startActivity(intent);
}else if(l.equals("us")){
this.isUs=true;
Toast.makeText(this, "Us region selected", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Prefs.this, US.class);
startActivity(intent);
}else if (l.equals("")){
Log.i(Log_tag,"no locale passed in");
finish();
}
}catch (NullPointerException e){
Log.i(Log_tag, "Null Pointer Error in changeLocale()"+e);
finish();
}
}
我的 logcat 是这样说的:
05-25 11:55:57.851: WARN/KeyCharacterMap(898): No keyboard for id 0
05-25 11:55:57.861: WARN/KeyCharacterMap(898): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
05-25 11:56:01.522: INFO/(898): UK selected in UsFM
05-25 11:56:01.543: INFO/(898): editRegion() started
05-25 11:56:01.642: INFO/(898): isUk is true
05-25 11:56:01.642: INFO/(898): Null Pointer Error in changeLocale()java.lang.NullPointerException
05-25 11:56:01.953: INFO/NotificationService(69): enqueueToast pkg=com.silifeform.android callback=android.app.ITransientNotification$Stub$Proxy@4380ba08 duration=0
05-25 11:56:01.995: INFO/ActivityManager(69): Starting activity: Intent { cmp=com.silifeform.android/.Us }
05-25 11:56:02.182: WARN/InputManagerService(69): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@438d8b88 (uid=10024 pid=898)
整个类(class)看起来是这样的:
package com.silifeform.android;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
public class Prefs extends Activity {
public static final String PREFS_NAME="LocalePrefs";
private String region;
public boolean isUk;
public boolean isUs;
public boolean isEu;
private String Log_tag;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
//restore prefs
SharedPreferences settings= getSharedPreferences(PREFS_NAME,0);
String myRegion = settings.getString(region,"us");
this.region=myRegion;
changeLocale(getRegion(this));
}
@Override
protected void onResume() {
super.onResume();
changeLocale(getRegion(this));
}
public void editRegion(Context cxt, String sregion) {
setRegion(sregion);
Log.i(Log_tag,"editRegion() started");
SharedPreferences settings = cxt.getSharedPreferences(PREFS_NAME,0);
SharedPreferences.Editor ed = settings.edit();
ed.clear();
ed.putString(this.region,sregion);
ed.commit();
changeLocale(sregion);
}
public String getRegion(Context cxt){
SharedPreferences settings= cxt.getSharedPreferences(PREFS_NAME,0);
String myRegion = settings.getString(this.region,"us");
return myRegion;
}
public void setRegion(String region) {
this.region = region;
}
public void changeLocale(String locale){
try{
String l=locale;
if(l.equals("uk")){
this.isUk=true;
Log.i(Log_tag,"isUk is true");
Log.i(Log_tag,l);
//Toast.makeText(this, "UK region selected in Prefs", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Prefs.this, UkFuelMoney.class);
startActivity(intent);
}else if(l.equals("eu")){
this.isEu=true;
Toast.makeText(this, "EU region selected", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Prefs.this, EuFuelMoney.class);
startActivity(intent);
}else if(l.equals("us")){
this.isUs=true;
Toast.makeText(this, "Us region D selected", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Prefs.this, UsFuelMoney.class);
startActivity(intent);
}else if (l.equals("")){
Log.i(Log_tag,"no locale passed in");
finish();
}
}catch (NullPointerException e){
Log.i(Log_tag, "Null Pointer Error in changeLocale()"+e);
finish();
}
}
@Override
protected void onStop() {
super.onStop();
SharedPreferences settings = getPreferences(0);
SharedPreferences.Editor ed = settings.edit();
ed.putString(region,region);
ed.commit();
}
}
谢谢基诺。堆栈跟踪看起来像这样:
05-25 12:10:44.162: WARN/System.err(961): java.lang.NullPointerException
05-25 12:10:44.172: WARN/System.err(961): at android.content.ContextWrapper.getPackageName(ContextWrapper.java:120)
05-25 12:10:44.182: WARN/System.err(961): at android.content.ComponentName.<init>(ComponentName.java:75)
05-25 12:10:44.182: WARN/System.err(961): at android.content.Intent.<init>(Intent.java:2302)
05-25 12:10:44.182: WARN/System.err(961): at com.silifeform.android.Prefs.changeLocale(Prefs.java:68)
05-25 12:10:44.192: WARN/System.err(961): at com.silifeform.android.Prefs.editRegion(Prefs.java:46)
05-25 12:10:44.192: WARN/System.err(961): at com.silifeform.android.Us.onOptionsItemSelected(Us.java:347)
05-25 12:10:44.192: WARN/System.err(961): at android.app.Activity.onMenuItemSelected(Activity.java:2096)
05-25 12:10:44.202: WARN/System.err(961): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:825)
05-25 12:10:44.202: WARN/System.err(961): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:139)
05-25 12:10:44.202: WARN/System.err(961): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:813)
05-25 12:10:44.202: WARN/System.err(961): at com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:120)
05-25 12:10:44.212: WARN/System.err(961): at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:884)
05-25 12:10:44.212: WARN/System.err(961): at android.widget.AdapterView.performItemClick(AdapterView.java:284)
05-25 12:10:44.212: WARN/System.err(961): at android.widget.ListView.performItemClick(ListView.java:3246)
05-25 12:10:44.222: WARN/System.err(961): at android.widget.AbsListView$PerformClick.run(AbsListView.java:1635)
05-25 12:10:44.222: WARN/System.err(961): at android.os.Handler.handleCallback(Handler.java:587)
05-25 12:10:44.222: WARN/System.err(961): at android.os.Handler.dispatchMessage(Handler.java:92)
05-25 12:10:44.232: WARN/System.err(961): at android.os.Looper.loop(Looper.java:123)
05-25 12:10:44.232: WARN/System.err(961): at android.app.ActivityThread.main(ActivityThread.java:4203)
05-25 12:10:44.242: WARN/System.err(961): at java.lang.reflect.Method.invokeNative(Native Method)
05-25 12:10:44.242: WARN/System.err(961): at java.lang.reflect.Method.invoke(Method.java:521)
05-25 12:10:44.242: WARN/System.err(961): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
05-25 12:10:44.252: WARN/System.err(961): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
05-25 12:10:44.252: WARN/System.err(961): at dalvik.system.NativeStart.main(Native Method)
05-25 12:10:44.252: INFO/(961): Null Pointer Error in changeLocale()java.lang.NullPointerException
最佳答案
您的 Prefs
Activity 未填充,因为您可能已经在 com.silifeform.android.Us.onOptionsItemSelected()
中自己实例化了它(我想实现仍然相似到您发布的 here )。正如我在回答你提到的问题时已经指出的那样,如果 Prefs
类没有被 Android 实例化(和管理),你不能假设它工作正常(尤其是来自 Context
) 因为它没有正确启动。再次应用相同的策略,使用传递给 changeLocale
的单独 Context
对象来解决此问题。
关于android - 使用 Intent 的空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6124006/
我刚接触 C 语言几周,所以对它还很陌生。 我见过这样的事情 * (variable-name) = -* (variable-name) 在讲义中,但它到底会做什么?它会否定所指向的值吗? 最佳答案
我有一个指向内存地址的void 指针。然后,我做 int 指针 = void 指针 float 指针 = void 指针 然后,取消引用它们以获取值。 { int x = 25; vo
我正在与计算机控制的泵进行一些串行端口通信,我用来通信的 createfile 函数需要将 com 端口名称解析为 wchar_t 指针。 我也在使用 QT 创建一个表单并获取 com 端口名称作为
#include "stdio.h" #include "malloc.h" int main() { char*x=(char*)malloc(1024); *(x+2)=3; --
#include #include main() { int an_int; void *void_pointer = &an_int; double *double_ptr = void
对于每个时间步长,我都有一个二维矩阵 a[ix][iz],ix 从 0 到 nx-1 和 iz 从 0 到 nz-1。 为了组装所有时间步长的矩阵,我定义了一个长度为 nx*nz*nt 的 3D 指针
我有一个函数,它接受一个指向 char ** 的指针并用字符串填充它(我猜是一个字符串数组)。 *list_of_strings* 在函数内部分配内存。 char * *list_of_strings
我试图了解当涉及到字符和字符串时,内存分配是如何工作的。 我知道声明的数组的名称就像指向数组第一个元素的指针,但该数组将驻留在内存的堆栈中。 另一方面,当我们想要使用内存堆时,我们使用 malloc,
我有一个 C 语言的 .DLL 文件。该 DLL 中所有函数所需的主要结构具有以下形式。 typedef struct { char *snsAccessID; char *
我得到了以下数组: let arr = [ { children: [ { children: [], current: tru
#include int main(void) { int i; int *ptr = (int *) malloc(5 * sizeof(int)); for (i=0;
我正在编写一个程序,它接受一个三位数整数并将其分成两个整数。 224 将变为 220 和 4。 114 将变为 110 和 4。 基本上,您可以使用模数来完成。我写了我认为应该工作的东西,编译器一直说
好吧,我对 C++ 很陌生,我确定这个问题已经在某个地方得到了回答,而且也很简单,但我似乎找不到答案.... 我有一个自定义数组类,我将其用作练习来尝试了解其工作原理,其定义如下: 标题: class
1) this 指针与其他指针有何不同?据我了解,指针指向堆中的内存。如果有指向它们的指针,这是否意味着对象总是在堆中构造? 2)我们可以在 move 构造函数或 move 赋值中窃取this指针吗?
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: C : pointer to struct in the struct definition 在我的初学者类
我有两个指向指针的结构指针 typedef struct Square { ... ... }Square; Square **s1; //Representing 2D array of say,
变量在内存中是如何定位的?我有这个代码 int w=1; int x=1; int y=1; int z=1; int main(int argc, char** argv) { printf
#include #include main() { char *q[]={"black","white","red"}; printf("%s",*q+3); getch()
我在“C”类中有以下函数 class C { template void Func1(int x); template void Func2(int x); }; template void
我在64位linux下使用c++,编译器(g++)也是64位的。当我打印某个变量的地址时,例如一个整数,它应该打印一个 64 位整数,但实际上它打印了一个 48 位整数。 int i; cout <<
我是一名优秀的程序员,十分优秀!