java异常学习笔记

异常分类

严重问题Error:

不处理,都是严重问题

问题Exception:

编译期问题

不是RuntimeException及其子类的异常,必须处理,若不处理,编译就不能通过。

运行期问题RuntimeException

不处理,是由于代码不对,修正代码。

异常分类如下图:
这里写图片描 述

java中处理异常的方式

try…catch…finally方式

try…catch…finally的格式

try{
可能出现问题的代码;
}catch(异常名 变量){
针对问题的处理;
}finally{
释放资源;
}

package com.lj.exception;

public class exceptionDemo1 {
    public static void main(String[] args) {

        int a = 21;
        int b = 0;
        int[] c = {1,2,3};

        try{
            int d = a / b;
            int e = c[3];
            System.out.println(d);
            System.out.println(e);
        }catch(ArithmeticException e){
            System.out.println("除数不能为0");
        }catch(Exception e){
            System.out.println("数组下表越界");
        }
        finally {
            System.out.println("上面出错了");
        }

    }
}

实例如上面语句需要注意的1、是在try中一共有两条异常语句,若第一条出错第二条不会在执行。2、捕获异常是我们要注意异常类的继承关系,越靠近父类的异常应放在后面。
执行后的到结果如下:
除数不能为0
上面出错了

finally关键字的使用

public static void main(String[] args) {
        System.out.println("今天天气很好");
        try {
            method();
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{   
        System.out.println("但是明天要上班");
        }
    }   

我们在try…catch…finally结构中接入finally语句标示无论在try中是否有异常存在最终finally语句都会执行。
try…catch…finally的变形
这里写图片描述

throws异常抛出

package com.lj.exception;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ExceptionDemo2 {
    public static void main(String[] args) {
        System.out.println("今天天气很好");
        try {
            method();
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            //这里我们用到了一个异常的方法,该方法的作用是打印出异常的情况到控制台终端上。
        }
        System.out.println("但是明天要上班");
    }

    //方法声明是抛出,提示调用者这里有异常
    private static void method() throws ParseException {
        // TODO Auto-generated method stub
        String s = "2016-01-17";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d = sdf.parse(s);
        System.out.println(d);
    }
}

运行结果如下:
这里写图片描述
通过上面代码我们可以看到我们在方法method()中并没有对异常进行处理,而是在方法声明中直接将异常throw,所以回到main方法中ecplise提示我们必须要对异常进行处理,我们就再对main()方法进行try..catch…finally异常处理即可。(提示若在main方法中继续使用throw抛出异常则是将异常抛给了jvm虚拟机,main()后面的语句并不会执行)

提示补充

请注意throw及throws的区别
这里写图片描述

两种处理方式的使用场景及举例:
这里写图片描述

自定义异常

除了java提供的异常类之外我们还可以一般有两种类型的自定义异常。
这里我们考虑用考试成绩来做测试(0<分数<100)作为一个有效分数。
首先建立测试类

package com.lj.exception;

import java.util.Scanner;

public class ExceptionDemo4 {
    private static Scanner input;

    public static void main(String[] args) {
        input = new Scanner(System.in);
        System.out.println("请输入分数: ");
        int score = input.nextInt();
        try {
            check(score);
        } catch (MyException e) {
            e.printStackTrace();
        }
    }

    private static void check(int score) throws MyException {
        if(score > 100 || score <0){
            throw new MyException("分数为0到100");
        } else{
            System.out.println("分数没错");
        }
    }
}

继承自Exception

这类异常属于编译时期的异常需要我们必须处理。

public class MyException extends Exception {
    public MyException(){
    }
    public MyException(String message){
        super(message);
        //在测试类中需我们在抛出异常时printStackTrace()方法可以给出一个提示,最终是使用的
        //其父类的父类的getMessage()方法返回到控制台上面。
    }
}

继承自RuntimeException

public class MyException extends RuntimeException {
    public MyException(){
    }
    public MyException(String message){
        super(message);
        //在测试类中需我们在抛出异常时printStackTrace()方法可以给出一个提示,最终是使用的
        //其父类的父类的getMessage()方法返回到控制台上面。
    }
}

而使用该自定义异常时编译时使用

public static void main(String[] args) {
        input = new Scanner(System.in);
        System.out.println("请输入分数: ");
        int score = input.nextInt();
        check(score);

在编译时不会报错,运行时报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值