Java中异常分哪两类,有什么区别?

面试回答

Java 中的异常,主要分为两大类,即受检异常(checked exception)和非受检异常(unchecked exception)

对于受检异常来说,如果一个方法在声明的过程中证明了其要有受检异常抛出:

public void test() throws Exception{}

那么,当我们在程序中调用他的时候,一定要对该异常进行处理(捕获或者向上抛出),否则是无法编译通过的。

这是一种强制规范。

这种异常在 IO 操作中比较多。比如 FileNotFoundException,当我们使用 IO 流处理一个文件的时候,有一种特殊情况,就是文件不存在,所以,在文件处理的接口定义时他会显示抛出 FileNotFoundException,其目的就是告诉这个方法的调用者,我这个方法不保证一定可以成功,是有可能找不到对应的文件的,你要明确的堆这种情况做特殊处理。

所以说,当我们希望我们的方法调用者,明确的处理一些特殊情况时候,就应该使用受检异常。

对于非受检异常来说,一般是运行时异常,继承自 RuntimeException。在编写代码的时候,不需要显示的捕获,但是如果不捕获,在运行期如果发生异常就会中断程序的执行。

这种异常一般可以理解为是代码原因导致的。比如发生空指针、数组越界等。所以,只要代码写的没问题,这些异常都是可以避免的。也就不需要我们显示的进行处理。

试想一下,如果你要对所有可能发生空指针的地方做异常处理的话,那相当于你的所有代码都需要做这件事。

知识扩展

什么是 Throwable

Throwable 是 java 中最顶级的异常类,继承 Object,实现了序列化接口,有两个重要的子类:ExceptionError,二者都是 Java 异常处理的重要子类,各自包含大量子类。

Error 和 Exception 的区别和联系

error 表示系统级的错误,是 java 运行环境内部错误或者硬件问题,不能指望程序来处理这样的问题,除了退出运行外别无选择,它是 Java 虚拟机抛出的。如 OutOfMemoryErrorStackOverflowError这两种常见的错误都是 Error

exception 表示程序需要捕捉、需要处理的异常,是由与程序设计的不完善而出现的问题,程序必须处理的问题。

分为 RuntimeException和其他异常。

请列举几个常用的 RuntimeException

这个题目,其实面试官考的还挺多的,主要考察面试者实战经验是否丰富,所以常见的 RuntimeException要能回答得尽量多回答一些。

  1. AnnotationTypeMismatchException:注释类型不匹配异常
  2. ArithmeticException:算术异常
  3. ArrayStoreException:数组存储异常
  4. BufferOverflowException:缓冲区溢出异常
  5. BufferUnderflowException:缓冲区下溢异常
  6. CannotRedoException:无法重做异常
  7. CannotUndoException:无法撤消异常
  8. ClassCastException:类转换异常
  9. CMMException:CMM异常
  10. ConcurrentModificationException:并发修改异常
  11. DataBindingException:数据绑定异常
  12. DOMException:DOM异常
  13. EmptyStackException:空栈异常
  14. EnumConstantNotPresentException:枚举常量NotPresentException
  15. EventException:事件异常
  16. FileSystemAlreadyExistsException:文件系统已存在异常
  17. FileSystemNotFoundException:文件系统未发现异常
  18. IllegalArgumentException:非法参数异常
  19. IllegalMonitorStateException:非法监视器状态异常
  20. IllegalPathStateException:非法路径状态异常
  21. IllegalStateException:非法状态异常
  22. IllformedLocaleException:错误的区域设置异常
  23. ImagingOpException:成像操作异常
  24. IncompleteAnnotationException:不完整注释异常
  25. IndexOutOfBoundsException:索引越界异常
  26. JMRuntimeException:JM运行时异常
  27. LSException:LS异常
  28. MalformedParametersException:格式错误的参数异常
  29. MirroredTypeException:镜像类型异常
  30. MissingResourceException:缺少资源异常
  31. NegativeArraySizeException:负数组大小异常
  32. NoSuchElementException:没有这样的元素异常
  33. NoSuchMechanismException:无此类机制异常
  34. NullPointerException:空指针异常
  35. ProfileDataException:配置文件数据异常
  36. ProviderException:提供者异常
  37. ProviderNotFoundException:提供者未发现异常
  38. RasterFormatException:光栅格式异常
  39. RejectedExecutionException:拒绝执行异常
  40. SecurityException:安全异常
  41. SystemException:系统异常
  42. TypeConstraintException:类型约束异常
  43. TypeNotPresentException:类型不存在异常
  44. UndeclaredThrowableException:未声明的ThrowableException
  45. UnknownEntityException:未知实体异常
  46. UnmodifiableSetException:不可修改集异常
  47. UnsupportedOperationException:不支持的操作异常
  48. WebServiceException:Web服务异常
  49. WrongMethodTypeException:错误方法类型异常

说一说 Java 异常处理相关的几个关键字,以及简单用法

throws、throw、try、catch、finally

  1. try 用来指定一块预防所有异常的程序
  2. catch 字句紧跟在 try 块后面,用来指定你想要捕获的异常的类型
  3. finally 为确保一段代码不管发生什么异常状况都要被执行
  4. throw 语句用来明确地抛出一个异常
  5. throws 用来声明一个方法可能抛出的各种异常

什么是自定义异常,如何使用自定义异常?

自定义异常就是开发人员自己定义的异常,一般通过继承 Exception 的子类的方式实现。

编写自定义异常实际上是继承一个 API 标准异常类,用新定义的异常处理信息覆盖原有信息的过程。

这种用法在 Web 开发中也比较常见,一般可以用来自定义业务异常。如余额不足、重复提交等。这种自定义异常有业务含义,更容易让上层理解和处理。

你可能感兴趣的:(Java,java,开发语言)