java中的异常

31 篇文章 0 订阅
12 篇文章 0 订阅

异常:异常就是Java程序在运行过程中出现的错误。
案例小故事(此案例仅教学使用,生活中若有雷同,概不负责)
举例:今天天气很好,班长想去爬大蜀山,骑哈罗单车去,去山里呼吸新鲜空气
问题1:山路突然崩塌了,还好班长及时停住,但是过不去了,这属于严重问题
问题2:班长开着一辆哈罗单车,开到一半突然发现单车没电了,路途中换一辆开,然后就顺利地
达到大蜀山。这样的问题应该是在出发之前考虑到的。
问题3:班长正在骑车欣赏风景,发现前面的路不太好走,都是小石子,旁边有一个平坦的路
他偏偏不走平坦的路,就喜欢走小石子上面,结果车倒了。
这样的问题是骑车过程中出现了问题。
Java中的异常:Throwable
严重的问题:Error,一般情况下,我们不处理这样的问题,
举例今后会出现的情况:OOM,Out Of Memory,内存溢出的问题。
异常:Exception
运行时期异常:RuntimeException,这样的问题我们也不处理,因为这样类似的问题
一般情况下都是由于你的代码不够严谨导致的。
编译时期异常:
除了不是RuntimeException的,都是编译时期异常,必须要处理,如果你不处理
编译不通过,无法运行。
如果程序出现了问题,我们没有做任何出口i,最终JVM会给出一个默认的处理方式,
把异常类的名称,相关的原因,以及出现问题的相关信息和位置信息输出在控制台,同时
java程序会结束,后面的代码不会执行。

//日期转换是我们开发中经常使用
// //HH大写的表示24小时制度
// //hh小写的表示12小时制度
// SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);

异常处理方式:
1、try…catch…finally
2、throws
try…catch…finally处理格式:
try{
可能会出现问题的代码;
}catch(异常的类名 变量名){
针对问题的一些处理;
}finally{
无论包不报错都会执行的代码;
(一般情况下,这里放的都是一些释放资源的代码)
}
finally: 最终的意思
在try…处理异常的时候,末尾通常情况下会添加一个finally
被它控制的语句体,一定会执行,一般情况下,里面放的是与释放资源相关的代码

String s = "2021-12-24 14:32:12";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
    Date date = sdf.parse(s);
    System.out.println(date);
}catch (ParseException e){
    e.printStackTrace();
}finally {
    //无论报不报错都会执行
    System.out.println("这里的代码一定会执行!!!");
}

 变形格式:
   try{
       可能会出现问题的代码;
   }catch(异常的类名 变量名){
       针对问题的一些处理;
   }
int[] arr = null;
try {
    System.out.println(arr.length);
}catch (NullPointerException e){
    System.out.println("空指针异常");
}
处理多个异常的格式:
   try{
       可能会出现问题的代码1;
       可能会出现问题的代码2;
   }catch(异常的类名1 变量名1){
       针对问题的一些处理;
   }catch(异常的类名2 变量名2){
       针对问题的一些处理;
   }
try {
            Date date = sdf.parse(s);
            //如果在try里面的代码中间报错了
            //会直接匹配catch里面的异常
            //try中剩下的代码不会执行
            System.out.println(date);
            System.out.println("world");
//            System.out.println(arr[4]);
            System.out.println(arr.length);
        }catch (NullPointerException e){
            System.out.println("空指针异常");
        }catch (Exception e){
            System.out.println("日期转换出现错误啦!!!");
        }

多个catch注意事项:
1、能明确异常类型的时候,尽量明确类型,不要用父类大的做处理
2、catch与catch之间的异常是平级关系,多个catch异常之间没有先后顺序关系,一旦出现了一个
父类继承关系,父必须在最后
3、一旦try里面的代码出现了问题,就会去匹配catch里面的异常,
继续执行程序try…catch…后面的代码,try里面的代码就停在了报错的那一步。

JDK1.7之后针对多个异常处理新的处理方式:
try{
可能会出现问题的代码;
}catch(异常类名1 | 异常类名2 | … 变量名){
处理异常的提示;
}
注意事项:
1、处理方式是一致的,这个方法虽然比较简洁,但是不够好,针多种类型的问题,
只给出了一种解决方案
2、catch中多个异常类型之间的关系必须是平级关系,不能存在继承关系

异常中需要掌握的方法:

getMessage()   打印的是出现异常的原因
        获取异常信息,返回字符串。
toString()  异常的类名: 产生问题的原因
        获取异常类名和异常信息,返回字符串。
printStackTrace()
     获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void

在今后的开发过程中,有些情况我们根本没有权限去做一些处理异常
或者说,我们根本就处理不了,干脆就不处理。
为了解决这样的问题,并且还能保证程序正常运行的情况下
Java针对这种情况,提供了另外一个解决异常的方式:throws抛出(跟在方法后面)
格式:
throws 异常类名
在哪里写呢?在方法小括号后面,左大括号之前
注意事项:
1、main方法上个尽量不要进行异常抛出,因为程序会停止,后面代码不会执行
但是,我上课的时候为了方便你们看代码,我就直接抛出,
做开发的时候,不要在main方法。
2、编译时期的异常抛出,方法内部不需要做处理,是由将来调用该方法的调用者处理
3、运行时期异常可以不抛出,但是一旦调用,出错后,后面的代码依旧不会执行
4、最好抛出一个具体的异常类型,也是推荐这么做的,可以抛出多个异常,用逗号隔开

throw
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
表示抛出异常,由方法体内的语句处理
throw则是抛出了异常,执行throw则一定抛出了某种异常
throws和throw的区别:
throws:
用在方法的声明后面,跟的是异常的类名
可以跟多个异常类名,用逗号隔开
表示的是可能会发生的异常,抛出给调用者处理,表示的是一种可能性,
不一定会发生这种异常
throw:
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
表示抛出异常,由方法体内的语句处理
throw则是抛出了异常,执行throw则一定抛出了某种异常

***面试题:

    final,finally和finalize的区别***
    final:最终的意思,可以修饰类,成员变量,成员方法
        修饰类:类不能被继承
        修饰成员变量:变量变常量
        修饰成员方法:方法不能被重写
    finally:是异常处理的一部分,一般情况下用于释放资源的作用,一般情况下都会执行
        特殊情况下: System.exit(0);
    finalize: 是Object类中的一个方法名,用于手动垃圾回收,但是不一定调用就开始回收。

如果catch里面有return语句,请问finally的代码还会执行吗?
如果会,请问是在return前还是return后。return之间
异常注意事项:
1、子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
2、如果父类抛出了多个异常,子类重写父类时,
只能抛出相同的异常或者是他的子集,子类不能单独抛出父类没有的异常
3、如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,
如果子类方法内有编译时期异常发生,那么子类只能try,不能throws

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值