异常处理

Error表示严重的错误,程序对此一般无能为力,例如:

  • OutOfMemoryError:内存耗尽
  • NoClassDefFoundError:无法加载某个Class
  • StackOverflowError:栈溢出

Exception则是运行时的错误,它可以被捕获并处理。

某些异常是应用程序逻辑处理的一部分,应该捕获并处理。例如:

  • NumberFormatException:数值类型的格式错误
  • FileNotFoundException:未找到文件
  • SocketException:读取网络失败

还有一些异常是程序逻辑编写不对造成的,应该修复程序本身。例如:

  • NullPointerException:对某个null的对象调用方法或字段
  • IndexOutOfBoundsException:数组索引越界
  1. // 异常捕获语法格式
  2. try{
  3. // 可能会发生异常的代码
  4. }catch(异常类型 e){
  5. System.out.println(e); // 打印异常信息
  6. }
  7. try{
  8. // 可能会发生异常的代码
  9. }catch(Exception e){ // Exception万能捕获
  10. System.out.println(e); // 打印异常信息
  11. }
  12. // 可以用catch捕获多个
  13. // 需要注意的是多个catch语句只有一个能被执行,子类必须写在前面,不然不会被捕获
  14. try{
  15. // 可能会发生异常的代码
  16. }catch(异常类型 e){
  17. System.out.println(e); // 打印异常信息
  18. }catch(异常类型 e){
  19. System.out.println(e); // 打印异常信息
  20. }catch(异常类型 e){
  21. System.out.println(e); // 打印异常信息
  22. }catch(异常类型 e){
  23. System.out.println(e); // 打印异常信息
  24. }catch (IOException | NumberFormatException e) {
  25. // 如果两个异常的代码相同,我们可以用|把他们连接在一起
  26. System.out.println("Bad input");
  27. } finally {
  28. System.out.println("END");
  29. // 不论有没有错误都会执行,保证一些代码必须执行,有时可写可不写
  30. }

抛出异常

  1. 调用printStackTrace()可以打印异常的传播栈,对于调试非常有用;
  2. 捕获异常并再次抛出新的异常时,应该持有原始异常信息;
  3. 通常不要在finally中抛出异常。如果在finally中抛出异常,应该原始异常加入到原有异常中。调用方可通过Throwable.getSuppressed()获取所有添加的Suppressed Exception

自定义异常