Java异常处理分为两种处理方式。
第一种
try{
可能存在异常,想要捕获异常的代码块
}catch(想要捕获的一场类型,可以是Java定义的Exception异常类,也可以是自定义的异常类){
捕获到异常后的操作处理,即使不填为空,Java也认为只要catch捕获到此处就已经处理了。若只是打印异常原因的话,
使用System.out.println(“语句”);只会单纯的做了打印此句话的处理,不会告知你异常的真正原因,以及异常出现的路径。
使用默认打印语句 e.printStackTrace();则不仅会输出异常原因的语句,同时显示此异常出现的所有追踪代码行号
}finally{
finally必须和catch语句同时使用,无论catch中是否捕获到异常,该句语句都会执行。比如try中由5行代码,3行时catch捕获到了异常,则45行代码不再执行,直接执行finally中语句。比如打开文件输入内容,发现文件里内容已满,无法再输入,捕获到了此异常,但是实际应用中需要关闭此文件,以免占用,影响对该文件的其他操作,此时就可以加入finally语句中,添加关闭文件的操作,此语句不会因为catch到异常而不被执行。
}
第二种
throw new Exception(“一般填异常原因”);单行想要抛出异常使用throw,一个方法内部可能会抛出多个异常,所以方法名后抛出异常使用throws,throw抛出异常如果自己不做处理操作,则会抛给上一级,例如方法1中包含方法2,方法2中抛出了异常但是方法2中未做处理,则将此异常抛给方法1,同理,如果一直未处理,一直向上级抛,直到抛给main方法后,再抛给Java环境中,Java环境进行处理。
两种异常处理方法也可以同时使用,比如存在两个异常,我只想catch其中一个,另一个异常不想做处理直接让其抛出。
//银行取款异常
public class Bank {
public double balance; //存款
//增加存款
public Bank(double balance){
this.balance = balance;
}
//根据取款金额dAmount与存款金额balance的关系,判断取款结果.getMoney方法内部抛出异常未做处理,所以抛给了getMoney方法,所以此时该方法后需要加throws继续跑异常给上一级(此处也可以成MyException),同理main方法后也需要抛异常给最终的Java环境。
public void getMoney(double dAmount) throws Exception{
if (dAmount>balance) {
throw new MyException("取款大于存款");
} else if(dAmount<0) {
throw new MyException("取款为负数");
}else {
System.out.println("取款成功");
}
}
//若将上述代码块同时使用try catch,若catch捕获到了该异常,则Java就认为异常已经被处理,继续执行下面代码,无需在方法后面加入throws再抛出异常了,如果仍然加throws,因为有catch加了也没有意义,前提是此代码块中除了MyException异常,不存在Exception异常(除法时自定除数为负数为自定义异常,那么同时使用两种方法,因为可能存在除数为0的Java异常,此时catch自定义异常,throwsException异常,同时使用两种处理方法是仍然有意义,)
/* try{上述代码作为代码块} catch(MyException e){
e.printStackTrace() //
}*/
public static void main(String[] args) throws Exception {
Bank bank = new Bank(2000);
bank.getMoney(300);
bank.getMoney(3000);//抛出取款大于存款异常,下面代码不再执行
bank.getMoney(-200);
}
}
class MyException extends Exception{
public MyException1(String message) {
super(message);
}
}