异常+异常链

异常:

  1. 在程序运行过程中发生的不正常事件
  2. Java中所有异常都是Exception(父类)
  • 传统处理程序中异常:
  1. System.exit(1);参数必须为非0数,结束/退出JVM(java虚拟机)
  2. System.err.println();控制台输出错误流,为红色字体。
  • 异常处理机制:
  1. 为程序提供错误处理的能力
  • 5个关键字:
  1. try 执行可能产生异常的代码
  2. catch 捕获异常
  3. finally 无论是否发生异常,代码都能执行
  4. throw 声明异常,声明方法可能要抛出的各种异常
  5. thorws 手动抛出异常

语法:

try{
//代码段(此处不会出现异常)
}catch(异常Exception或Exception的子类){
//对异常进行处理的代码段
}
//代码段
}
    public class Test1 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("请输入被除数:");
//        除数为0异常: ArithmeticException
//        输入格式不正确: InputMismathException(子类)
        try{
            //程序中可能出现异常的代码
            int num1 = in.nextInt();
            System.out.print("请输入除数:");
            int num2 = in.nextInt();
            System.out.println(num1+"/"+ num2 +"="+ num1/ num2);
        }catch(ArithmeticException e){
            //在程序出现异常的情况下执行的代码
            System.err.print("出现错误操作"+"\n");
            //异常对象 e printStackTrace();打印异常堆栈信息
            e.printStackTrace();
        }
        System.out.println("感谢使用本程序!");

    }
}
  1. 无异常。try->catch直接执行后面代码
  2. 有异常,与cetch后面异常类型匹配 : try->catch里面代码->后面代码
  3. 有异常,与cetch后面异常类型不匹配:try->中断,结束运行
  4. printStackTrace();打印异常堆栈信息
  5. getMessage();获得异常字符串提示信息,打印需使用输出语句

tyr–cetch–finally语法:

try{
//代码块
}cetch(){
//代码块
}finally{
//代码块
}

  public class Test2 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("请输入被除数:");
        // 除数为0异常: ArithmeticException
        // 输入格式不正确: InputMismathException(子类)
        try {
            //程序中可能出现异常的代码
            int num1 = in.nextInt();
            System.out.print("请输入除数:");
            int num2 = in.nextInt();
            System.out.println(num1 + "/" + num2 + "=" + num1 / num2);
        } catch (ArithmeticException e) {
            //在程序出现异常的情况下执行的代码
            System.err.print("出现错误操作" + "\n");
            // 异常对象 e printStackTrace();打印异常堆栈信息
            e.printStackTrace();
        } finally {
            System.out.println("感谢使用本程序!");
        }
    }
}
  • finally不执行的情况:
  1. 在cetch代码块中结束JVM(如:System.exit(1))运行情况下finally代码块不执行
  2. cetch代码块存在return时,会先执行finally代码块,最后执行return

多重cetch块:

try{
//代码块
}cetch(){
//代码块
}cetch(){
//代码块
}cetch(){
//代码块
}finally{
//代码块
}

public class Test3 {
public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    System.out.print("请输入被除数:");
    // 除数为0异常: ArithmeticException
    // 输入格式不正确: InputMismatchException(子类)
    try {
        int num1 = in.nextInt();
        System.out.print("请输入除数:");
        int num2 = in.nextInt();
        System.out.println(num1 + "/" + num2 + "=" + num1 / num2);
    } catch (ArithmeticException e) {
        System.err.print("除数不能为0" + "\n");
        // 异常对象 e printStackTrace();打印异常堆栈信息
        e.printStackTrace();
    } catch (InputMismatchException e) {
        System.err.print("输入格式不正确" + "\n");
        e.printStackTrace();
    } catch (Exception e) {
        System.err.print("未知异常" + "\n");
        e.printStackTrace();
    }finally {
        System.out.println("感谢使用本程序!");
    }
}

约束条件:越具体的子异常类放在catch首位,越抽象的父异常类越往后写
cetch语句顺序:先子类,后父类
发生异常时按顺序逐个匹配
只执行第一个与异常类型匹配的cetch语句
try块为必须,但不能单独出现。

throws :

  • 声明某个方法可能抛出的各种异常,多个异常用逗号隔开。
  1. 调用者处理异常
  2. 调用者继续声明异常
  • Main()方法声明的异常由JVM处理。
