前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【趣学程序】Java中的异常

【趣学程序】Java中的异常

作者头像
趣学程序-shaofeer
发布2019-07-30 15:56:00
4310
发布2019-07-30 15:56:00
举报

异常

定义

异常,就是不正常,是指程序在运行时出现的不正常情况。其实就是程序中出现的问题。这个问题按照面向对象思想进行描述,并封装成了对象。因为问题的产生有产生的原因、有问题的名称、有问题的描述等多个属性信息存在。当出现多属性信息最方便的方式就是将这些信息进行封装。异常就是java按照面向对象的思想将问题进行对象封装。这样就方便于操作问题以及处理问题。

异常的体系 Throwable

Error

  1. 通常指JVM出现重大问题如:运行的类不存在或者内存溢出等。
  2. 不需要编写针对代码对其处理,程序无法处理。

Exception

  1. 在运行时运行出现的一些情况,可以通过try,catch,finally处理

异常处理

两种方式:

  1. 捕获异常:try catch 直接处理可能出现的异常!
  2. 声明异常:throws 声明告诉调用者可能的异常,暴露问题,调用者自己处理!

常见异常

//算术异常
ArithmeticExecption  

//空指针异常类
NullPointerException  

//类型强制转换异常
ClassCastException  

//数组负下标异常
NegativeArrayException  

//数组下标越界异常
ArrayIndexOutOfBoundsException  

//违背安全原则异常
SecturityException  

//文件已结束异常
EOFException  

//文件未找到异常
FileNotFoundException  

//字符串转换为数字异常
NumberFormatException  

//操作数据库异常
SQLException  

//输入输出异常
IOException  

//方法未找到异常
NoSuchMethodException

异常处理格式

异常处理的5个关键字

try ,catch,
finally 
throw, throws

异常处理格式

try{
        //可能出异常的代码
} catch(异常类  对象){
        //处理该异常类型的语句
}
[finally] {
        //一定会执行的代码
        //catch块使用System.exit(1);除外
}

备注:当try语句块出现异常,程序会自动跳到catch语句块去找匹配的异常类型,
并执行异常处理语句,finally语句块是异常的统一出口。

注意:finally语句块是一定会执行的,
特殊情况(在执行finally语句之前JVM虚拟机退出了,System.exit(0))

多异常处理

  1. 声明异常时尽可能声明具体异常类型,方便更好的处理;
  2. 方法声明几个异常就对应有几个catch块;
  3. 若多个catch块中的异常出现继承关系,父类异常catch块放在最后;
  4. 在catch语句块使用Exception类作为异常类型时:
  5. 所有子类实例都可以使用父类接收(向上转型),即所有的异常对象都可以使用Exception接收;

注:在java处理多异常时捕获小范围的异常必须放在大范围异常之前。

同时捕获多个异常类型

Java7之前:

try {
    int a = Integer.parseInt("1");
    int b = Integer.parseInt("0");
    int c = a / b;
    System.out.println(c);
} catch (NumberFormatException e){
   e.printStackTrace();
} catch(ArithmeticException e) {
    e.printStackTrace();
}

Java7:将多个异常写到了同一个catch代码块

try {
Integer a = Integer.parseInt("1");
Integer b = Integer.parseInt("0");

Integer c = a / b;

System.out.println(c);

} catch (NumberFormatException     | ArithmeticException  e ) {
     e.printStackTrace();
}

异常的分类

异常分类:

1. 编译时被检查异常;     
    ---> Checked异常
        在程序中必须使用try...catch处理;
2. 编译时不被检测的异常;
    ---> Runtime异常
        可以不使用try...catch处理,但一旦出现异常就将由JVM处理。

Runtime异常

RuntimeException(运行时异常)是指因设计或实现方式不当而导致的问题. 简单说,就是程序员造成的,程序员小心谨慎是完全可以避免的异常. 比如,事先判断对象是否为null就可以避免NullPointerException异常, 事先检查除数不为0就可以避免ArithmeticException异常;

特点:

这种异常Java编译器不会检查它,也就说程序中出现这类异常的时候,即使不处理也没有问题,但是一旦出现异常,程序将异常终止,若采用异常处理,则会被相应的程序执行处理.

Checked异常

