运行时的异常
1.异常处理:
异常是可以被我们的程序处理的,为了提高代码的健壮性。
错误:error 不能被代码处理的。
异常出现了,如果我们不处理异常,默认是一层层向上抛出异常,最后由jvm打印出来,程序此时暂停了,就运行不了。
2.try… catch (Exception e)
try中的是可能出现异常的代码, catch是将这个出现的异常捕捉,Exception是异常的超级类,e是该异常对象
异常有很多类型的,Exception是广泛的,具体的有一些异常是ArrayOutOfIndex 这个是数组越界的异常。。
3.多异常处理:
try…catch(ArrayStoreException e){
//…
}catch(Exception e){
}
就是多个catch 来捕捉不同的异常。但是如果你要放Exception来捕捉异常,那么这个超类一定要放在后面一个,前面一个放子类异常类,比如这里的ArrayStoreException .
4.try …catch… finally
finally内的代码即使在出异常了,也会执行。 finally内主要处理一些收尾工作,和一些资源的关闭工作。。。
由于之前出错,出现异常,导致一些资源打开之后,没能关闭,因此需要加finally,来关闭打开的资源。。。
5.自定义异常
由于自定义异常99%都是在运行时的异常,因此继承RuntimeException类,就行了。
快捷键:ctrl +O 快速重写父类方法
(1).先自定义异常类
/**自定义的StockException异常类*/
public class StockException extends RuntimeException{
public StockException() {
super();
}
public StockException(String message) {
super(message);
}
public StockException(String message, Throwable cause) {
super(message, cause);
}
public StockException(Throwable cause) {
super(cause);
}
protected StockException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
(2).抛自定义异常并处理异常:
语法:throw new <自定义异常类>();
package cn.tx.demo;
public class Person{
public static void main(String[] args) {
//处理异常
try {
submitOrder(6);
} catch (Exception e) {
System.out.println("知道异常了");
} finally {
System.out.println("异常处理完毕");
}
}
public static void submitOrder(int stock){
if(stock>5){
//向上抛出异常,向调用端抛出异常。
throw new StockException("库存不足"+stock);
}
System.out.println("购买成功");
}
}
说明:异常一旦出现了,后面的代码时不会继续执行的。 程序就暂停了。
try-catch:没有资源需要释放,仅仅是处理异常
try-catch-catch-catch-catch:对应的是被调用的函数,抛出多个异常的情况,分别处理,
子父类异常,子类在前,父类在后
try-finally:不一定需要处理异常,但需要对资源的整合
throw方法内抛出异常,thorows方法外抛出异常