zoukankan      html  css  js  c++  java
  • 基础学习day10--异常、包

    一、异常 

    1.1、异常定义

    异常:--不正常,程序在运行时出现不正常情况

    异常由来:其实也是现实生活中一个具体的事物,马可以通过JAVA的类的形式表现描述,并封装成类。

                    Java对不正常情况描述后的,对象体现。

    异常:两种.

    一种是严重的问题:java通过Error类进行描述

    对于Error一般不编写针对必的代码对其进行处理

    对与非严重的:java通过Exception类进行描述

    对于Exception可以使用针对必的处理方式进行处理。

    示例:

    package com.day10.demo1;
    
    public class Demo1 {
    
        public static void main(String[] args) {
            
            System.out.println(div(5,0));
            System.out.println("over");
            
    
        }
        
        public static int div(int a,int b){
            return a/b;
        }
    
    }

    结果:

    Exception in thread "main" java.lang.ArithmeticException: / by zero
    at com.day10.demo1.Demo1.div(Demo1.java:14)
    at com.day10.demo1.Demo1.main(Demo1.java:7)

    算术异常,因为除数为0,所以,有异常了

    1.2、异常体系结构

    Java 提供了两类主要的异常:runtime exception 和checked exception。所有的checked exception 是从java.lang.Exception 类衍生出来的,而
    runtime exception 则是从java.lang.RuntimeException 或java.lang.Error类衍生出来的。

    它们的不同之处表现在两方面:机制上和逻辑上

    runtime exceptions:

    • 在定义方法时不需要声明会抛出runtime exception
    • 在调用这个方法时不需要捕获这个runtime exception
    • runtime exception 是从java.lang.RuntimeException 或
    • java.lang.Error 类衍生出来的。

    checked exceptions:

    •  定义方法时必须声明所有可能会抛出的checked exception
    •  在调用这个方法时,必须捕获它的checked exception,不然就得
    • 把它的exception 传递下去
    • checked exception 是从java.lang.Exception 类衍生出来的

    从逻辑的角度来说,checked exceptions 和runtime exception 是有不同的使用目的的。

    checked exception 用来指示一种调用方能够直接处理的异常情况。checked exception 迫使你捕获它并处理这种异常情况。

    而runtime exception 则用来指示一种调用方本身无法处理或恢复的程序错误。

    1.3、异常使用语句

    try{
        // 有可能出现异常的语句
    }catch(异常类 异常对象){
        // 编写异常的处理语句
    }[ catch(异常类 异常对象){
        // 编写异常的处理语句
    } catch(异常类 异常对象){
        // 编写异常的处理语句
    } …. ]
    [finally{ 
        一定会运行到的程序代码 ; 
    }

    主要搭配:try-catch、try-catch-finally、try-finally三种形式

     

    1.4、使用try--catch

    没有使用异常

    package com.day10.exception.demo1;
    
    public class Demo1 {
    
        public static void main(String[] args) {
        
            int x=5;
            int y=0;
            int index=div(x,y);
            System.out.println("执行完成");
    
        }
         public static int div(int a,int b){
                return a/b;
            }
    }

    结果:

    Exception in thread "main" java.lang.ArithmeticException: / by zero

    最后输出语句没有执行

    使用try--catch

    package com.day10.exception.demo1;
    
    public class Demo1 {
    
        public static void main(String[] args) {
        
            int x=5;
            int y=0;
            try {
                int retsult=x/y;
            } catch (Exception e) {
                
                e.printStackTrace();
            }
            
    
            System.out.println("执行完成");
    
        }
         
             
            
    }

    结果:

    java.lang.ArithmeticException: / by zero
    at com.day10.exception.demo1.Demo1.main(Demo1.java:10)
    执行完成

    异常代码块后面的代码被执行了。

    try-中的代码发生异常后,跳转到相就的 catch块中,捕获异常,完成后,执行异常块后面的代码

    1.5、try-catch-finally

    package com.day10.exception.demo1;
    
    public class Demo1 {
    
        public static void main(String[] args) {
        
            int x=5;
            int y=0;
            try {
                int retsult=x/y;
                System.out.println("执行到我说明没有异常");
            } catch (Exception e) {
                System.out.println("发生异常了");
                e.printStackTrace();
            }finally{
                System.out.println("我一定会被执行");
            }
    
            System.out.println("执行完成");
    
        }
         
             
            
    }

    结果:

    发生异常了
    我一定会被执行
    执行完成
    java.lang.ArithmeticException: / by zero
    at com.day10.exception.demo1.Demo1.main(Demo1.java:10)

    1.6、finally中的代码不执行

    package com.day10.exception.demo1;
    
    public class Demo1 {
    
        public static void main(String[] args) {
        
            int x=5;
            int y=0;
            try {
                int retsult=x/y;
                System.out.println("执行到我说明没有异常");
            } catch (Exception e) {
                System.out.println("发生异常了");
                e.printStackTrace();
                System.exit(0); //或者-1
            }finally{
                System.out.println("我一定会被执行");
            }
    
            System.out.println("执行完成");
    
        }
         
             
            
    }
    发生异常了
    java.lang.ArithmeticException: / by zero
        at com.day10.exception.demo1.Demo1.main(Demo1.java:10)

    1.7、如果有return 怎么执行

    try中有return

    package com.day10.exception.demo1;
    
    public class Demo2 {
    
        public static void main(String[] args) {
            
            System.out.println(getException());
        }
        public static int getException(){
            
            try {
                int x=5;
                System.out.println("try return");
                return x;
            } catch (Exception e) {
                System.out.println("catch return");
            }finally{
                System.out.println("finally return");
            }
            return 0;
        }
    
    }

    结果:

    try return
    finally return
    5

    try中的return并不会影响finally中的代码执行

    catch中有return

    package com.day10.exception.demo1;
    
    public class Demo2 {
    
        public static void main(String[] args) {
            
            System.out.println(getException());
        }
        public static int getException(){
            int x=5;
            try {
                int result=x/0;
                System.out.println("try return");
                return x;
            } catch (Exception e) {
                System.out.println("catch return");
                return ++x;
            }finally{
                System.out.println("finally return");
            }
        }
    
    }

    结果:

    catch return
    finally return
    6

    catch中的return也不会影响finally中的执行,但是返回结果会是catch中的return结果,会将try中的结果覆盖

    finally中有return

    package com.day10.exception.demo1;
    
    public class Demo2 {
    
        public static void main(String[] args) {
            
            System.out.println(getException());
        }
        public static int getException(){
            int x=5;
            try {
                int result=x/0;
                System.out.println("try return");
                return x;
            } catch (Exception e) {
                System.out.println("catch return");
                return ++x;
            }finally{
                System.out.println("finally return");
                return ++x;
            }
        }
    
    }

    结果:

    catch return
    finally return
    7

    finally中的return也不会影响finally中的执行,但是返回结果会是finally中的return结果,会将try和catch中的结果覆盖

    1.8、多个catch块

    exception异常 一定要放在最扣,不然下方的异常无法执行到,只会执行父类执行而子类的异常不会被捕获

    package com.day10.exception.demo1;
    
    import java.util.InputMismatchException;
    import java.util.Scanner;
    /*
     * 求2个整数的商 当异常发生时,程序如何处理
     */
    public class Demo2 {
    
        public static void main(String[] args) {
    
            
    
            // 从键盘获得输入
            try {
                Scanner input = new Scanner(System.in);
                System.out.println("请输入被除数:");
                int num1 = input.nextInt();
                System.out.println("请输入除数:");
                int num2 = input.nextInt();
                int result = num1 / num2;
                System.out.println(num1 + "与" + num2 + "的商:   " + result);
            } catch (InputMismatchException e) {
                System.out.println("输入的不是数字");
                e.printStackTrace();
    
            } catch (ArithmeticException e) {
                System.out.println("除数不能为0");
                e.printStackTrace();
            } catch (Exception e) {
                System.out.println("其它错误!");
                e.printStackTrace();
            } finally {
                System.out.println("谢谢使用!");
            }
    
        }
    
    }

    结果1:

    请输入被除数:
    fsd
    输入的不是数字
    谢谢使用!
    java.util.InputMismatchException

    结果2

    请输入被除数:
    9
    请输入除数:
    0
    除数不能为0
    谢谢使用!
    java.lang.ArithmeticException: / by zero

    结果3:

    请输入被除数:
    7
    请输入除数:
    3
    7与3的商: 2
    谢谢使用!

    1.9、自定义异常

    自定义异常只需要继承Exception类就

    定义异常类,只需要继承Exception类即可。

    当然可以继承其它的如:Exception,Throwable,RuntimeException及其子类,其中继承Exception,Throwable,效果,如果不要求调用者一定要处理抛出的异常可以继承RuntimeException及其子类
    调用时只需要throw new 自定义异常名(信息)
    package com.day10.exception.demo1;
    /**
     * 自定义异常
     * @author denny
     *
     */
    public class MyException extends Exception {
    
        public MyException() {
            super();
        }
    
        public MyException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
            super(message, cause, enableSuppression, writableStackTrace);
            
        }
    
        public MyException(String message, Throwable cause) {
            super(message, cause);
            
        }
    
        public MyException(String message) {
            super(message);
            
        }
    
        public MyException(Throwable cause) {
            super(cause);
        }
        
        
    
    }

    上面为算定义异常,使用构造方法重载即可

    1.10、throw和throws抛出异常

    使用上面的算定义异常

    package com.day10.exception.demo1;
    
    public class Person {
    
        private String name;
        private int age;
        private String gender;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            if (age >= 0 && age <= 150) {
                this.age = age;
            } else {
                try {
                    throw new MyException("年龄只能在0-150岁之间");
                } catch (MyException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) throws MyException {//
            if(gender.equals("男")||gender.equals("女")){
            this.gender = gender;
            }else{
                throw new MyException("性别只能是男或者女!"); 
                /*
                throw可以在方法体内抛出异常,但必须捕获或者
                在方法体上用throws抛出
                */
            }
        }
         public void printSelf(){
             System.out.println("姓名:"+this.name+"             性别:"+this.gender+"     年龄:"+this.age);
         }
    
    }

    测试类

    package com.day10.exception.demo1;
    
    public class PersonTest {
    
        public static void main(String[] args) {
            Person p=new Person();
            
            try {
                p.setName("张三");
                p.setAge(200);
                p.setGender("人妖");
            } catch (MyException e) {
                e.getMessage();//获取异常信息
            }finally{
                
            }
    
        }
    
    }

    结果:com.day10.exception.demo1.MyException: 年龄只能在0-150岁之间

    因为在执行age赋值时,已经发生异常,所以下面的性别赋没有执行

    package com.day10.exception.demo1;
    
    public class PersonTest {
    
        public static void main(String[] args) {
            Person p=new Person();
            
            try {
                p.setName("张三");
                p.setAge(20);
                p.setGender("人妖");
                p.printSelf();
            } catch (MyException e) {
                //System.out.println(e.getMessage());//获取异常信息
                e.printStackTrace();
            }finally{
                
            }
    
        }
    
    }

    结果:

    com.day10.exception.demo1.MyException: 性别只能是男或者女!

    二、包

    2.1、包的含义

    对文件进行分类管理,类似于windows中的文件夹,同一包同一层

    给类提供多层命名空间,同一个文件夹文件名不相同,层次关系,

    写在程序文件的第一行

    类名的全称是包名.类名.

    包也是一种封装形式

    2.2、包的定义

    package 包名,

    包名必须小写,可以使用.小数点来定义多层次包

    必须放在代码的第一行

    javac -d  .   java文件名.java  .代表当前文件夹目录

    包的出现可以把java的class文件和源文件相分离,只需要将 class文件复制出来运行就可以

    定义包名不要重复

    2.3、包的导入

    import 包名.类名

    2.4、包与包之间的访问权限

     

  • 相关阅读:
    vue:路由实现原理
    webpack自定义loader和自定义插件
    JS常见的算法
    浅析DES、AES、RSA、MD5加密算法及其应用场景
    关于JSON.parse(JSON.stringify(obj))实现深拷贝应该注意的坑
    Canvas和SVG区别
    解决 webpack 打包文件体积过大
    箭头函数与普通函数的区别
    2.Linux基础命令
    1.Ubuntu系统与vmware虚拟机的安装与使用
  • 原文地址:https://www.cnblogs.com/liunanjava/p/4803186.html
Copyright © 2011-2022 走看看