除了RuntimeException以及子类,其他的Exception及其子类都是受检查异常,我们也可以称为非RuntimeException异常.

特点:

Java编译器会检查它,也就说程序中一旦出现这类异常,要么是没有try-catch语句捕获,或throws语句没有声明抛出它,编译就不会通过,也就说这种异常,程序要求必须处理.

声明异常(throws)

在可能出现异常的方法上声明抛出可能出现异常的类型:声明的时候尽可能声明具体的异常,方便更好的处理. 当前方法不知道如何处理这种异常,可将该异常交给上一级调用者来处理(非RuntimeException类型的异常)。方法一旦使用throws声明抛出方法内可能出现的异常类型, 该方法就可以不再过问该异常了;一个方法调用另一个使用throws声明抛出的方法,自己要么try...catch , 要么也throws;

格式:

public 返回值类型  方法名(参数列表...) 
            throws 异常类A,异常类B... {

}

注意:通过该方式去声明异常,将由调用方去关心如何处理该异常。

throw

自行抛出一个异常对象,抛出异常类的对象;若throw抛出的是Runtime异常:程序可以显示使用try...catch来捕获并处理,也可以不管,直接交给方法调用者处理;若throw抛出Checked异常:要么放在try里自己处理,要么放在一个throws声明的方法里面,交给调用者处理。

public static void main(String[] args) {
        try {
              fn1(1);
        } catch (Exception e) { e.printStackTrace(); }
        fn2(2);
    }
    public static void fn1(int a) throws Exception{
        if(a >0) { throw new Exception("fn1 -- a值不合法"); }
    }
    public static void fn2(int a) {
        if(a >0) { throw new RuntimeException("a值不合法"); }
    }

throws & throw

  1. throws用于在方法上声明该方法不需要处理的异常类型。
  2. throw用于抛出具体异常类的对象。
  3. throws与throw的区别:
  4. thorws用在方法上,后面跟异常类名,可以是多个异常类。
  5. throw用在方法内,后面跟异常对象,只能是一个。

finally

异常的统一出口:不管try块程序是否异常,也不管哪个catch执行,finally块总会执行。try语句块或会执行的catch语句块使用了JVM系统退出语句例外;//System.exit(1); try块必须和 catch块或和finally同在,不能单独存在,二者必须出现一个。不要在finally中使用return 或throw语句,否则将会导致try、catch中的return或throw失效。

finally代码块只在一种情况下不执行:System.exit(0);

public class Demo19 {
    public static void main(String[] args) {
        try{
            System.out.println(17/0);
        }catch(Exception e){
            //e.printStackTrace();
            System.out.println("程序错误,请修正!");
        }finally{
            System.out.println("这是finally代码块!");
        }
    }
}

输出:
程序错误,请修正!
这是finally代码块!

throw和catch同时使用

当异常出现在当前方法中,程序只对异常进行部分处理,还有一些处理需要在方法的调用者中才能处理完成,此时还应该再次抛出异常,这样就可以让方法的调用者也能捕获到异常;

public static void buy(String price) throws Exception {
    try {
        if(price != null)
            Double.parseDouble(price);
    } catch (Exception e) {
        e.printStackTrace();
        throw new Exception("价格不能只能是数字组成");
    }
}
public static void main(String[] args)  {
    try {
        buy(null);
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

自定义异常使用

  • 创建一个类继承Exception
  • 重写其无参构造和带一个参数的构造方法
public class MyException extends Exception {

    public MyException() {

    }

    public MyException(String message) {
        super(message);
    }

}


public class MyExceptionDemo {

    public static void main(String[] args) throws MyException {

        String username = "123";
        String password = "123";

        if ("root".equals(username) && "root".equals(password)) {
            System.out.println("用户名密码正确");
        } else {
            throw new MyException("用户名或密码错误");
        }
    }

}

/*
Exception in thread "main" top.wintp.chp9.MyException: 用户名或密码错误
    at top.wintp.chp9.MyExceptionDemo.main(MyExceptionDemo.java:31)
*/
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 趣学程序 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 异常
  • Error
  • Exception
  • 异常处理
  • 常见异常
  • 异常处理格式
  • 多异常处理
  • 异常的分类
  • 声明异常(throws)
  • throw
  • throws & throw
  • finally
  • throw和catch同时使用
  • 自定义异常使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档