• java 异常处理


    • 异常体系
    • 常见异常
    • 异常的处理自定义异
    • 常类及使用常见的异常Exception:被0除,空指针,索引越界等等

    异常的体系

    Throwable(类-超类)

    • Error(子类)

        通常出现重大问题如:虚拟机崩溃或者内存溢出等
        这些异常不用处理,也处理不了

    • Exception (子类)

        在运行时(编译+运行)出现的异常情况,可以通过

      1. try catch finally处理
      2. throw处理

      Exception和Error的子类名都是以父类名作为后缀

                       

     异常处理方式之一:捕获:

    1.trycatch,finally不能单独出现
    2.try必须和catch或者finally配合使用(两者可以出现一个或者都有)
    3.catch可以有多个,但是finally只能有一个
    4.finally代码块只有一种情况不会被执行,就是在之前执行了System.exit(0)

     

    由于捕获的异常都是Throwable类的子类对象,所以完全可以调用Throwable中定义的方法
    getMessage()
    获取异常信息,返回字符串。
    toString()
    获取异常类名和异常信息,返回字符串。
    printStackTrace()
    获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
    printStackTrace(PrintStream s)
    通常用该方法将异常内容保存在日志文件中

     

    public class FinallyTest {
            public static void main(String[] args){
                int res = test();
                System.out.println("test方法的返回值是:"+res);
            }    
            @SuppressWarnings("finally")
            public static int test(){
                try{
                    System.out.println("进入test方法");
                    int i = 10 / 0;
                    return 1;
                }catch(Exception e){
                    System.out.println("发生异常");
                    return 2;
                }finally{
                    System.out.println("finally里的语句");
                    return 3;
                }
            }
        }
    面试题

    异常处理方式之二:声明抛出

     

     

    自定义异常类:

    自定义异常类:自定义类继承Exception或者其子类。
    通过构造方法定义异常信息。

    public class DemoException extends Exception{
        DemoException(String message){
            super(message);
        }
    }

    通过throw抛出自定义的异常对象
    异常细节:

    • RuntimeException以及其子类如果在方法中被throw抛出,可以不用在方法上声明
    • 一个方法被重写时(子类与父类)
    1. 重写方法可以不抛出任何异常(运行时和非运行时)
    2. 重写方法可以抛出和父类方法相同的异常(常用)
    3. 重写方法可以抛出比父类方法多的异常,但都必须是父类方法异常的子类
    4. 编译期异常不能比父类多

      总结重写方法是最好就是和父类保持一致

    /*
        编写程序用于计算两个正数的加减乘除结果
    自定义一个异常类:MyException,当输入的数含有负数的时候,抛出自定义异常对象,并捕获处理
    */
    
    import java.util.Scanner;
    
    class MyException extends Exception{
        //message
        public MyException(String message){
            super(message);
        }
    }
    
    public class ExceptionDemo4{
        public static void main(String[] args){
            try{
                test();
            }catch(MyException e){
                System.out.println(e.getMessage());
            }
            catch(ArithmeticException e){
                e.printStackTrace();
            }
            catch(Exception e){
                System.out.println("发生未知异常");
            }
        }
        
        //
        public static void test() throws MyException,ArithmeticException{
            Scanner s = new Scanner(System.in);
            System.out.print("输入第一个正数:");
            int a = s.nextInt();
            System.out.print("输入第二个正数:");
            int b = s.nextInt();
    
            if(a < 0 || b < 0){
                throw new MyException("你输入的数包含负数");
            }
            
            System.out.println("加法: " + (a + b));
            System.out.println("减法: " + (a - b));
            System.out.println("乘法: " + (a * b));
            System.out.println("除法: " + (a / b));//可能抛算术异常
        } 
        
    }

    异常细节:

     

    主要考虑编译时期Javac报异常 ,运行时不trycatch最终还是会报异常

    import java.sql.SQLException;
    import java.sql.SQLClientInfoException;
    import javax.sql.rowset.serial.SerialException;
    import javax.xml.soap.SOAPException;
    
    class Father{
        
        
        
        public void test() throws SQLException{
            System.out.println("father.test()..");
        }
    }
    
    class Son extends Father{
        //子类可以抛出比父类多的异常,都必须是父类异常的子类
        public void test() throws SQLException,SerialException,SQLClientInfoException{
            System.out.println("son.test()..");
        }
    }
    
    
    
    public class ExceptionDemo5{
        public static void main(String[] args){
            Father f = new Son();
            try{
                f.test();
            }
            catch(Exception e){
                
            }
            
        }
        
        //方法内不想处理的异常是运行时异常,可以省略声明抛出
        public static void test() throws SQLException{
            // int a = 2 / 0;
            throw new SQLException();
        }
        
        
    }
  • 相关阅读:
    「暑期集训day23」黑幕
    暑期集训day23考试整理
    「暑期集训day22」黑色
    暑期集训day22考试整理
    「暑期集训day21」往复
    「暑期集训day20」仰望
    日常报错
    Spring-Boot环境的快速搭建
    jsp和thymeleaf模板
    Boot的简单配置
  • 原文地址:https://www.cnblogs.com/wqbin/p/11176206.html
Copyright © 2020-2023  润新知