【问题标题】:How do i resolve NullPointerException when calling methods?调用方法时如何解决 NullPointerException?
【发布时间】:2012-08-31 21:15:18
【问题描述】:

我是 android 的菜鸟,我在调用另一个类的方法时遇到问题。从它自己的类中调用该方法时工作正常,但是当我从另一个类中调用它时,我得到一个空指针异常。任何帮助将不胜感激。这是我的代码;

从class2调用class1中的方法:

BottlesActivity  inst = new BottlesActivity();
inst.call0();               

类 1 中的方法:

public void call0() {
    try {
        Intent callIntent = new Intent(Intent.ACTION_CALL);
        callIntent.setData(Uri.parse("tel:1234567890"/*+phonenumber0*/));
        startActivity(callIntent); //<--This line causes nullpointerexception
    } catch (ActivityNotFoundException activityException) {
        Log.e("dialing-example", "Call failed", activityException);
    }
}

这是我的 Logcat

09-06 20:51:33.237: E/AndroidRuntime(18192): java.lang.NullPointerException
09-06 20:51:33.237: E/AndroidRuntime(18192):    at android.app.Activity.startActivityForResult(Activity.java:2893)
09-06 20:51:33.237: E/AndroidRuntime(18192):    at android.app.Activity.startActivity(Activity.java:3003)
09-06 20:51:33.237: E/AndroidRuntime(18192):    at com.bryanjrichardson.GSCC.BottlesActivity.call0(GoldandSilverCoinCalculatorActivity.java:857)
09-06 20:51:33.237: E/AndroidRuntime(18192):    at com.bryanjrichardson.GSCC.SimpleItemizedOverlay$1.onClick(SimpleItemizedOverlay.java:204)
09-06 20:51:33.237: E/AndroidRuntime(18192):    at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:174)
09-06 20:51:33.237: E/AndroidRuntime(18192):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-06 20:51:33.237: E/AndroidRuntime(18192):    at android.os.Looper.loop(Looper.java:130)
09-06 20:51:33.237: E/AndroidRuntime(18192):    at android.app.ActivityThread.main(ActivityThread.java:3859)
09-06 20:51:33.237: E/AndroidRuntime(18192):    at java.lang.reflect.Method.invokeNative(Native Method)
09-06 20:51:33.237: E/AndroidRuntime(18192):    at java.lang.reflect.Method.invoke(Method.java:507)
09-06 20:51:33.237: E/AndroidRuntime(18192):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
09-06 20:51:33.237: E/AndroidRuntime(18192):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
09-06 20:51:33.237: E/AndroidRuntime(18192):    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 你确定你从 1 类获得 NPE 吗?你能粘贴你的 LogCat 吗?
  • @Mohamed_AbdAllah 检查我的日志猫。开始活动(调用意图);是第 857 行
  • 你能把Caused by部分包括进去吗
  • @Mohamed_AbdAllah 没有部分原因。这就是 logcat 显示的全部内容。

标签: android class android-intent methods nullpointerexception


【解决方案1】:

如果 call0() 是同一活动类的方法,这将起作用。

public void call0() {
    try {
        Intent callIntent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:1234567890"));
        startActivity(callIntent); 
    } catch (ActivityNotFoundException activityException) {
        Log.e("dialing-example", "Call failed", activityException);
    }
}

别忘了在你的清单文件中添加这个:

<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>

而且我认为这不是一件好事:

BottlesActivity  inst = new BottlesActivity();
inst.call0();

当点击按钮时,调用 call0() 如下:

public void onClick(View v) {
     switch(v.getId()){
          case R.id.idButton:
                call0();
                break;

      }
}

【讨论】:

  • 仍然没有运气,它仍然像以前一样在同一行抛出空指针。我在清单中有我的权限。
  • 问题是你从另一个活动中调用它。为什么要这样称呼它?
  • 我在另一个类中有一个按钮必须使用这个功能
  • 为什么不将其称为相同的活动。单击按钮时,调用 call0();我认为不需要调用另一个活动的方法。
  • 该按钮位于一个公共类中,该类扩展了另一个类,该类是控制我的地图叠加层功能的公共抽象类。该按钮位于 @override 受保护的布尔方法中
【解决方案2】:

您不能自己创建Activity。您可以在另一个 Activity 类中使​​用 static 方法。

来自任何活动:

BottlesActivity.call0(this);

在BottlesActivity中

public static void call0(Context context) {
    try {
        Intent callIntent = new Intent(Intent.ACTION_CALL);
        callIntent.setData(Uri.parse("tel:1234567890"/*+phonenumber0*/));
        context.startActivity(callIntent); //<--This line causes nullpointerexception
    } catch (ActivityNotFoundException activityException) {
        Log.e("dialing-example", "Call failed", activityException);
    }
}

【讨论】:

  • startACtivity 在静态方法中是不允许的。还是谢谢。
  • @zapl :您是正确的,OP 不应尝试直接创建 Activity,但请不要建议在 Activity 中公开 public 方法(static 或其他方式) .这只会导致一种误解,即Activity 可以像任何普通的 Java 类一样被对待,但事实并非如此。 Activity 类是一种特殊情况,不应公开public 方法或数据成员以供其他应用程序组件使用。
  • @B.Money this.startActivity (或只是startActivity)不是因为在静态上下文中没有this - 但如果你传入Context 以充当@987654336 @ 它是。 @Squonk 你是对的,不应该滥用 Activity 来处理这些事情,尽管与尝试访问活动实例的成员相比,static 实用程序方法只是轻微的滥用
【解决方案3】:

如果您的 2 个类是 2 个单独的活动,您的情况将导致空指针异常,因为当第二个活动运行时,第一个活动停止(终止)->这是 Android 操作系统机制,您不能改变。

适合您的情况的解决方案:

  • (1) Activity 1 是其他Activity 的父级,这种情况适用于Application 类或TabHost(复杂)。

  • (2) 创建像@Zapl's answer这样的静态方法;但这仍然不是很好,因为这个静态方法应该是常用的,而不是在 Class 1 中 -> modify: Create a common Class 如下所示:

这是实用程序类:

public class GlobalUtil
{
    public static void startUrlActivity(Context context, String url) {
    try {
        Intent callIntent = new Intent(Intent.ACTION_CALL);
        callIntent.setData(Uri.parse(url));
        context.startActivity(callIntent); //<-- pass current activity or context
        } catch (ActivityNotFoundException activityException) {
        Log.e("dialing-example", "Call failed", activityException);
        }
    }
}

在任何其他活动类中,您都可以调用它:

GlobalUtil.startUrlActivity(this, "tel:1234567890"/*+phonenumber0*/");

GlobalUtil.startUrlActivity(getBaseContext().getApplicationContext(), "your_url");

【讨论】:

  • 不允许我使用静态空白。当我在第二堂课中删除“静态”时,它希望我将 startUrlActivity 从 (Context, String) 更改为 (OnClickListener, String)。
  • 您查看我的答案:context.startActivity(callIntent); 您必须从当前的context 中调用它。如果省略context,则表示您调用this.startActivity(..)
  • 您是否像我一样创建另一个类为GlobalUtil?它不会花费你更多的代码工作
猜你喜欢
  • 2020-08-30
  • 2014-01-28
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 2018-06-01
相关资源
最近更新 更多