day18Java-Exception-异常概述

博客名称
Java-(中级)

Exception-异常概述

异常,就是不正常的意思。在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将 受影响.在程序中的意思就是:

异常:指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。

在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处 理异常的方式是中断处理。

异常体系
异常机制其实是帮助我们找到程序中的问题,异常的根类是 java.lang.Throwable ,其下有两个子类: java.lang.Error 与 java.lang.Exception ,平常所说的异常指 java.lang.Exception 。
在这里插入图片描述
Throwable体系:

  • Error:严重错误Error,无法通过处理的错误,只能事先避免,好比绝症。
  • Exception:表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。好 比感冒、阑尾炎。
异常分类

我们平常说的异常就是指Exception,因为这类异常一旦出现,我们就要对代码进行更正,修复程序
异常(Exception)的分类:根据在编译时期还是运行时期去检查异常?
编译时期异常:checked异常。在编译时期,就会检查,如果没有处理异常,则编译失败。(如日期格式化异常)
运行时期异常:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。(如数学异 常)

编译时异常和运行时异常的区别
 	 	编译期异常:Java程序必须显示处理,否则程序就会发生错误,无法通过编译
  		运行期异常:无需显示处理,也可以和编译时异常一样处理
java.lang.Throwable:类是 Java 语言中所有错误或异常的超类。
        	Exception:编译期异常,进行编译(写代码)java程序出现的问题
            		RuntimeException:运行期异常,java程序运行过程中出现的问题
           			异常就相当于程序得了一个小毛病(感冒,发烧),把异常处理掉,程序可以继续执行(吃点药,继续革命工作)
        	Error:错误
            		错误就相当于程序得了一个无法治愈的毛病(非典,艾滋).必须修改源代码,程序才能继续执行
Exception补充:
 			编译期问题:不是RuntimeException的异常 必须进行处理的,因为你不处理,编译就不能通过。
 			运行期问题:RuntimeException	这种问题我们也不处理,因为是你的问题,而且这个问题出现肯定是我们的代码不够严谨,需要修

Exception图解
在这里插入图片描述

正代码的。

  1. 编译期异常演示
    编译期异常处理演示1(抛出异常)
    抛出异常如果一直都不处理,最终会抛个jvm虚拟机来处理虚拟机处理就是中断程序,后面的代码执行不了,并把异常打印在控制台
public class ExceptionDemo {
    public static void main(String[] args) throws ParseException {
        //Exception:编译期异常,进行编译(写代码)java程序出现的问题
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//用来格式化日期
        Date date = sdf.parse("2018-0909");//把字符串日期,分析成Date类型日期

        System.out.println("后续代码未执行--"+date);
    }
}

结果:

Exception in thread "main" java.text.ParseException: Unparseable date: "2018-0909"
	at java.base/java.text.DateFormat.parse(DateFormat.java:388)
	at com.ginger.demo01.ExceptionDemo.main(ExceptionDemo.java:16)

编译期异常演示2(自己处理异常)
自己处理异常使用try{}catch(){},出现异常后,后序代码可以正常运行。

public class ExceptionDemo {
    public static void main(String[] args){
        //Exception:编译期异常,进行编译(写代码)java程序出现的问题
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//用来格式化日期
        Date date = null;
        try {
            date = sdf.parse("2018-0909");//把字符串日期,分析成Date类型日期
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println(date);
        System.out.println("后续代码已执行了");
    }
}

结果:

java.text.ParseException: Unparseable date: "2018-0909"
	at java.base/java.text.DateFormat.parse(DateFormat.java:388)
	at com.ginger.demo01.ExceptionDemo.main(ExceptionDemo.java:18)
null
后续代码已执行了
  1. 运行期异常演示
    运行期异常处理演示
    运行期可能出现异常的代码也可以使用,try{}catch(){}来处理,后续可以照常执行
public class ExceptionDemo2 {
    public static void main(String[] args) {
        //RuntimeException:运行期异常,java程序运行过程中出现的问题
        int[] arr = {1,2,3};
        //System.out.println(arr[0]);
        try {
        //可能出现异常的代码
        System.out.println(arr[3]);
        }catch(Exception e){
            //异常处理逻辑
            System.out.println(e);
        }
        System.out.println("后续代码");
    }
}

结果:

java.lang.ArrayIndexOutOfBoundsException: 3
后续代码
  1. Error:错误演示
    Error代码演示
public class ExceptionDemo {
    public static void main(String[] args) {
    /*
        Error:错误
        OutOfMemoryError: Java heap space
        内存溢出的错误,创建的数组太大了,超出了给JVM分配的内存
     */
        int[] arr = new int[1024*1024*1024];//OutOfMemoryError: Java heap space
        //必须修改代码,创建的数组小一点
        //int[] arr = new int[1024 * 1024];
    }
}

结果:内存溢出

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at com.ginger.demo01.ExceptionDemo.main(ExceptionDemo.java:15)
Throwable类的常见几个方法

在try里面发现问题后,jvm会帮我们生成一个异常对象,然后把这个对象抛出,和catch里面的类进行匹配。
如果该对象是某个类型的,就会执行该catch里面的处理信息。

public String getMessage():异常的消息字符串
public String toString():返回异常的简单信息描述
    	此对象的类的 name(全路径名)
  		": "(冒号和一个空格)
  	    调用此对象 getLocalizedMessage()方法的结果 (默认返回的是getMessage()的内容)
printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。把信息输出在控制台。

代码演示

public class ExceptionDemo {
    public static void main(String[] args) {
        String date = "2018-0808";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

        try {
            sdf.parse(date);
        } catch (ParseException e) {
            //e.printStackTrace();
            //System.out.println(e.getMessage());Unparseable date: "2018-0808"
            //System.out.println(e.toString());java.text.ParseException: Unparseable date: "2018-0808"
            //System.out.println(e.getLocalizedMessage());Unparseable date: "2018-0808"
            e.printStackTrace();
            
        }
        System.out.println("over");
        /*
          java.text.ParseException: Unparseable date: "2018-0808"
	          at java.base/java.text.DateFormat.parse(DateFormat.java:388)
	          at com.ginger.demo03.ExceptionDemo.main(ExceptionDemo.java:20)
              over
         */
    }
}
异常产生过程解析

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值