public void 方法名()throws 异常类型{
//代码块
}
public static void main(String[] args){
类名 t = new 类名();
try{
t.方法名();
}
}
 public static void a() throws ArithmeticException{
            int num=5/0;
            throw  new ArithmeticException("除数不能为0");
    }

    public static void b(){
    try{
        a();
    }catch(ArithmeticException e){
        e.printStackTrace();
    }
    }

或者继续抛出:

public void 方法名()throws 异常类型{
 //代码块
}
public static void     main(String[] args) throws 异常类型{
类名 t = new 类名();
 t.方法名();
}

public static void main(String[] args) {
        try{
            b();
        }catch(ArithmeticException e){
            e.printStackTrace();
        }
    }

    public static void a() throws ArithmeticException{
            int num=5/0;
            throw  new ArithmeticException("除数不能为0");
    }

    public static void b() throws ArithmeticException{
            a();
    }

throw:

  • 抛出异常。
public void 方法名()throws Exception{
           throw new Exception(“性别只能为男女”);
    }
    throw  new ArithmeticException("除数不能为0");

throw必须处理或者继续抛出异常。

throw 与 throws

  • throw:
  1. 生成并抛出异常
  2. 位于方法体内部,可作为单独语句使用
  3. 抛出一个异常对象,且只能是一个
  • throws
  1. 声明方法内抛出了异常
  2. 必须跟在方法参数列表后面,不能单独使用
  3. 声明抛出异常类型,可以跟多个异常

异常处理原则:

  1. 异常处理与性能
  2. 异常只能用于非正常情况
  3. 不要将过于庞大的代码块放在try中
  4. 在catch中指定具体的异常类型
  5. 需要对捕获的异常做处理
  6. 异常分为Checked异常和运行时异常:
  7. Checked异常必须捕获或者声明抛出
  8. 运行时异常不要求必须捕获或者声明抛出

常见异常类型:

  1. Exception 异常层次结构的父类
  2. ArithmeticException 除数为0异常
  3. InputMismathException 输入格式不正确
  4. ArrayIndexOutOfBoundsException 数组下标越界异常
  5. NullPointerException 空指针异常
  6. ClassNotFoundException 不能加载所需的类
  7. IIIegalArgumentException 方法接收到非法参数
  8. ClassCastException 对象强制类型转换出错
  9. NumberFormatException 数字格式转换异常,如把”abc”转换成数字

异常链:

  • 由一种异常引发另一种异常
  • 异常链创建了新的异常但却包含了原有异常的信息。
    • 自定义一个登录与注册异常类继承父类Exception,重写父类构造方法
public class LoginFaildException extends Exception {
public LoginFaildException() {
        super();

    }

    public LoginFaildException(String message, Throwable cause) {
        super(message, cause);

    }

    public LoginFaildException(String message) {
        super(message);

    }

