Android中的奇怪NullPointerException

时间:2013-12-23 11:24:43

标签: android nullpointerexception

我认为下面的问题会很愚蠢(我只是编码的初学者),但我已经坐了很长时间,最后决定把它搞砸了。我在类级别有一个getName()方法,它访问string.xml文件并从那里获取一个条目。

代码:

public String getName()
    {
        String name = null;
        try {
            System.out.println("Inside getName");
            String app_id = MainActivity.this.getResources().getString(R.string.app_id);
            System.out.println(app_id);
            fb = new Facebook(app_id);
            System.out.println("Before the JSON");
            String jsonUser = fb.request("me");
            System.out.println("Successful in fb.request");
            obj=Util.parseJson(jsonUser);
            System.out.println("Successful in parsejson");
            name = obj.optString("username");
} catch...
}

当我调用上面的方法时,它会在

返回NullPointerException
   String app_id = getString(R.string.app_id);

有趣且最好的部分是我在onCreate()方法中具有相同的行,如下所示:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.name_text_view);
        b = (ImageView) findViewById(R.id.postbutton);
        snap = (ImageView) findViewById(R.id.camera_image_view);
        sp = getPreferences(MODE_PRIVATE);
        **String app_id = getString(R.string.app_id);**
        fb = new Facebook(app_id);
        System.out.println("The app_id is " + app_id);
        String access_token = sp.getString("access_token", null);
        long expires = sp.getLong("access_expires", 0);
}

这不会抛出任何空指针异常。我的问题是它为什么只在方法getName()抛出NullPointerException。它与R的范围有关吗?我完全迷失在这里,感到非常尴尬发布这样的问题,但也无法接受这样一个事实,即它给我这个愚蠢的错误。任何帮助将是疯狂地赞赏的人!!!!

更新:

Logcat:

  12-26 17:24:07.330: W/dalvikvm(23184): threadid=1: thread exiting with uncaught exception (group=0x4118d438)
12-26 17:24:07.330: E/AndroidRuntime(23184): FATAL EXCEPTION: main
12-26 17:24:07.330: E/AndroidRuntime(23184): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.facebook_integration/com.example.facebook_integration.SQLiteDemoActivity}: java.lang.NullPointerException
12-26 17:24:07.330: E/AndroidRuntime(23184):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
12-26 17:24:07.330: E/AndroidRuntime(23184):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2099)
12-26 17:24:07.330: E/AndroidRuntime(23184):    at android.app.ActivityThread.access$600(ActivityThread.java:138)
12-26 17:24:07.330: E/AndroidRuntime(23184):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
12-26 17:24:07.330: E/AndroidRuntime(23184):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-26 17:24:07.330: E/AndroidRuntime(23184):    at android.os.Looper.loop(Looper.java:137)
12-26 17:24:07.330: E/AndroidRuntime(23184):    at android.app.ActivityThread.main(ActivityThread.java:4954)
12-26 17:24:07.330: E/AndroidRuntime(23184):    at java.lang.reflect.Method.invokeNative(Native Method)
12-26 17:24:07.330: E/AndroidRuntime(23184):    at java.lang.reflect.Method.invoke(Method.java:511)
12-26 17:24:07.330: E/AndroidRuntime(23184):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
12-26 17:24:07.330: E/AndroidRuntime(23184):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
12-26 17:24:07.330: E/AndroidRuntime(23184):    at dalvik.system.NativeStart.main(Native Method)
12-26 17:24:07.330: E/AndroidRuntime(23184): Caused by: java.lang.NullPointerException
12-26 17:24:07.330: E/AndroidRuntime(23184):    at com.example.facebook_integration.SQLiteDemoActivity.onCreate(SQLiteDemoActivity.java:33)
12-26 17:24:07.330: E/AndroidRuntime(23184):    at android.app.Activity.performCreate(Activity.java:5252)
12-26 17:24:07.330: E/AndroidRuntime(23184):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1082)
12-26 17:24:07.330: E/AndroidRuntime(23184):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2038)
12-26 17:24:07.330: E/AndroidRuntime(23184):    ... 11 more

更新2:

的strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">Facebook_Integration</string>
    <string name="action_settings">Settings</string>
    <string name="app_id">594458613962731</string>
    <string name="hello_world">Hello world!</string>
    <string name="title_activity_snap__image_view">Snap_ImageView</string>
    <string name="album_name">San_Pictures</string>
    <string name="title_activity_android_custom_gallery">AndroidCustomGalleryActivity</string>
    <string name="title_activity_full_screen">FullScreen</string>
    <string name="title_activity_sqlite_demo">SQLiteDemoActivity</string>

</resources>

更新3:

当我正在处理facebook时,我认为问题在于创建Facebook对象(fb)的实例,所以我评论了该行并再次尝试,但它仍然在

处说NullPointerException
String app_id = MainActivity.this.getResources().getString(R.string.app_id);

如果有人处理过这样的情况,那么请知道。

更新4:

MyApp的结构:

以下是我的应用程序的要点

1.登录facebook。

2.拍照。

3.存储在数据库中拍摄的用户名和照片的路径。

最初我的主要活动有facebook图像,它会在facebook中登录并检索用户名,从而在同一主要活动的textview中设置它。 其次是一个相机按钮,可以带我到相机拍照。 拍摄照片后,第三个活动应显示用户名和存储照片的路径。(这是我无法再次获取用户名的地方)。

6 个答案:

答案 0 :(得分:2)

在这里,您应该提供应用程序或活动上下文以获取如下所示的资源值:

