【问题标题】:Strange NullPointerException in AndroidAndroid中奇怪的NullPointerException
【发布时间】:2014-01-11 14:43:23
【问题描述】:

我认为下面的问题会很愚蠢(我只是编码的初学者)但我已经坐了很长时间,最后决定提出来。我在类级别有一个 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.登录脸书。

2.拍照。

3.将用户名和拍摄图片的路径存入数据库。

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

【问题讨论】:

  • 只是为了确定,可以检查R.java是否在'public static final class string'下有“app_id”
  • 在“public static final class String”里面!!感谢您的考虑。
  • 您是从广播接收器还是服务调用 getName?
  • 我没有使用任何广播接收器。我只是称它为 usig java 时尚。 Classvariable.methodname() 样式。
  • Sudhee 在下面的回答可能是正确的(虽然很难理解)。您在一个不完全构造的对象上调用“getName”。 getString 直到 onCreate 被调用后才会起作用。

标签: android nullpointerexception


【解决方案1】:

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

String app_id=youractivity.this.getString(R.string.app_name);

这种方式非常简单。希望对您有所帮助...

【讨论】:

  • 我会试试这个然后回复你。
  • 对不起,伙计。没有变化,错误仍然存​​在,让我发疯。感谢您的努力。
  • @San 请调试你的代码,你就知道你的代码行有什么问题了。
  • 调试中的另一个小问题是我的第一个活动登录到 facebook 并检索用户名并将其设置为 textview。因此,当我调试并单击 facebook 按钮时,它不会到达 facebook 并调用“找不到源”但是当我运行它时,它工作正常。
  • @ManishPatel 不,它还没有解决,但如果得到它,我一定会发布我的答案。感谢您的关注。
【解决方案2】:

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

如果是那么就改变

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

【讨论】:

  • 我已经仔细检查了strings.xml中的app_id,它是安全的。试过了,但没有用。不管怎么说,多谢拉。非常感谢。
【解决方案3】:

我发现这种情况发生在我身上,布局损坏。无需担心。我正在尽力为您提供解决方案

解决方案

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

如果您以某种方式碰到某些东西并在您的活动中创建了 import android.R,请将其删除。 运行 Project -> Clean。 这将删除并重新生成 R 和 BuildConfig。

确保 Project -> Build Automatically 被勾选。如果没有,请通过 Menu -> Project -> Build Project 手动构建它。

等待几秒钟让错误消失。

如果不起作用,请删除 /gen/ 文件夹中的所有内容

如果仍然不起作用,请尝试右键单击您的项目 -> Android 工具 -> 修复 项目属性。

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

右键单击您的项目>属性> Android。

查看页面右侧的项目构建目标和库部分。您的构建目标应该与您的 AndroidManifest.xml 中的目标匹配。因此,如果它在 AndroidManifest 中设置为目标 17,请确保目标名称为 Android 4.2。如果您的库在引用下方有 X,请删除并重新添加库,直到出现绿色勾号。如果您移动了一些文件和文件夹,则可能会发生这种情况。

如果 R 不再生怎么办

这通常发生在您的 xml 文件损坏时。

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

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

查看AndroidManifest.xml,发现经常换一个字符串,忘记从AndroidManifest.xml改字符串名称。

检查是否安装了 Android SDK Build-tools。 Window->Android SDK Manager->Tools->Android SDK Build-tools

确保在更新 Android SDK 工具时,您还更新了 Android SDK 平台工具和 Android ASK 构建工具。如果它们不匹配,则构建会静默失败。

如果找不到问题,请右键单击 /gen/ -> 从本地历史记录恢复... -> 勾选 R.java -> 单击恢复。 这并不能解决问题,但它会清除额外的错误,使问题更容易找到。

希望对您有所帮助。 :)

【讨论】:

  • 朋友,我感激不尽。我已经完成了你给出的每一步,但仍然存在那个愚蠢的问题。非常感谢您付出的努力并启发了我。保持这种精神。
【解决方案4】:

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

尝试将此应用 ID 保存在共享首选项中,然后您就可以随时随地访问它。

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

【讨论】:

  • 这不是保存或从任何变量获取数据的问题。它的错误发生只是因为字符串资源 ID。
  • 感谢 Tarek,但我正在尝试找到此错误的合理原因。当然,您的想法是整洁和完美的,但为什么会在没有充分理由的情况下发生这种情况!
  • 如果您使用的是 Eclipse,您可以期待任何事情:D 我的朋友曾经像您一样在 xml 文件中编辑了一些内容,并最终从头开始重新制作整个应用程序......所以我的建议是先备份您的项目做任何事情:)
【解决方案5】:

按如下方式进行。

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,如果您不是从活动/服务/接收器调用此方法。请将 Context 实例保存在静态变量中。

【讨论】:

    【解决方案6】:

    我根据更新修改的答案:

    恐怕活动的创建不仅限于活动的创建 目的。紧随其后的是各种初始化和设置器调用,它们 Android 系统会这样做,这会产生活动的完整上下文。 例如:当你的 MainActivity 被 Android 系统创建时,MainActivity 创建对象,然后进行初始化,其中还包括绑定 对象与资源。 当您在应用程序中创建 MainActivity 对象时,这些初始化都不会发生,因此,您无法访问资源(以及许多其他事情)。这个对象 在 Android Sense 中不是真正的活动对象。它只是一个未初始化的对象 MainActivity 类的。

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

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

    希望这可以澄清。


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

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

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

    see here了解更多

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

    【讨论】:

    • 我知道有 3 个活动。 getName() 定义在哪里,在哪个类中?
    • getName() 在 MainActivity 中定义,并在第三个活动中调用。 MainActivity 是提供我的 facebook 详细信息并获取名称的地方。我还尝试将名称(从 facebook 获取的用户名)设置为另一个字符串变量并将其返回到第三个活动,但返回 null !奇怪啊!!
    • San,如果您在 MainActivity 类中定义了 getName(),您如何从 3rd Activity 访问它?您是否将 MainActivity 的对象引用传递给 3rd Activity?否则,除非 getName 是静态的,否则您将无法执行此操作。您能否提供代码的结构,即所有类结构=变量,所有活动的成员函数声明没有实现。
    • 我通过使用 MainActivity 的对象作为 MainActivity main_object = new MainActivity() 来调用 getName(); main_object.getName() 并将其分配给字符串变量。 Java风格!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2013-12-20
    • 2015-01-16
    • 2011-10-12
    相关资源
    最近更新 更多