为了账号安全,请及时绑定邮箱和手机立即绑定

java 异常的简单理解(十分钟理解异常)

标签:
Java 产品
   异常的出现是很正常的事情,这也可以算是现实的映射,来源于现实。现实中突发情况就很多。但说实话有很少见,不过既然遇到了,怎么办。说到底分为能处理的与不能处理的。

   能处理的就自己处理,方法就是try-catch。Try标记可能出现异常的代码,catch注释出现异常的情况。e.printStackTrace();就是控制台输出。

 (看这篇文章,最好先不看代码,通篇快速浏览下来,顺着一个思路就能更快的理解异常,然后根据你的理解再看代码,就能一目了然了。这样更顺畅。不会被代码打断思路。)

try {
System.out.println("请输入除数:");
num1=in.nextInt();
System.out.println("请输入被除数:");
num2=in.nextInt();
System.out.println("商"+num1/num2);
System.out.println("");
System.out.println(String.format("%d/%d=%d", num1,num2,num1/num2));

} catch (Exception e) {
    System.out.println("出现错误,被除数必须是整数,除数不能是0.");
    e.printStackTrace();
}

   不能处理的就抛给别人,当然不能抛给不如自己的人,只能向上一级抛出。这就是throw方法。

   因为异常有很多种类型,所以如同方法重载一样,要用多种方法来避免漏洞,在try-catch里面就是用多个catch处理不同类型的异常。
  顺便说一句实话,多重catch在公司具体的项目中大多数时候是只需捕捉Exception就可以了。也就是只需要一个catch就足够了,代码简化吗!不然还可能被骂。

catch (InputMismatchException e) {
System.out.println("输入类型不匹配异常"+"此处的被除数必须是整数。");
}
catch (ArithmeticException e) {
System.out.println("算数异常"+"被除数不能为0");}

    catch (Exception e) {
        System.out.println("其他未知异常。");
        e.printStackTrace();
        //System.exit(3);
        //return;
    }
    finally{

    System.out.println("感谢使用本程序。");
    }
   其排列的顺序跟switch产不多,尽量按照顺序,按照从子类到父类的顺序,而子类可以有很多个,所以算是平行关系,而对于父类则是因为不确定是什么异常,或者不确定是否已经涵盖了所有异常,所以最后用一个父类exception模糊化处理可能未知的异常。如同switch最后用了一个——default。

   而在异常处理里面为了更保险,不仅有父类收尾,还加了一个finally语句块。这个比default更进一步。就是说无论前面你是否能够处理好异常都要执行这一步。比如现实中不管你能否处理都要第一时间向领导反映。这算是最保险的枷锁了。二重保险。

   Finally在数据库中应用的比较多。在对数据库进行操作的时候,

1,建立跟数据库的连接,1,对数据库增删改查等的操作。3,释放连接。掐断连接。
这个第三步就可以放在finally语句块里面。执行掐断与数据库连接的语句,不然的话,你的程序将一直占用这条连接,使得其他打算使用这个连接的程序只能一直等待。还占用大量内存。

   对于不能处理的只能向上抛出。但是在程序中,你又不知道谁会调用你的代码,这样你就暂时不知道谁是你的上级,所以暂时你只能声明异常,对可能出现异常的地方做一个标记——throws。说明这部分代码可能出现异常,让调用者慎用。

    谁调用谁处理。如果调用者也不想处理,就继续向上抛出。或者说标记。

public void setSex(String sex) throws Exception {
if (sex.equals("男")sex.equals("女")) {
this.sex = sex;
}else {
System.out.println("输入错误");
}}}
还有一种极端的情况,你的上级也不会或者懒得处理,于是继续抛出,再抛出,多抛出几次就道门程序的大门口,main方法哪里去了,在接着抛出,就抛给了java虚拟机,毕竟我们所有的程序都是运行在虚拟机上面的。这可以算是推卸责任的最佳写照了。

    可是你又不想让上级觉得你敷衍了事,无能为力,就尝试着给出自己的意见,试着找到异常,旁边注释着写上自己认为的异常处理意见。对了可以博得上级的赏识,错了也说明自己努力了。这就是throw。

public void setSex(String sex) throws L9 {
if (sex.equals("男")sex.equals("女")) {
this.sex=sex;}
else {
throw new L9("性别必须是男或者女");
}
}
throws是名词标记的意思。throw是动词抛出注释的意思。throws对于整个代码块,throw处于代码块内部。

   知道了这些,照着代码理解一遍。基本上就达标了,听前辈说什么自定义异常,异常链什么的在项目中很少遇到。sun公司自己定义的异常就有几十种,大部分我们都不需要,也用不到,哪里还需要自己去自定义吗?

   对于异常来说,基本上能处理的就尽量自己处理,不能处理的就做个标记就行。这就足够了。其他的只需作为了解就行。当然深入了更好。

  说点题外话,如果面试的时候考官问你,遇到过异常吗?你肯定不能说没遇见过异常。这不能证明你的技术多牛,谁都是从菜鸟磕磕碰碰走过来的,除非你不敲代码。或者你就是说谎。所以结果可想而知。前面说了你可以不必处理具体的异常,但是你一定要明白他给你的提示是什么意思,这是帮助你改进优化自己代码的提示,所以必须明白。

  甚至我们应该学会所有的java报错提示。英语的提示。听前辈说,如果你想在一线城市立足,英语是必不可少的,不然面试关就过不去。六级能给你加不少分。当然三四线城市就无所谓,还有普通话也是必不可少的,可惜这两样我都不行,需要补课的地方还有很多。如果哪位同学有这方面的资料。不吝赐教,谢谢。

图片描述

图片描述

在所有的异常中,最重要的一个异常是空指针异常。
所以下面的一个例子希望能对大家对空指针异常有更清晰的认识。set/get方法都省略了。继承与否无关。如下:

//年级类public class Gread {
Student student;
}
//学生类
public class Student {
private String name1;
}
//测试类
public static void main(String[] args) {

Gread gread =new Gread();//第一种情况
//Student student=new Student();//去掉注释的第二种情况。
//gread.setStudent(student);//去掉注释的第三种情况。

    System.out.println(student.getName1());
    System.out.println(gread.getStudent());
    System.out.println("********");
    System.err.println(gread.getStudent().getName1());  
}

}
空指针的原因主要是未实例化,也就是未曾赋值。不管是默认的还是自定义的。

点击查看更多内容
15人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消