zoukankan      html  css  js  c++  java
  • 异常

    java.lang.ArithmeticException:算术异常
    java.util.InputMismatchException:输入不匹配
     java.lang.ArrayIndexOutOfBoundsException:数组下标越界


     异常(例外):程序在执行的过程中出现意外的情况,导致程序中断执行
     Java中的异常处理机制: try...catch...finally throws throw
    try..catch..finally语法: 类比多重if...else if...else if...else条件结构记忆
    try:保存的可能出现异常的代码
    catch:处理异常的代码或消息;只有发生的异常与指定的异常类型相匹配时才会执行
    try{
      //可能出现异常的代码
     }catch(异常类型 对象名){
      //处理异常的代码或消息
     }catch(异常类型2 对象名){
      //处理异常的代码或消息
     }....
     }finally{
      //不论异常是否发生都会执行的代码(释放资源)
     }

    public class TestException1 {
        public static void main(String[] args) {
            /*
             *计算N个学员的总成绩和平均成绩 
             */
            int sum=0;//总成绩
            int avg=0;//平均成绩 
            System.out.println("请输入学员人数:");
            Scanner input = new Scanner(System.in);
            try{
                int num = input.nextInt();
                int[] scores = new int[num];//声明一个数组用于保存成绩  
                for(int i=0;i<num;i++){
                    System.out.println("请输入第"+(i+1)+"个人的成绩:");
                    scores[i]=input.nextInt();//将学员成绩保存到数组中
                    sum+=scores[i];//计算总成绩
                }
                avg=sum/num;//平均成绩
            }catch(InputMismatchException  e){
                System.err.println("您输入的人数必须为数字,请重新输入!");
    //            System.err.println(e.getStackTrace());//输出异常对象堆栈信息
                e.printStackTrace();//打印异常对象的堆栈信息
            }catch(ArithmeticException e){
                System.err.println("除数不能为零!");
                e.printStackTrace();
            }
            System.out.println("总成绩:"+sum+",平均成绩:"+avg);
        }
    }

    java.lang.Exception类:所有异常类(XxxxxException)的父类

    public class TestException2 {
        public static void main(String[] args) {
            /*
             *计算N个学员的总成绩和平均成绩 
             */
            int sum=0;//总成绩
            int avg=0;//平均成绩 
            System.out.println("请输入学员人数:");
            Scanner input = new Scanner(System.in);
            try{
                int num = input.nextInt();
                int[] scores = new int[num];//声明一个数组用于保存成绩  
                for(int i=0;i<num;i++){
                    System.out.println("请输入第"+(i+1)+"个人的成绩:");
                    scores[i]=input.nextInt();//将学员成绩保存到数组中
                    sum+=scores[i];//计算总成绩
                }
                avg=sum/num;//平均成绩
            }catch(Exception  e){
                System.err.println("程序出现了异常!");
    //            System.err.println(e.getStackTrace());//输出异常对象堆栈信息
                e.printStackTrace();//打印异常对象的堆栈信息
            }
            System.out.println("总成绩:"+sum+",平均成绩:"+avg);
        }
    }

    catch:处理异常的代码或消息;只有发生的异常与指定的异常类型相匹配时才会执行
        只有当程序的异常被捕获并处理后,程序才能继续执行
      注意:如果有多个catch块,其中catch中的异常类型范围应该从小到大
      出现异常后,try块中尚未执行的语句不会执行
      出现异常后并处理后,catch块后面的语句还会执行

    public class TestException3 {
        public static void main(String[] args) {
            /*
             *计算N个学员的总成绩和平均成绩 
             */
            int sum=0;//总成绩
            int avg=0;//平均成绩 
            System.out.println("请输入学员人数:");
            Scanner input = new Scanner(System.in);
            try{
                int num = input.nextInt();
                int[] scores = new int[num];//声明一个数组用于保存成绩  
                for(int i=0;i<num;i++){
                    System.out.println("请输入第"+(i+1)+"个人的成绩:");
                    scores[i]=input.nextInt();//将学员成绩保存到数组中
                    sum+=scores[i];//计算总成绩
                }
                avg=sum/num;//平均成绩
            }catch(InputMismatchException  e){
                System.err.println("输入不匹配异常!");
                e.printStackTrace();//打印异常对象的堆栈信息
            }catch (Exception e) {
                System.err.println("程序出现了异常!");
                e.printStackTrace();
            }
            System.out.println("总成绩:"+sum+",平均成绩:"+avg);
        }
    }
    public class TryCatchDemo {
        public static void main(String[] args) {
            try{
                System.out.println("try....1");
                int num=10/0;
                System.out.println("try....2");
            }catch(InputMismatchException e){
                System.out.println("catch....");
                e.printStackTrace();
            }
            System.out.println("end.....");
        }
    }

    空指针异常:java.lang.NullPointerException
      产生原因:试图对空对象操作(访问空对象的属性或访问空对象的方法)
    类找到异常:ClassNotFoundException
      产生原因:要加载的类无法找到

    public class Student{
        String name;
        
        public void show(){
            System.out.println("姓名:"+name);
        }
        
        public static void main(String[] args) {
            Student stu=null;
    //        stu.name="张三";
            try{
    //            stu.show();
                Class.forName("java.lang2.String");//加载指定的类
                
            }catch(NullPointerException  e){
                System.err.println("对象不能null,请对对象进行创建!");
            }catch(ClassNotFoundException e){
                System.err.println("类找到异常,请检查全类名!");
            }
            System.out.println("end....");
        }
    }

    try{

      }catch(异常类型 对象名){

      }....
      }finally{
        //总是会被执行的代码
      }
    finally中代码总是会被执行,它执行在return之前。
      只有一种情况finally中的代码才不会执行:调用System.exit(1):终止正在运行的JVM
      通常在finally中关闭程序块已打开的资源,比如:文件流、释放数据库连接等。

    public class TryCatchFinally {
        public static void main(String[] args) {
            //情况1
    //        try {
    //            System.out.println("try....1");
    //            int num=10/0;
    //            System.out.println("try....2");
    //        } catch (Exception e) {
    //            System.out.println("catch....");
    //        }finally{
    //            System.out.println("finally....");
    //        }
    //        System.out.println("end....");
            //情况2
    //        try {
    //            System.out.println("try....1");
    //            int num=10/0;
    //            System.out.println("try....2");
    //        } catch (ClassCastException e) {
    //            System.out.println("catch....");
    //        }finally{
    //            System.out.println("finally....");
    //        }
    //        System.out.println("end....");
        //情况3    
    //        try{
    //            System.out.println("try....");
    //            int num=10/0;
    //            System.out.println("try....2");
    //        }finally{
    //            System.out.println("finally....");
    //        }
    //        System.out.println("end...");
            
            //面试题:
            try{
                System.out.println("begin....1");
                int a=10;
                int b=0;
                System.exit(1);//终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非 0 的状态码表示异常终止。
                int c=a/b;
                System.out.println("begin....2");
    //            return;
            }catch(Exception e){
                System.out.println("catch....");
            }finally{
                System.out.println("finally....");
            }
            
            System.out.println("----------------------");
            try{
                int a=10;
                System.out.println("try...a="+a);
                return;
            }finally{
                System.out.println("finally...");
            }
        }
    }

    finall遇到return关键字,先执行finally中的代码。

    public class TryFianlly {
        public static int test(){
            try{
                return 1;
            }finally{
                return 2;
            }
        }
        public static void main(String[] args) {
            int a = test();
            System.out.println("a="+a);
            try {
                Class.forName("java.lang.String");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

    throws:声明方法时,定义该方法抛出的异常类型。谁调用谁处理。
    语法:
    修饰符 返回值类型 方法名(参数列表) throws 异常类型1,异常类型2....{

    }
    throw:在方法中抛出异常对象,throw关键字后边跟的异常对象,调用者可以继续对所抛出的异常进行处理
    throws和throw的区别:
      1.位置不同:
        throws在方法声明时
        throw在方法体中
      2.类型和个数不同
        throws后跟的是异常类型,可以是多个
        throw后跟的是异常对象,一个
      3.作用不同
        throws声明方法是抛出异常,告知调用者方法中存在异常的风险
        throw是方法处理过程中将异常对象抛出,调用者可以进一步对异常对象进行处理

    public class ThrowsDemo {
        public void test() throws ClassNotFoundException{
            try{
                Class.forName("java.lang.Scanner");
            }catch(ClassNotFoundException e){
                System.err.println("无法加载指定的类...1");
            }
        }
        
        public void test2() throws ClassNotFoundException{
            try{
                Class.forName("java.lang.Scanner");
            }catch(ClassNotFoundException e){
                System.err.println("无法加载指定的类...");
                throw e;//抛出异常
            }
        }
        
        
        public static void main(String[] args) {
            ThrowsDemo throwsDemo = new ThrowsDemo();
            try{
                throwsDemo.test2();
            }catch(ClassNotFoundException e){
                System.err.println("无法加载指定的类2...");
            }
        }
        
    }


    自定义异常:
      1. 编写一个Exception或RuntimeException的子类
      2. 提供两个构造函数:无参和有参

    public class SexException extends Exception{
        public SexException(){
            
        }
        public SexException(String message){
            super(message);
        }
        @Override
        public String toString() {
            //super.getMessage():获取父类中的异常消息
            return "SexException ["+super.getMessage()+"]";
        }
        
    }

    捕获异常的快捷键:
      1.选中检查异常的代码
      2.shift+alt+z

    public class Student {
        private String name;
        private String sex;
        private int age;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getSex() {
            return sex;
        }
        /**
         * 通过自定义异常完成性别的检测
         * @param sex
         * @throws SexException
         */
        public void setSex(String sex) throws SexException {
            if(sex.equals("男")||sex.equals("女")){
                this.sex = sex;
            }else{
                throw new SexException("性别只能是男或女!");
            }
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        
        public void show(){
            System.out.println("姓名:"+name);
            System.out.println("性别:"+sex);
            System.out.println("年龄:"+age);
        }
        
        public static void main(String[] args) {
            Student student = new Student();
            student.setName("zhangsan");
            student.setAge(20);
            try {
                student.setSex("男女男");
            } catch (SexException e) {
                System.err.println(e.getMessage());//获取异常消息
                e.printStackTrace();
            }
            student.show();
            
        }
        
    }
  • 相关阅读:
    SQL:分析函数、排名函数、聚合函数配合窗口函数 OVER 的用法
    SQL:MySQL 中各子句的执行逻辑过程
    SQL:CASE 表达式应用总结
    SQL:BLOB 和 TEXT
    SQL:char 和 varchar、binary 和 varbinary、二进制字符串、严格模式、汉字编码方式
    大数据:数据质量
    大数据:存储和成本管理
    大数据:计算管理
    jQuery.validate.js笔记
    Vistual Studio 条件编辑应用
  • 原文地址:https://www.cnblogs.com/fwdsz/p/6792371.html
Copyright © 2011-2022 走看看