我有一个try块和一个捕获NullPointerExceptions的catch块。但是,Lint警告try块中的语句可能会导致NullPointerException,即使将捕获该异常。为什么我没有意识到我已经处理了异常的可能性?
我正在使用Android Studio 3.谢谢。
答案 0 :(得分:1)
linter的工作是警告你可能成为问题的代码。其中一个内置规则检查可能导致NullPointerException
s的解除引用;它不会检查是否发现了这个异常。
但是,我想知道为什么你catch (NullPointerException e)
而不是简单地检查null
值,然后主动处理它们。
答案 1 :(得分:1)
按照here的规定
程序不得捕获java.lang.NullPointerException 。运行时引发的NullPointerException异常表示必须在应用程序代码中固定基础的空指针取消引用。由于多个原因,通过捕获NullPointerException而不是解决基础问题来处理基础空指针取消引用是不合适的。 首先,捕获NullPointerException所带来的性能开销比简单地添加必要的null检查要大得多[Bloch 2008]。其次,当try块中的多个表达式能够引发NullPointerException时,很难或不可能确定哪个表达式负责该异常,因为NullPointerException catch块会处理从try块中任何位置抛出的NullPointerException。第三,在引发NullPointerException之后,程序很少保持预期状态和可用状态。尝试在第一次捕获和记录(或更糟糕的是,抑制)异常后成功继续执行。
同样,程序不得捕获RuntimeException,Exception或Throwable。很少有方法能够处理所有可能的运行时异常。当方法捕获RuntimeException时,它可能会收到设计者无法预料的异常,包括NullPointerException和ArrayIndexOutOfBoundsException。许多catch子句只是记录或忽略所包含的例外条件,并试图恢复正常执行;这种做法经常违反ERR00-J。不要抑制或忽略检查的异常。运行时异常通常表明程序中的错误应由开发人员修复,并经常导致控制流漏洞。
因此,当Android Studio“忽略” NullPointerException捕获块时,它看起来像是故意的行为,您不应该捕获NullPointerException,而只需检查null。
另请参阅this问题。