最常见的已检查和未检查的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中:

  1. ArithmeticException
  2. ArrayIndexOutOfBoundsExceptionexception
  3. ClassCastExceptionexception
  4. ClassNotFoundException的
  5. CloneNotSupportedException的
  6. IllegalArgumentExcepion
  7. 抛出:IllegalMonitorStateException
  8. IllegalThreadStateException
  9. IndexOutOfBoundsExceptionexception
  10. InterruptedException的
  11. 空指针exception
  12. NumberFormatedException

java.util中:

  1. ConcurrentModificationException的

java.io:

  1. EOFException类
  2. FileNotFoundExceptionexception
  3. IOExceptionexception
  4. 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
    • 我希望这不是内存泄漏