最常见的已检查和未检查的Java异常?

时间:2009-08-11 21:45:51

标签: java exception

据我所知,如果不逐一查找API文档,就无法找出方法抛出的异常。

由于这是不可取的,我想反转研究并询问您在处理时遇到的最常见的异常和运行时异常:

  • 铸造
  • 阵列
  • Vector,ArrayList,HashMap等
  • IO(文件类,流,过滤器,......)
  • 对象序列化
  • 主题(wait(),sleep()等)
  • 或其他被视为“基本Java”的内容

我意识到这可能是主观和无聊的,但这是一次课堂测试,我真的不知道更好。

10 个答案:

答案 0 :(得分:38)

除非另有说明,否则假设以下是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

答案 1 :(得分:28)

未选中的例外列表
ArrayIndexOutOfBoundsException异常
ClassCastException异常
抛出:IllegalArgumentException
IllegalStateException异常
NullPointerException异常
NumberFormatException的
Asse田
的ExceptionInInitializerError
的StackOverflowError
NoClassDefFoundError

已检查的例外列表
异常
IOException异常
FileNotFoundException异常
ParseException的
ClassNotFoundException的
CloneNotSupportedException的
InstantiationException
InterruptedException的
NoSuchMethodException
NoSuchFieldException

答案 2 :(得分:23)

<强>的NullPointerException

答案 3 :(得分:7)

java.lang:

  1. ArithmeticException
  2. ArrayIndexOutOfBoundsException异常
  3. ClassCastException异常
  4. ClassNotFoundException的
  5. CloneNotSupportedException的
  6. IllegalArgumentExcepion
  7. 抛出:IllegalMonitorStateException
  8. IllegalThreadStateException
  9. IndexOutOfBoundsException异常
  10. InterruptedException的
  11. 的NullPointerException
  12. NumberFormatedException
  13. java.util:

    1. ConcurrentModificationException的
    2. java.io:

      1. EOFException类
      2. FileNotFoundException异常
      3. IOException的
      4. NotSerializableException

答案 4 :(得分:3)

比尔K说。检查异常很容易。如果您的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];
}

这就是为什么我推荐这个:

  • 保护测试数量级比投掷和捕获异常更有效。
  • 保护测试更具可读性......代码行数更少。
  • 如果您遇到未经检查的异常,您可能永远无法确定它是否因您认为的原因而发生;例如:
    // obj might be null ...
    try {
        obj.doSomething();
    } catch (NullPointerException ex) {
        System.err.println("obj was null");  // WRONG!!!
        // the NPE could have happen inside doSomething()
    }
  • 如果未经检查的异常是由错误引起的,那么您需要堆栈跟踪并且(根据应用程序)您可能不想恢复。

显然,您只需要包含这些“警卫”检查,您对代码的理解会告诉您它们是必要的!所以,例如,如果你知道'obj'应该是非null并且'我'应该在范围内,那么最好不要检查。如果你遗漏了一个测试太多,你会得到一个异常...但这很好,因为你可以使用堆栈跟踪来弄清楚为什么你对代码的理解是错误的,并且可能修复底层错误。

答案 5 :(得分:3)

我想提供一个按情况分组的列表,这可能比按程序包或编程领域进行分组更有意义。

意外的异常

这些是理想情况下绝对不应在生产中抛出的异常。您应该修复它们,而不是抓住它们并st之以鼻。

当您测试新编写的代码(有时会被用户意外看到)

一旦看到它们,它们就永远不会再发生。

  • AssertionError
    • 恭喜,您编写的代码不错
    • 您应该为自己犯了这个错误感到高兴,因为更少(错误)更多(错误)
    • 希望您最终不会发现自己的代码是正确的,并且不小心弄断了断言
  • NullPointerException
    • 您的@NotNull在哪里?
    • 在使用Map.get()的返回值之前是否检查过?
  • ArrayIndexOutOfBoundsException
    • 您在使用List.get()之前检查过吗?
    • 我希望您对Java不是JavaScript,数组是固定大小并且不能仅仅array[array.length] = newElement
    • 有所了解。
  • ClassCastException
    • 太多的仿制药对您的脑细胞有害;考虑迁移到golang!
  • IllegalArgumentException
    • 这有时可能意味着“阅读 ing文档”

不太可能看到

  • IllegalMonitorStateException
    • 是的,必须synchronized很烂,但是在大多数语言中都是这样
  • CloneNotSupportedException
    • 嘿,只是不要使用clone()。复制构造函数不是很酷吗?

然后您将获得更多的NullPointerException。

然后...还是NullPointerException? @NotNull注释是垃圾!

第100次测试新编写的代码时

由于比赛条件或极少的机率而发生的异常。如果您在运行代码的前10次看到彩票,就应该买彩票。

  • ConcurrentModificationException
    • ?您的synchronized在哪里
  • IllegalStateException
  • StackOverflowError(并非异常)
    • 您尝试过尾递归吗?

在编译,部署等过程中

它们通常在您弄乱依赖项,使用错误版本的库等时发生。

  • LinkageError
  • NoClassDefFoundError
  • java.lang.XxxNotFoundException,java.lang.NoSuchXxxException(类,方法等)
    • 请不要反省

当你太懒了

以及使用@lombok.SneakyThrows或同等功能

  • RuntimeException
  • ?扩展RuntimeException

预期的异常

如果他们没有被抓住,这可能意味着您也太懒了。你不能阻止他们扔;您只需要抓住它们即可。

高可能性

这些异常的发生可能性很高,应始终进行专门处理(即,您应该实际处理它们,而不仅仅是输出错误)

  • NumberFormatException
    • 我从不理解为什么此异常扩展了RuntimeException。

中等喜好

这些异常有时是由于无效的用户输入而发生的(但是您应该对其进行真正的验证,所以我将它们归类为“意外异常”),并且有时是由于(非压力)测试时可能无法再现的系统约束而发生的

  • IOException和其他java.io.XxxException
  • SecurityException
  • StackOverflowException
    • 不幸的是,进入StackOverflow很可能不会解决您的StackOverflowExceptions,因为您在寻找Ctrl-C和Ctrl-V时会得到更多的溢出堆栈
  • StackUnderflowException
    • 不,StackOverflow仍无济于事
  • OutOfMemoryError
    • 我希望这不是内存泄漏

答案 6 :(得分:1)

检查异常很简单,编辑器应在悬停/完成方法名称时显示javadoc。

未经检查通常是实际错误,甚至在javadoc中也不常见。我猜最常见的可能是IllegalArgumentException,任何有可能无效参数组合的方法都应抛出它。

答案 7 :(得分:1)

如何查找java.lang.exception的子类,例如here

我个人使用自己的TransientException的2个已检查异常来处理重试可能有效的情况。和验证错误的InvalidRequestException。

答案 8 :(得分:1)

NumberFormatException的

答案 9 :(得分:0)

  • Casting - ClassCastException

  • 数组 - ArrayIndexOutOfBoundsException

  • Vector,ArrayList,HashMap等 - 我在使用Java集合时很少看到异常,但偶尔会出现ConcurrentModificationException

  • IO(文件类,流,过滤器,...) - FileNotFoundException

  • 对象序列化 - ClassNotFoundException

  • 线程(wait(),sleep()等) - 根据我的经验,线程问题通常以随机方式表现出来,而不是异常特定的。必须处理InterruptedException会占用很多时间,尽管我没有看到实际抛出的异常。

  • 或其他被认为是“基本Java”的东西 - 到目前为止,我体验中最常见的例外是NullPointerException。