最常见的已检查和未检查的Javaexception?
据我所知,如果没有逐个查找API文档,就无法找出方法抛出的exception。
由于这是不可取的,我想反转研究并询问您在处理时遇到的最常见的exception和运行时exception:
- 铸件
- 数组
- Vector,ArrayList,HashMap等
- IO(文件类,流,filter,……)
- 对象序列化
- 线程(wait(),sleep()等)
- 或任何被认为是“基本Java”的东西
我意识到这可能是主观和无聊的,但这是一个class级测试,我真的不知道更好。
假设以下是java.lang
除非我另有说明:
- 强制转换 :ClassCastException
- 数组 :ArrayIndexOutOfBoundsException,NullPointerException
- 集合 :NullPointerException,ClassCastException(如果你没有使用自动装箱而你搞砸了)
- IO :java.io.IOException,java.io.FileNotFoundException,java.io.EOFException
- 序列化 :java.io.ObjectStreamException(AND ITS SUBCLASSES,我懒得枚举)
- 线程 :InterruptedException,SecurityException,IllegalThreadStateException
- 可能对所有情况都很常见 :NullPointerException,IllegalArgumentException
您最好查看Java站点的Package Summary页面。 这是一个: http : //java.sun.com/j2se/1.4.2/docs/api/java/io/package-summary.html
空指针exception
未经检查的例外列表
ArrayIndexOutOfBoundsExceptionexception
ClassCastExceptionexception
抛出:IllegalArgumentException
IllegalStateExceptionexception
空指针exception
NumberFormatException的
Asse田
的ExceptionInInitializerError
的StackOverflowError
的NoClassDefFoundError
已检查的例外列表
例外
IOExceptionexception
FileNotFoundExceptionexception
ParseException的
ClassNotFoundException的
CloneNotSupportedException的
InstantiationException
InterruptedException的
NoSuchMethodException
NoSuchFieldException
java.lang中:
- ArithmeticException
- ArrayIndexOutOfBoundsExceptionexception
- ClassCastExceptionexception
- ClassNotFoundException的
- CloneNotSupportedException的
- IllegalArgumentExcepion
- 抛出:IllegalMonitorStateException
- IllegalThreadStateException
- IndexOutOfBoundsExceptionexception
- InterruptedException的
- 空指针exception
- NumberFormatedException
java.util中:
- ConcurrentModificationException的
java.io:
- EOFException类
- FileNotFoundExceptionexception
- IOExceptionexception
- NotSerializableException
比尔K说。 检查exception很容易。 如果您的IDE /程序编辑器没有为您提供快速查看方法javadoc或签名的方法,则需要将其丢弃。 认真。
未经检查的例外是一个不同的鱼。 但我认为,未经检查的例外情况的最佳策略是不要试图抓住它们。 相反,你编写代码,以避免抛出它们。 例如;
// ... not sure if 'obj' is null if (obj != null) { obj.someMethod(); } // ... not sure if 'obj' has the right type if (obj instanceof Foo) { Foo foo = (Foo) obj; } // ... not sure if 'i' is in range if (i >= 0 && i < array.length) { .... = array[i]; }
这就是为什么我推荐这个:
- 防护测试比投掷和捕获exception的效率高几个数量级 。
- 防护测试更具可读性......代码行数更少。
- 如果您发现未经检查的exception,您可能永远无法确定它是否因您认为的原因而发生; 例如:
// obj可能为null ... 尝试{ obj.doSomething(); } catch(NullPointerException ex){ System.err.println(“obj为null”); //错了!!! // NPE可能发生在doSomething()中 }
- 如果未经检查的exception是由错误引起的,那么您需要堆栈跟踪并且(根据应用程序)您可能不想恢复。
显然,您只需要包含这些“警卫”检查,您对代码的理解会告诉您它们是必要的! 所以,例如,如果你知道 'obj'应该是非null并且'我'应该在范围内,那么最好不要检查。 如果你遗漏了一个测试太多,你会得到一个例外......但这很好,因为你可以使用堆栈跟踪来弄清楚为什么你对代码的理解是错误的,并且可能修复底层错误。
如何查找java.lang.exception的子类,例如这里
就个人重试可能起作用的情况而言,我个人使用了自己的TransientException的2个已检查exception。 和validation错误的InvalidRequestException。
NumberFormatException的
检查exception很简单,当您hover/完成方法名称时,编辑器应显示javadoc。
未经检查通常是实际错误,甚至在javadoc中也不常见。 我想最常见的可能是IllegalArgumentException,任何具有任何可能的无效参数组合的方法都应抛出它。
-
Casting – ClassCastException
-
数组 – ArrayIndexOutOfBoundsException
-
Vector,ArrayList,HashMap等 – 我在使用Java集合时很少看到exception,但偶尔会出现ConcurrentModificationException
-
IO(文件类,流,filter,…) – FileNotFoundException
-
对象序列化 – ClassNotFoundException
-
线程(wait(),sleep()等) – 根据我的经验,线程问题通常以随机方式表现出来,而不是exception特定的。 必须处理InterruptedException占用了大量的时间,尽管我还没有看到实际抛出的exception。
-
或者其他被认为是“基本Java”的东西 – 到目前为止,我经验中最常见的例外是NullPointerException。
我想提供一个按情况分组的列表,这可能比按程序包或编程字段分组更有意义。
意外的例外
这些是理想情况下永远不会被投入生产的例外。 你应该修复它们而不是捕获它们和stfu。
当你测试新编写的代码时(有时用户意外地看到)
一旦你看到它们,它们就永远不会再发生。
- Asse田
- 恭喜你,你正在编写好的代码
- 你应该对你犯这个错误感到高兴,因为更少(错误)更多(错误)
- 我希望你最终不会发现你的代码是正确的,并且你不小心颠倒了你的断言
- 空指针exception
- 你的
@NotNull
在哪里? - 你在使用
Map.get()
的返回值之前检查过吗?
- 你的
- ArrayIndexOutOfBoundsExceptionexception
- 你在使用
List.get()
之前检查? - 我希望你知道Java不是JavaScript,数组是固定大小的,你不能只是
array[array.length] = newElement
- 你在使用
- ClassCastExceptionexception
- 太多的仿制药对你的脑细胞不利; 考虑搬到golang!
- 抛出:IllegalArgumentException
- 这有时可能意味着“阅读鱼类文档”
不太可能看到,
- 抛出:IllegalMonitorStateException
- 是的,不得不
synchronized
糟透了,但在大多数语言中都是如此
- 是的,不得不
- CloneNotSupportedException的
- 嘿,只是不要使用clone()。 不是复制构造者很酷吗?
然后你得到更多的NullPointerException。
然后……还是NullPointerException? @NotNull
注释是垃圾!
当您第100次测试新编写的代码时
由于竞争条件或罕见概率而发生的例外情况。 如果您在运行代码的前10次看到它们,就应该购买彩票。
- ConcurrentModificationException的
- 你的
synchronized
是在哪里
- 你的
- IllegalStateExceptionexception
- StackOverflowError(不是Exception)
- 你试过尾递归吗?
在编译,部署等过程中
它们通常发生在你搞乱依赖关系,使用错误版本的库等时。
- LinkageError类
- 的NoClassDefFoundError
- java.lang.XxxNotFoundException,java.lang.NoSuchXxxException(类,方法等)
- 请不要反思
当你太懒了
当你使用@lombok.SneakyThrows
或同等的时候
- RuntimeException的
- ? 扩展RuntimeException
预期的例外情况
如果他们没有被抓住,这可能意味着你也太懒了。 你不能阻止他们投掷; 你只需抓住它们。
高度的可能性
这些exception很有可能发生,应该始终专门处理(即你应该实际处理它们,而不是只输出错误)
- NumberFormatException的
- 我永远不明白为什么这个exception会扩展RuntimeException。
中等可能性
这些exception有时会由于无效的用户输入而发生(但您应该对它们进行真正的validation,因此我将这些exception归类为“意外exception”),并且有时会因为(非压力)测试时可能无法重现的系统约束而发生。
- IOException和其他java.io.XxxException
- 抛出:SecurityException
- StackOverflowException
- 不幸的是,去StackOverflow很可能无法修复你的StackOverflowExceptions,因为你在寻找Ctrl-C和Ctrl-V的东西时会得到更多的溢出堆栈
- StackUnderflowException
- 不,StackOverflow仍然没有多大帮助
- 的OutOfMemoryError
- 我希望这不是内存泄漏