使用throw命令不抛出异常

问题描述:

我编写了一个方法,返回代码如下所示的FragmentManager实例。 问题是,如果传递给方法的上下文为空,然后终止App,我想抛出一个异常。使用throw命令不抛出异常

发生的事情是,当我通过空下面提到的方法,应用程序关闭,但在空指针异常的消息是:

getFragmentManagerInstance: Context reference is null 

不显示

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

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; 
    } 
} 
+1

为什么还要抛出异常?为什么不直接终止? –

+0

@AndyTurner我认为这是一个很好的方式显示异常之前终止应用程序..但如果我不会抛出eception,只是终止应用程序,我该如何打印日志消息给用户呢? – user2121

+1

不要抓住它。让它传播起来。 –

消息“getFragmentManagerInstance:Context reference is null”正被存储在e中。 您需要打印它才能使其显示在屏幕上。

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

catch (NullPointerException e) { 
     System.out.println(e); 
     System.exit(1); 
     return null; 
} 

不显示

当然,这是因为你吞咽异常:

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

的该消息在e进行,而你却不是t在catch块中使用。


注意,它几乎是从未做赶上NullPointerException正确的事情。在这种情况下,你可以简单地打印消息并终止直接应用:

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

System.exit(1)

只需使用e.printStackTrace()

,它将打印为你想

该消息是没有被显示,因为你没有写任何代码来打印它。如果要显示消息,请在退出前添加e.printStackTrace();

只要删除try块。只需键入

if (activity != null) { 
     return activity.getFragmentManager(); 
    } else { 
     throw new NullPointerException("getFragmentManagerInstance: Context reference is null"); 
    } 

会做你想做的,因为NullPointerException是一个未经检查的异常。

+0

如果目标是终止应用程序,如果该值为null,这*不是* OP的要求。这个NPE可能会陷入更高层。 (不是我同意这是OP *应该*想要的)。 –

为了打印您需要将它们提供到输出流,如System.outSystem.err的一些信息。

默认情况下,如果您致电ex.printstacktrace()它将在System.err中打印异常。

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

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

我惊讶这还没有陈述,改变你的catch

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

如果你要打印的信息给用户,可以考虑使用的Toast而不是异常的消息。