[JAVA笔记]-基础-异常-Java异常处理简单原理

Java异常处理简单原理

异常的分类&体系结构

分类

  • **编译时异常:**指编译期间,编译器检测到某段代码可能会发送某些问题,需要程序员提前给代码做出异常的解决方案,否者编译是不通过的;
  • **运行时异常:**编译通过,但运行时出现错误;

体系结构

  • Throwable

    • Error : 严重性错误
    • Exception :
      • RunTimeException :
        • 运行时异常
      • !RunTimeException :
        • 编译时异常
  • 以下三个对应实例


public class Demo_Error {
	public static void main(String[] args) {
            show();
        }
    
        public static void show(){
        	//循环调用,报错:StackOverFlowError,栈内存溢出!
		show();
	}
}

        public class Demo_RuntimeException {
            //throws FileNotFoundException 运行之前FileReader("D://a.txt");提示异常,引文文件未发现异常,必须抛出异常
            public static void main(String[] args) throws FileNotFoundException{
                FileReader fr = new FileReader("D://a.txt");//文件可能不存在
                    System.out.println(fr);
            }
        }

public class Demo_NoRunTimeException {
	public static void main(String[] args) {
		double a = 10/0;//控制台报:java.lang.ArithmeticException: / by zero
		System.out.println(a);
	}
}

异常产生的原因

java对异常的处理方式是抛出问题给上一级;

  • 如果出现了问题,java会根据异常描述的的异常类,创建一个对象(实例),然后将该对象抛出给上一级,不断向上抛出,直到抛给java虚拟机,虚拟机拿到异常后,就会将错误的原因和所在位置打印到控制台上

//method --> main --> jvm --> 将异常出现的位置和错误的原因打印在控制台
public class Demo_Exception {
	//throws FileNotFoundException 运行之前FileReader("D://a.txt");提示异常,引文文件可能不存在,必须抛出异常
	public static void main(String[] args) throws FileNotFoundException {
	    FileReader fr = new FileReader("D://a.txt");
	    System.out.println(fr);
	}
}

异常的处理方式 :

问题自己不能处理的把问题抛出

  • throws抛出异常: 如果发现问题自己无法完美解决就可以通过throw关键字将异常抛出给调用者,如果用throw将异常抛出,则方法上面必须进行throws的声明,如果抛出的异常是RunTimeException,则方法上面无需Throws声明.

public class Demo1_Exception {
    public static void main(String[] args) throws Exception {
        Person p = new Person();
        p.setAge(-23);
    }
}

class Person{
   private int age;

   public int getAge(){
       return age;
   }

   public void setAge(int age) throws Exception {
       if (age >= 0 && age <= 200) {
           this.age = age;
       }else {
           throw new Exception("您的年龄赋值有误,请检查!");
       }
   }
}

  • 结果: image

问题可以自己处理的,程序员自己处理(try/catch/finally)

  • try/catch的处理方式:不会影响后续代码的执行

public class Demo2_Exception {
	public static void main(String[] args) {
       try {
           int[] arr = null;//可能出现异常的代码
           System.out.println(arr[0]);
       } catch (Exception e) {     //要抓捕的异常
           //异常的处理方式
           System.out.println("出错了!");
       }
           System.out.println("检查try/catch是否影响后续代码的执行?");
    }
}

  • 结果: image

异常问题扩展

项目中常见问题

  • Spring框架的事务默认是RunTimeException才进行回滚
  • 解决方案:
    • 修改Transactional注解中的rollbackFor属性可以指定为Exception异常回滚 @Transactional(rollbackFor={Exception.class})

异常的应用场景

  • 编写自定义异常,利用throw抛出自定义异常
    • 自定义异常:其实就是一个规范的异常类名,根据异常类名能够分析出问题的所在原因
    • 如何实现? -新建一个类, 继承Exception/RunTimeException等即可(如下)

public class Demo1_Exception {
    public static void main(String[] args){
        Person p = new Person();
        p.setAge(-23);
    }
}

class Person{
   private int age;

   public int getAge(){
       return age;
   }

   public void setAge(int age) {
       if (age >= 0 && age <= 200) {
           this.age = age;
       }else {
           throw new MyPersonAgeException("您的年龄赋值有误,请检查!");
       }
   }
}
//自定义异常类
class MyPersonAgeException extends RuntimeException{
    public MyPersonAgeException() {
    }

    public MyPersonAgeException(String message) {
        super(message);
    }
}

  • 结果 image
更新时间:2019-10-18 15:04:44

本文由 Alicyu 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文链接:https://www.alicyu.com/archives/exception
最后更新:2019-10-18 15:04:44

Your browser is out of date!

Update your browser to view this website correctly. Update my browser now

×