Java异常学习

NO.1 简单异常演示
public static void main (String[] args) {
        //Java异常学习--Exception
        /**
         * * A:JVM默认是如何处理异常的
         * main函数收到这个问题时,有两种处理方式:
         * a:自己将该问题处理,然后继续运行
         * b:自己没有针对的处理方式,只有交给调用main的jvm来处理
         * jvm有一个默认的异常处理机制,就将该异常进行处理.
         * 并将该异常的名称,异常的信息.异常出现的位置打印在了控制台上,同时将程序停止运行
         * B:案例演示
         * JVM默认如何处理异常
         */

     Demo3 d = new Demo3();
    // int x = d.div(10,2);
   //这样正常调用是没问题的
        int x = d.div(10,0);
        //我们让除数为0.就会抛出异常
        System.out.println(x);//java.lang.ArithmeticException
       //以后我们看错误从后往前看,先来到出错的每一行,最后看运行时异常
    }

}
class  Demo3 {
    public int div(int a, int b) {
        return a / b;
    }
}

NO.2 异常处理的方式
#第一种
public static void main (String[] args) {
        /**
         * * A:异常处理的两种方式
         * a:try⋯catch⋯finally
         * try catch
         * try catch finally
         * try finally 
         * b:throws
         * B:try...catch处理异常的基本格式
         * try⋯catch⋯finally
         * C:案例演示
         * try...catch的方式处理1个异常

         try:用来检测异常的
         catch:用来捕获异常的
         finally:释放资源

         世界上最真情的相依就是你在try我在catch,无论你发神马脾气,我都静静接受,默默处理
         当通过trycatch将问题处理了,程序会继续执行
         */
      
            Demo2 d = new Demo2();
            try{
                int x = d.div(10, 0);
                System.out.println(x);
            }catch(ArithmeticException a) {     //ArithmeticException a = new ArithmeticException();
                System.out.println("出错了,除数为零了");
            }
              //我们经过主动异常处理,就可以继续执行程序了
              System.out.println("1111111111111111");
        }

    }
    class Demo2 {
        /*
         * 除法运算
         */
        public int div(int a,int b) {       //a = 10,b = 0
            return a / b;                   // 10 / 0  被除数是10,除数是0当除数是0的时候违背了算数运算法则,抛出异常
            //new ArithmeticException("/ by zero");
        }
    } 

#第二种
/**
     * * A:案例演示
     * try...catch的方式处理多个异常
     * JDK7以后处理多个异常的方式及注意事项
     * 
     * 安卓,客户端开发,如何处理异常?try{}catch(Exception e){}
     * ee,服务端开发,一般都是底层开发,从底层向上抛
     * 
     * try后面如果跟多个catch,那么小的异常放前面,大的异常放后面,根据多态的原理,如果大的放前面,就会将所有的子类对象接收
     * 后面的catch就没有意义了
     */
    public static void main(String[] args) {
        //demo1();
        int a = 10;
        int b = 0;
        int[] arr = {11,22,33,44,55};
        
        //JDK7如何处理多个异常
        try {
            System.out.println(a / b);
            System.out.println(arr[10]);
        } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
            System.out.println("出错了");
        } 
    }

    public static void demo1() {
        int a = 10;
        int b = 0;
        int[] arr = {11,22,33,44,55};
        
        try {
            System.out.println(a / b);
            System.out.println(arr[10]);
            arr = null;
            System.out.println(arr[0]);
        } catch (ArithmeticException e) {
            System.out.println("除数不能为零");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("索引越界了");
        } catch (Exception e) {             //Exception e = new NullPointerException();
            System.out.println("出错了");
        }
        
        System.out.println("over");
    }
}

NO.3 编译时异常和运行时异常的区别
//Java中的异常分为编译期和运行期异常
        //写个编译期异常--编译时异常可以理解为未雨绸缪异常
        //编译时异常就是必须对其进行处理,不然编译是不通过的
        //这个FileInputStream就是读取文件的,现在在自动编译的时候就报错了。
        //因为我们这个文件路径可能是错误的,就读取不到,所以我们做下处理

        //运行时异常:就是程序员的代码错误,需要程序员回来修改代码

        try {
            FileInputStream stre = new FileInputStream("tmac.xxx");
        }catch (Exception e){

        }

