Java 使用throw命令不会引发异常

Java 使用throw命令不会引发异常,java,android,exception,exception-handling,nullpointerexception,Java,Android,Exception,Exception Handling,Nullpointerexception,我正在编写一个返回FragmentManager实例的方法,如代码belwo所示。 问题是,如果传递给方法的上下文为null,我想抛出一个异常,然后终止应用程序 发生的情况是,当我将null传递给下面提到的方法时,应用程序关闭,但NullPointerException中的消息是: getFragmentManagerInstance: Context reference is null 不显示 请让我知道如何抛出异常并正确终止应用程序 libs: public static Fragment

我正在编写一个返回FragmentManager实例的方法,如代码belwo所示。 问题是,如果传递给方法的上下文为null,我想抛出一个异常,然后终止应用程序

发生的情况是,当我将null传递给下面提到的方法时,应用程序关闭,但NullPointerException中的消息是:

getFragmentManagerInstance: Context reference is null
不显示

请让我知道如何抛出异常并正确终止应用程序

libs

public static FragmentManager getFragmentManagerInstance(Activity activity) throws Exception {

    try {
        if (activity != null) {
            return activity.getFragmentManager();
        } else {
            throw new NullPointerException("getFragmentManagerInstance: Context reference is null");
        }
    } catch (NullPointerException e) {
        System.exit(1);
        return null;
    }
}
不显示

当然,这是因为您正在接受异常:

} catch (NullPointerException e) {
    System.exit(1);
    return null;
}
该消息在
e
中携带,您在
catch
块中没有使用该消息


请注意,捕获
NullPointerException
几乎从来都不是正确的做法。在这种情况下,您只需打印消息并直接终止应用程序:

if (thing == null) {
  System.err.println("It's null!");
  System.exit(1);
}

只需使用
e.printStackTrace()

系统之前退出(1)


它将按您的意愿打印

由于您尚未编写任何代码来打印,因此消息未显示。如果要显示消息,请添加
e.printStackTrace()

只需删除try块。简单打字

if(活动!=null){
返回活动。getFragmentManager();
}否则{
抛出新的NullPointerException(“getFragmentManagerInstance:上下文引用为null”);
}
将执行您想要的操作,因为
NullPointerException
是未经检查的异常。

消息“getFragmentManagerInstance:Context reference is null”存储在e中您需要将其打印出来,使其显示在屏幕上。

在catch块中,在System.exit(1)之前添加一条print语句


为了打印一些信息,您需要将它们提供给输出流,例如
System.out
System.err

默认情况下,如果调用
ex.printstacktrace()
,它将在in System.err中打印异常

您还可以使用
ex.printstacktrace(System.out)
选择信息发送的位置,如文件、控制台或任何输出


此外,您的应用程序将在System.exit之后立即停止,因此您的代码行需要在退出之前

我很惊讶这还没有说明,请将您的
捕获块更改为

} catch(NullPointerException e){
    System.err.print(e.getMessage());
    System.exit(1);
    return null;
}

如果您想向用户打印消息,请考虑使用<代码> toAST<代码>,而不是异常消息。

为什么要抛出异常?为什么不直接终止?@AndyTurner我认为在终止应用程序之前显示异常是一个好方法。但是如果我不会抛出一个eception并终止应用程序,那么我怎么能向用户打印日志消息呢?不要捕获它。让它向上传播。@user2121显示异常的最佳方法是
newwhateverexceptiontype().printStackTrace()
,或类似方法。您可以创建异常而不抛出它们。@user2121您应该在catch块中记录异常,然后再
System.exit()
,异常堆栈跟踪不会被魔术打印出来。如果目标是在值为null时终止应用程序,这不是OP想要的。这种NPE可以在更高层捕获。(我并不同意OP应该这么做)。
} catch(NullPointerException e){
    System.err.print(e.getMessage());
    System.exit(1);
    return null;
}