• Java异常处理机制


    Throwable类是Java语言中所有错误和异常的超类。只有作为该类(或其子类之一)实例的对象才由Java虚拟机抛出,或者可以由Java throw语句抛出。类似地,只有这个类或它的一个子类可以是catch子句中的参数类型。为了在编译时检查异常,Throwable类和Throwable类的任何子类(不同时是RuntimeException或Error的子类)都被视为已检查异常。

    异常是程序在编译或运行过程出现的例外,这些例外在有的可以避免有的却无法避免。

    所有的异常类是从 java.lang.Exception 类继承的子类。

    Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。

    Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。

    Error 用来指示运行时环境发生的错误。

    例如,JVM 内存溢出。一般地,程序不会从错误中恢复。

    1、异常分类

    package LESSON10;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Scanner;
    public class demo1 {
        /**
    异常时程序在编译或运行过程中出现的例外,这些例外有的可以避免有的却无法避免
    异常:编译期异常和运行期异常 */ public static void main(String[] args) { //运行期异常:RuntimeException 可以避免 //算术异常java.lang.ArithmeticException // System.out.println(1/0); String str=null; //空指针异常java.lang.NullPointerException // System.out.println(str.length()); //数组下标越界异常java.lang.ArrayIndexOutOfBoundsException int arr[]=new int[3]; // System.out.println(arr[3]); //字符串下标越界异常java.lang.StringIndexOutOfBoundsException String s="abc"; // System.out.println(s.charAt(3)); //输入不匹配异常java.util.InputMismatchException // System.out.println("输入:"); // new Scanner(System.in).nextInt(); //类型转换异常java.lang.ClassCastException Object obj=new Object(); // String ss=(String)obj;

    //数字格式异常java.lang.NumberFormatException       
           String sss="abc";//字符串内是数字不会报异常如String sss="123"
           Integer.valueOf(sss);
    //编译期异常 无法避免 String time="2019/06/05 22:22:22"; SimpleDateFormat sdf2=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); try { //解析异常ParseException Date d = sdf2.parse(time);// 解析字符串的文本,生成 Date。 System.out.println(d); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
    package ceshi;
    public class ceshi2 {
        public static void drink(){
            System.out.println("喝");
        }
        public void eat(){
            System.out.println("吃");
            this.eat();
        }
        public static void main(String[] args) {
            ceshi2 ceshi=new ceshi2();
            ceshi.eat();//java.lang.StackOverflowError堆栈溢出错误   运行期异常
        }
    }

    2、异常处理

    package LESSON9;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    public class demo6 {
        public void test1(){
            try {
                System.out.println(1/0);
            } catch (Exception e) {
                //e.printStackTrace();//显示到控制台
                System.out.println(e.getMessage());            
            }
            finally{
                System.out.println("是否发生异常都会执行");            
            }        
        }
        // throws抛出
        public void test2() throws ParseException{
            new SimpleDateFormat().parse("2019/06/05");
        }        
        //捕获:try-catch-finally
        //try也可以单独和catch连用
        //try也可以单独和finally连用
        public void test3(){
            //try{
                //可能出现异常的代码块
            //   }
            //  catch (Exception e) {
            //          //捕获并处理异常
            //          //即使写了return,也会先执行finally的语句(执行顺序)
            //        }
            //finally{
            //    是否发生异常都会执行        
            //  }
            
            try {
               System.out.println(1/0);
            } catch (ParseException e) {
                // 如果有异常才能捕获
                e.printStackTrace();//将异常信息显示在控制台
    // System.out.println(e.getMessage());获取异常信息
    System.out.println("除数不能为0");

           return;//不会影响finally的执行
           System.out.println("---");//编译时会提示Unreachable code }finally{
                System.out.println("不论是否发生异常。finally都会执行");
            } }
    public static void main(String[] args) { //如果该方法抛出异常,在调用此方法时还要处理 //如果该方法已经捕获异常,在调用此方法时无需在处理 new demo6().test1(); // new demo6().test2(); new demo6().test3(); } }

    3、自定义异常

    自定义异常根据继承的父类不同分为两类
        继承自Exception的自定义异常
        继承自RuntimeException的自定义异常
    继承自Exception的自定义异常为编译期异常必须要进行处理。
    继承自RuntimeException的自定义异常为运行时异常不需要进行特别的处理。

    package LESSON10;
    
    import java.util.Scanner;
    class AgeLT0Exception extends Exception {
        public AgeLT0Exception (String msg){
            super(msg);
        }
    }
        class AgeGT150Exception extends Exception{
            public AgeGT150Exception(String msg) {
                super(msg);
            }
        }
    
    public class exercise {  
        public static void main(String[] args) {
            Scanner sc=new Scanner(System.in);
            System.out.println("请输入:");
            int age=sc.nextInt();
            if(age<0){
                try {
                    throw new AgeLT0Exception ("年龄太小");
                } catch (AgeLT0Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(age>150){
                try {
                    throw new AgeGT150Exception("年龄太大");
                } catch (AgeGT150Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
        }
    
    }

    自动取款机例子异常处理

    package LESSON10;
    public class Account {
        public long id;
        public int password;
        public String name;
        public double balance=2000;
        public Account(long id,String name){
            this.id=id;
            this.name=name;        
        }
        public  void deposit(double money){
            balance+=money;
            System.out.println("当前余额为:"+balance);
            
        }
        public  void withdraw(double money) throws BalanceNotEnoughException{
            
            if(money<=balance){
                balance-=money;
                System.out.println("当前余额为:"+balance);
                
            }
            else{
    //            System.out.println("余额不足");
                
                    throw new BalanceNotEnoughException("没钱了");//如果为捕获异常时,取款大于余额时有对异常的处理,程序不会停止;抛出异常时会停止
                
            }
        }
            
    }
    package LESSON10;
    public class PasswordNotTrue extends Exception{
        public PasswordNotTrue(String msg){
            super(msg);    
        }
    }
    package LESSON10;
    import java.util.*;
    public class exercise3 {
        public static void main(String[] args) throws BalanceNotEnoughException {
            int num=3;
            Account acc=new Account(123456,"张三");
            Scanner sc=new Scanner(System.in);
            System.out.println("欢迎来到自助银行");      
            while(true){ 
            System.out.println("请输入密码");
            int pwd=sc.nextInt();        
            if(pwd==123)
            {    
                System.out.println(acc.name+"欢迎,您的账户为"+acc.id);
            while(true){
                System.out.println("请选择:1存款 2取款 3查询余额 4退出");
                int a=sc.nextInt();
            if(a==1){
                System.out.println("请输入存款金额");
                double money=sc.nextDouble();
                acc.deposit(money);
                
            }
            else if(a==2){
                System.out.println("请输入取款金额");
                double money=sc.nextDouble();
                acc.withdraw(money);
                
            }
            else if(a==3){
                System.out.println("余额为:"+acc.balance);
                
            }
            else if(a==4){
                System.exit(0);//退出jvm
            }
            else{
                System.out.println("输入错误");
                break;
            }                
        }
        }
            
            else{
                num--;
                if(num==0){
    //                System.out.println("账户已冻结");
                    try {
                        throw new PasswordNotTrue("账户已冻结");
                    } catch (PasswordNotTrue e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    break;
                    
                }
                System.out.println("密码错误,您还有"+num+"次机会");            
            }
            }
        }
    }
    package LESSON10;
    public class BalanceNotEnoughException extends Exception{
        public BalanceNotEnoughException(String msg) {
            super(msg);
        }
    
    }
  • 相关阅读:
    cocos2dx Menu
    关于iOS招聘面试的一些问题
    OC画图
    iOS苹果产品简介
    iOS知识小总结
    @property的修饰参数的的解释
    IOS:UI设计之UINavigationController,NavigationBar,ToolBAR相关基础
    IOS:UI设计之UISegmentedControl相关基础
    IOS:UI设计之UISlider相关基础
    IOS:UI设计之UILable相关基础
  • 原文地址:https://www.cnblogs.com/qfdy123/p/10982004.html
Copyright © 2020-2023  润新知