NO.4 Throwable的几个常见方法
/**
     * * A:Throwable的几个常见方法
            * a:getMessage()
                * 获取异常信息,返回字符串。
            * b:toString()
                * 获取异常类名和异常信息,返回字符串。
            * c:printStackTrace()
                * 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
        * B:案例演示
            * Throwable的几个常见方法的基本使用
     */
    public static void main(String[] args) {
        try {
            System.out.println(1/0);
        } catch (Exception e) {         //Exception e = new ArithmeticException("/ by zero");
            //System.out.println(e.getMessage());       //获取异常信息
            //System.out.println(e);        //调用toString方法,打印异常类名和异常信息
            e.printStackTrace();        //jvm默认就用这种方式处理异常
        }
    }
}

NO.5 throws抛出异常的处理方式
/**
     * * A:throws的方式处理异常
            * 定义功能方法时,需要把出现的问题暴露出来让调用者去处理。
            * 那么就通过throws在方法上标识。
        * B:案例演示
            * 举例分别演示编译时异常和运行时异常的抛出
            * 编译时异常的抛出必须对其进行处理
            * 运行时异常的抛出可以处理也可以不处理
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        Person p = new Person();
        p.setAge(-17);
        System.out.println(p.getAge());
    }

}

class Person {
    private String name;
    private int age;
    public Person() {
        super();
        
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) throws AgeOutOfBoundsException {
        if(age >0 && age <= 150) {
            this.age = age;
        }else {
            //Exception e = new Exception("年龄非法");
            //throw e;
            throw new AgeOutOfBoundsException("年龄非法");
        }
      }
    }

NO.6 finaly关键字的作用和特点
/**
     * * A:finally的特点
            * 被finally控制的语句体一定会执行
            * 特殊情况:在执行到finally之前jvm退出了(比如System.exit(0))
        * B:finally的作用
            * 用于释放资源,在IO流操作和数据库操作中会见到
        * C:案例演示
            * finally关键字的特点及作用
        *return语句相当于是方法的最后一口气,那么在他将死之前会看一看有没有finally帮其完成遗愿,如果有就将finally执行
        *后在彻底返回
     */
    public static void main(String[] args) {
        try {
            System.out.println(10/0);
        } catch (Exception e) {
            System.out.println("除数为零了");
            System.exit(0);                             //退出jvm虚拟机
            return;
        } finally {
            System.out.println("看看我执行了吗");
        }
    }

NO.7 简单面试题
//面试题
      //final,finally和finalize的区别
        //final:可以修饰类,不能被继承,修饰方法,不能被重写,修饰变量,只能赋值一次
        //finally:是try语句中的一个语句体,不能被单独使用,用来释放资源
        //finalize:是一个方法,当垃圾回收器确定存在对该对象的过多引用时,由该对象的垃圾回收器调用此方法

        //第二题:
        //问:如果catch里面有return语句,finally的代码还会执行吗?如果会,请问是在return前还是return后
        //答:是在return先建立返回路径,然后执行finally语句,最后返回
        //看这个例子
        Test test = new Test();
       int num =  test.method();
        System.out.println(num);
    }
}

class Test {
  public  int method(){
        int x = 10;
        try{
            x = 20;
            System.out.println(1/0);
            return x;
        }catch (Exception e){
            x = 30;
            return x;
        }finally {
            x = 40;
            System.out.println("finally执行了嘛");
    //千万不要在finally里面写返回语句,因为finally的作用是释放资源,是肯定执行的。如果在这里面写了返回语句,那么try和catch的结果都会被改变          
      }
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • 1 Log4j 1.1 什么是Log4j? Log4j是Apache的一个开源项目,通过使用Log4j,我...
    咿呀_Java阅读 351评论 0 2
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,621评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,039评论 25 707
  • 我出生在东北一个小城市,考上大学后离开家到外地上学并且留在外地工作,很多年里我都在找寻一种叫做身份认同的状态,比如...
    aqua36阅读 277评论 0 0
  • #58号雕刻打卡Day32# 1.九点靠墙站 10分钟 感受:站的时间也是身体排气的过程,或打嗝或放屁,每每都是。...
    一然2016阅读 65评论 0 0