    public LoginFaildException(Throwable cause) {
        super(cause);

    }
    • 定义用户类,声明用户名与密码,添加构造方法
public  class User {
    private String userName;
    private String passWord;

    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassWord() {
        return passWord;
    }
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
    • 声明注册与登录方法
// 注册方法
        public static boolean register(User user) throws RegisterException {     //声明一个返回值为布尔类型的方法
            boolean flag = false;             //声明返回值变量
            if (user.getUserName() == null) {
                if (!flag) {
                    throw new RegisterException("用户名不能为空,注册失败");    //抛出注册异常
                } else {
                    return true;
                }
            }else if(user.getPassWord().equals(null)){
                return false;
            }
            return true;
        }

// 登录方法
    public static void login(User user) throws LoginFaildException {
        try {
             boolean register= register(user);    

        } catch (RegisterException e) {
            e.printStackTrace();
            throw new LoginFaildException("登录失败",e);    //核心代码,将注册与登录异常抛给登录异常构造方法
        }

    }
    • 在main方法中调用登录方法
public static void main(String[] args) {
        User user = new User();
        try {
            login(user);
        } catch (LoginFaildException e) {
            e.printStackTrace();      //抛出异常
    }
    • 运行结果如下:
exception.RegisterException: 用户名不能为空,注册失败
    at test.Test4.register(Test4.java:23)
    at test.Test4.login(Test4.java:36)
    at test.Test4.main(Test4.java:12)
exception.LoginFaildException: 登录失败
    at test.Test4.login(Test4.java:40)
    at test.Test4.main(Test4.java:12)
Caused by: exception.RegisterException: 用户名不能为空,注册失败
    at test.Test4.register(Test4.java:23)
    at test.Test4.login(Test4.java:36)
    ... 1 more

原文地址:https://www.cnblogs.com/big-data-sky/p/10981726.html

时间: 2024-08-04 08:35:15

异常+异常链的相关文章

-1-6 java 异常简单介绍 java异常 异常体系 Throwable 分类 throws和throw 异常处理 自定义异常

异常 异常:异常就是Java程序在运行过程中出现的错误. 异常由来:问题也是现实生活中一个具体事务,也可以通过java 的类的形式进行描述,并封装成对象. 其实就是Java对不正常情况进行描述后的对象体现. Throwable |--Error        严重问题,我们不处理. |--Exception |--RuntimeException        运行期异常,我们需要修正代码 |--非RuntimeException 编译期异常,必须处理的,否则程序编译不通过 Exception和

异常-异常的概述和分类

1 package cn.itcast_01; 2 3 /* 4 * 异常:程序出现了不正常的情况. 5 * 6 * 举例:今天天气很好,班长出去旅游.骑着自行车,去山里面呼吸新鲜空气. 7 * 问题1:山路塌陷了,班长及时停住了,但是过不去了.严重的问题. 8 * 问题2:班长出门推自行车,发现气没了,把气吹起来.出发前就应该检查的问题. 9 * 问题3:班长骑着车在山路上惬意的行驶着,山路两边是有小石子的,中间是平坦的水泥路. 10 * 一直在平坦的水泥路上行驶是没有任何问题的,但是呢,他偏

C++异常 异常机制

C++异常是丢程序运行过程中发生的异常情况(例如被0除)的一种响应.异常提供了将控制权从程序的一个部分传递到另一部分的途径.对异常的处理有3个组成部分:* 引发异常:* 使用处理程序捕获异常:* 使用try块.程序在出现问题时将引发异常.throw语句实际上是跳转,即命令程序跳到另一条语句.throw关键字表示引发异常,紧随其后的值(例如字符串或对象)指出了异常的特征.程序使用异常处理程序(exception handler)来捕获异常,异常处理程序位于要处理问题的程序中.catch关键字表示捕

异常-异常的注意事项

1 package cn.itcast_09; 2 3 import java.text.ParseException; 4 import java.text.SimpleDateFormat; 5 import java.util.Date; 6 7 /* 8 * 异常注意事项: 9 * A:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类.(父亲坏了,儿子不能比父亲更坏) 10 * B:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类

异常~异常用的大多是处理异常,我一般是写自定义异常

自定义异常类: java提供的异常类,不够我们使用,需要自己定义一些异常类格式: public class XXXExcepiton extends Exception | RuntimeException{ 添加一个空参数的构造方法 添加一个带异常信息的构造方法 } 注意: 1.自定义异常类一般都是以Exception结尾,说明该类是一个异常类 2.自定义异常类,必须的继承Exception或者RuntimeException 继承Exception:那么自定义的异常类就是一个编译期异常,如果

异常的处理

1. 引子 try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单.听话.不信?那你看看下面的代码,“猜猜”它执行后的结果会是什么?不要往后看答案.也不许执行代码看真正答案哦.如果你的答案是正确,那么这篇文章你就不用浪费时间看啦. [java] view plaincopyprint? <span style="background-color: rgb(255,

Java中的异常和处理详解

原文出处:代码钢琴家 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言风格:用函数返回值作为执行状态?. Java提供了更加优秀的解决办法:异常处理机制. 异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰. Java中的异常可以是函数中的语句执行时引发的,也可以是程序员通过throw 语句手

Java异常总结

http://blog.csdn.net/hguisu/article/details/6155636 [-] 1 引子 2JAVA异常 4处理异常机制 1 捕获异常trycatch 和 finally try-catch语句 trycatch-finally语句 try-catch-finally 规则异常处理语句的语法规则 trycatchfinally语句块的执行顺序 2 抛出异常 throws抛出异常 使用throw抛出异常 4 Throwable类中的常用方法 5Java常见异常 ru

异常以及异常处理框架探析

概述 一般情况下,企业级应用都对应着复杂的业务逻辑,为了保证系统的健壮,必然需要面对各种系统业务异常和运行时异常. 不好的异常处理方式容易造成应用程序逻辑混乱,脆弱而难于管理.应用程序中充斥着零散的异常处理代码,使程序代码晦涩难懂.可读性差,并且难于维护. 一个好的异常处理框架能为应用程序的异常处理提供统一的处理视图,把异常处理从程序正常运行逻辑分离出来,以至于提供更加结构化以及可读性的程序架构.另外,一个好的异常处理框架具备可扩展性,很容易根据具体的异常处理需求,扩展出特定的异常处理逻辑. 另