一、什么是异常 异常 是一种对象 (Exception),表示组织程序正常执行的错误或情况
在程序运行的过程中,如果JVM检测出一个不可能执行的操作,就会出现运行时错误
在Java中,运行时错误(Running Error)会作为异常(对象)抛出
如果异常没有被处理,程序将会非正常终止
异常处理 - 使程序可以继续运行或者优雅地终止
方法抛出异常,调用者可以捕获以及处理该异常
恢复正常的程序执行
进行日志处理
以某些方式提醒用户(错误提示、对话框等)
以下是一个除法的例子,我们都知道除法运算中的除数不能为零,那么如果是零的话,会出现什么情况呢?
如果没有进行任何异常处理并记录在日志中:
1 2 int num1 = 1,num2 = 0,result; result = num1/num2;
编译器会直接报错
这只是一个异常,在以后会做一些大型的项目,如果写完程序后运行时,出现满屏的异常,这样就很不好,异常的日志直接记录下来,在屏幕上显示的内容少一点也更明确,从而使开发者能够一目了然,下面是加了异常处理的全新版本
1 2 3 4 5 6 7 8 int num1 = 1,num2 = 0,result; try{ result = num1 / num2; }catch(Exception ex){ System.err.println(ex.getMessage()); //记录在日志中 log.log(Level.WARNING,ex.getMessage()); }
二、异常类的层次结构
注意:
RuntimeException和Error以及他们的子类都成为免检异常。所有其他异常都称为必检异常(由于免检异常可能在程序的任何一个地方出现,为避免过多地使用try-catch块,Java语言不强制要求编写代码捕获异常)
三、常见的异常类型
四、如何进行异常处理 1.try catch(try catch finally)捕获异常 捕获异常结构:
1 2 3 4 5 6 7 8 9 try{ //可能出现异常的代码段 }catch(匹配的异常){ 解决办法//执行的代码段 }
异常捕获的语法 为try、catch、finally ,程序首先执行try 中的代码,当满足catch中的异常情况时执行catch 中的代码,catch可以有多个 ,最后执行finally 中的代码。
2.使用throw和throws抛出异常 这种方法是将异常抛出给JVM ,而使用throw抛出的异常是抛出一个对象 (因为Throwable类继承于Object类),throw可以单独使用也可以和try catch一起使用.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 public class ThrowDemo { public static void main(String[] args) { Hero hero = new Hero("貂蝉"); try { hero.setExp(1000); hero.setHealth(40); hero.rideHorse(); } catch (Exception e) { e.printStackTrace(); // System.err.print("在设置经验值时出现异常:" + e.getMessage()); } System.out.println("当前英雄的经验值:" + hero.getExp()); } } class Hero{ private String name; private long exp; private int health; public Hero(String name){ setName(name); } /** * 英雄的骑马方法 - 当英雄的健康值低于50时,不允许骑马 * @throws LessThanZeroException */ public void rideHorse() throws RideHorseException{ if(health >= 50) System.out.println(name + "正在快乐地骑马!"); else throw new RideHorseException(health); } public int getHealth() { return health; } public void setHealth(int health) { this.health = health; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getExp() { return exp; } public void setExp(long exp) throws Exception { if(exp >= 0) this.exp = exp; else//当exp为负数时,强制抛出异常 throw new LessThanZeroException((int)exp); } }
通过上面的例子可以更为全面的理解throw和throws如何使用以抛出异常
3.自定义异常 在定义异常时,必须是Throwable类的子类,如果检查异常就要继承自Exception,如果是运行异常就要继承自RuntimeException。下面通过例子来看下自定义异常如何定义使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 /** *自定义异常 - 小于零时触发 */ public class LessThanZeroException extends Exception{ //重写父类的两个构造方法即可 private int value; public LessThanZeroException(){ super("数字不能小于零!"); } public LessThanZeroException(int value){ super("输入的数字为:" + value + ",不能小于零!"); } }
Author:
Allen Xue
License:
Copyright (c) 2019 CC-BY-NC-4.0 LICENSE
Slogan:
To be or not to be,that is a question.