String app_id=youractivity.this.getString(R.string.app_name);
这种方式非常简单。希望这有帮助...

答案 1 :(得分:1)

首先,必须检查 strings.xml 文件中的 app_id 是否正确。

如果是,则改变

 String app_id = getResources().getString(R.string.app_id);

答案 2 :(得分:1)

我发现这种情况发生在布局上。不用担心。我正尽力为你提供解决方案

<强>解决方案

确保 R。链接的所有内容均未损坏。修复XML文件中的所有错误。如果ADK中的任何内容被破坏,R将不会重新生成。

如果您以某种方式点击某些内容并在您的活动中创建了导入android.R,请将其删除。 运行项目 - &gt;清理。这将删除并重新生成R和BuildConfig。

确保项目 - &gt;勾选自动生成。如果没有,请通过菜单 - &gt;手动构建它。项目 - &gt;建立项目。

等几秒钟让错误消失。

如果不起作用,请删除 / gen / 文件夹

中的所有内容

如果仍然无效,请尝试右键单击项目 - &gt; Android工具 - &gt;修复项目属性。

检查* .properties文件(在app文件夹的根文件夹中),并确保其中的链接没有损坏。

右键点击项目&gt;属性&gt; Android。

查看页面右侧的Project Build Target和Library部分。您的Build Target应该与AndroidManifest.xml中的目标匹配。因此,如果在AndroidManifest中将其设置为17,请确保目标名称为Android 4.2。如果您的库在引用下有X,请删除并重新添加库,直到有绿色勾号。如果你移动了几个文件和文件夹,可能会发生这种情况。

如果R不重新生成该怎么办

当您的xml文件损坏时,通常会发生这种情况。

检查XML文件中的错误,主要是在 / res / 文件夹

常见的地方是 / layout / / values / ,特别是如果您最近更改了其中一个

检查 AndroidManifest.xml ,我发现经常更改字符串,忘记更改AndroidManifest.xml中的字符串名称。

检查是否已安装Android SDK Build-tools。 Window-&gt; Android SDK Manager-&gt;工具 - &gt; Android SDK构建工具

确保在更新Android SDK工具时,您还要更新Android SDK平台工具和Android ASK构建工具。如果它们不匹配,构建将无声地失败。

如果找不到问题,请右键点击 / gen / - &gt;从本地历史记录恢复... - &gt; tick R.java - &gt;点击恢复。这不能解决问题,但它会清除额外的错误,以便更容易找到问题。

希望它会对你有所帮助。 :)

答案 3 :(得分:1)

我不知道问题究竟是什么,但我可以为您提供更好的解决方案

尝试在共享偏好设置中保存此应用ID,然后您可以随时随地访问它。

或在任何类中创建一个静态字符串(我总是为所有常量静态变量创建一个特殊的类)然后你也可以随时随地调用这个变量:)

答案 4 :(得分:0)

我根据更新修改了答案:

我担心活动的创建不仅限于创建活动 宾语。接下来是各种初始化和setter调用 Android系统将执行此操作,从而生成活动的完整上下文。 例如:当您的MainActivity由Android系统创建时,MainActivity 创建了对象,然后是初始化,其中还包括绑定 对象与资源。 在App中创建MainActivity对象时,这些初始化都不会发生,因此,您无法访问资源(以及许多其他内容)。这个对象 在Android Sense中不是真正的活动对象。它只是一个未初始化的对象 MainActivity类。

在您的情况下,资源中的字符串值可以在整个应用程序中访问, 在使用当前活动上下文的所有活动中。您可能想要使用 那。如果您需要在活动之间共享信息,则有所不同 实现这一目标的方法如下:

  1. 使用意图来回传递信息 startActivityForResult()      - 首选方法
  2. 使用具有静态成员的单独类,您可以在其中保存可以的信息 可以在其他地方访问 活动(如果您保存信息,请在此处小心 与某项活动有关,它会导致崩溃,例如:如果你保存了 在activity1的布局中引用TextView并尝试访问 它来自activity2,具有不同的布局,它将失败)
  3. 使用偏好
  4. 希望这澄清。


    为了更好地回答,我需要完整的结构(不是完整的代码,只是结构)。

    但是,我可以猜测发生了什么。我假设你已经创建了一个具有成员函数getName()的特定类,其中可能是。这是我通过查看你调用getResources()(MainActivity.this .....)的方式来假设的。我担心这不行。 Android的对象都是从Android基类继承的,因此具有与之相关的上下文。如果你有一个单独的类,使用像getResources()这样的应用程序上下文函数的成员函数,它就不会工作,因为它可能导致Android应用程序对象没有实例化的情况,例如:你创建了非Android的对象class并调用getResources(),然后创建Android App的保证是什么?如果您使用如下所示的getResources,则会出现类似的问题:

    public class MainActivity extends Activity {
    
        Resources res = this.getResources(); //you cannot use like this
    

    see here了解更多

    解决方法是确保在创建应用程序后调用getResources(),这是您可以确保这是MainActivity的onCreate()的第一个入口点。也, 如果您正在使用其他不继承Android基类的类,请确保传递运行时上下文。

答案 5 :(得分:0)

执行以下操作。

public String getName(Context ctx)
    {
        String name = null;
        try {
            System.out.println("Inside getName");
            **String app_id = ctx.getString(R.string.app_id);**

您无需调用getResources。在调用此方法时传递Context / ctx,如果未从activity / service / Receiver调用此方法。请将Context实例保存在静态变量中。