是的,有Three kinds.
检查异常
编译器会让您知道何时可能会抛出它们,最有可能是由于环境中的故障。
如果程序可以用它们做某事,则应该捕获它们,否则最好让它们离开。
大部分都继承自
java.lang.Exception
or from
java.lang.Throwable
虽然继承前者更好。
例如:
java.io.IOException
表示发生了某种 I/O 异常。此类是由失败或中断的 I/O 操作产生的一般异常类。
Errors
这些是特殊类型的异常。他们不应该被抓住因为当它们发生时,就意味着真的发生了非常糟糕的事情。
他们都继承自
java.lang.Error
例如:
java.lang.OutOfMemoryError
当 Java 虚拟机因内存不足而无法分配对象且垃圾收集器无法提供更多内存时抛出该异常。
or
java.lang.StackOverflowError
当由于应用程序递归太深而发生堆栈溢出时抛出。
运行时异常
用于识别程序员故障,而不是资源故障。
编码时“通常”可以避免运行时异常。如果你有这样的情况,你很可能做错了什么。
有时会捕获运行时异常,但是,除非您确切地知道自己在做什么并且why,抓住它们是一种不好的做法(再次强调,除非这正是您所需要的)
他们继承自
java.lang.RuntimeException
例如
java.lang.ArrayIndexOutOfBoundsException
抛出该异常表示已使用非法索引访问了数组。索引为负数或大于或等于数组的大小
or
java.lang.NullPointerException
当应用程序在需要对象的情况下尝试使用 null 时抛出
关于最后两个,MOST有时,可以通过仔细编程并了解程序的状态来避免它们(这个数组有 5 个元素吗?为什么我应该尝试访问 -1 或第 6 个元素。这个引用是否为 null?为什么我应该调用 null。 toString() )
尽管我和那些声称所有 NPE 都应该被抓住的人发生过争论。好吧,我能说什么。