• java9


    Java异常

    1、异常初见

    System.out.println(1/0); 
    
    运行上面语句之后打印出:
    Exception in thread "main" java.lang.ArithmeticException: / by zero
    
    程序运行之后,在控制台会打印一串信息;这段信息,在Java中叫做异常。
    
    

    2、什么是异常?

    Java程序中异常:程序在运行过程产生的不正常情况;
    编译没有问题,到运行的时候,出现错误. 这种现象叫异常。
    

    3、常见异常

    1.java.lang.NullPointerException

    int a [] = null;
    System.out.println(a.length); 
    

    2.java.lang.ArrayIndexOutOfBoundsException

    int a [] = {};
    a[0] = 10;
    

    4、异常体系

    ArithmeticException, 
    NullPointerException, 
    ArrayIndexOutOfBoundsException,
    
    从上面的3个异常可以看出,在Java中使用不同的类来描述不同的异常。
    

    从图中可以看出:
    
    1、Throwable:Java语言中所有错误或异常的超类;
    2、下面有两个子类,一个 Error(错误),一个Exception(异常)
    

    4.1 Error 和 Exception的区别是什么?

    其实这两个泛指都是异常.
    
    Throwable
       |---- Error       系统程序中,不能处理的错误,比如内存溢出.
       |---- Exception   可以进行处理的.
    

    5、异常处理

    如果我们想让	System.out.println(1/0); 执行,该怎么办?
    
    try {
    	System.out.println(1/0);
    } catch (Exception e) {
    	System.out.println("异常所属类:" + e.getClass());	//获取抛出的异常类的类名
    	System.out.println("异常的原因:" + e.getMessage());	//获取具体的异常原因
    }
    

    5.1 能不能同时捕获到多个异常?

    6、finally 语句

    语法结构:
           try{
              可能出现异常的代码
           }catch(异常类型 e){
              处理异常:
               1 打印到控制台
               2 保存到文件
               3 还可能向外抛出新的异常
           }finally{   
           }
          
    注意:finally后面没有小括号;
    
    6.1 finaly 单词什么含义,表示最终的意思,那里面做什么事情?
    1.关闭流资源(IO流部分讲解)或者 释放锁--线程(以后课程学习)
    
    简单说明一下: 这里的流,类似于水流的意思,比如一个水龙头打开,流出水,突然发生地震了(产生异常),没有关闭水龙头,那水就一直流着,然后可能导致短路,电路中断,然后就可能引起火灾;所以希望中途不管发生什么异常情况,最终都应该关闭水龙头。这样就可以把关闭的代码写在finally里面;
    
    2.释放锁 比如上厕所需要上锁,然后完事了之后,最后在开锁出来。
    特点:如果在finally前面没有执行系统退出(system.exit(0))的语句,此处的代码始终都会执行。
    
    3.不建议此处放return语句来返回一个数据(让程序难以理解,并且这里也不应该放return)
    
    对于上面的结构,也有变种,比如:
    try{
    }finally{
    }
    只有try-finally,没有catch,这种结构在讲线程,释放锁学习
    

    7、异常 throw 与 throws

    练习:计算两个整数相除。

    8、自定义异常

    在Java异常体系已经包含了很多异常类,但是还是不能满足开发的日常情况那应该怎么办?
    

    如何自定义异常?

    场景:
           1。假设用户注册过程中,发现用户名重复了,把这种情况定义为异常类型;
           2。设计一个用户注册的方法,方法里面判断用户注册的用户名是否重复,如果重复,就产生一个异常对象;
           3。调用注册方法来注册一个账号,就会产生一个异常。产生异常之后,就选择是抛出还是处理.
    

    1.定义一个异常类(用户名重复异常)

    package com.rimi.exception;
    
    public class NameRepeatException extends Exception {
    	public NameRepeatException(){
    		super();
    	}
    	public NameRepeatException(String msg){
    		super(msg);
    	}
    	
    }
    
    

    2.写个测试类

    package com.rimi.exception;
    
    public class Test {
    	public static void main(String[] args) {
    
    		String[] names = { "张三", "李四", "王二", "麻子", };
    		try {
    			login("张三", names);
    		} catch (Exception e) {
    			// TODO: handle exception
    			System.out.println("异常抛出:" + e.getMessage());
    		}
    
    	}
    
    	public static void login(String name, String[] names) throws NameRepeatException {
    		for (String string : names) {
    			if (string.equals(name)) {
    				throw new NameRepeatException("名字重复了");
    			}
    		}
    	}
    
    }
    
  • 相关阅读:
    UnicodeEncodeError: 'latin-1' codec can't encode character 'u7801' in position 49: Body ('码') is not valid Latin-1. Use body.encode('utf-8') if you want to send it encoded in UTF-8. 请求body里面有 汉字
    pytest-allure清空上一次运行的记录(--clean-alluredir)用例重复显示
    【DPDK】谈谈DPDK如何实现bypass内核的原理 其二 DPDK部分的实现
    【DPDK】谈谈DPDK如何实现bypass内核的原理 其一 PCI设备与UIO驱动
    【Network telemetry】谈谈网络遥感技术,从主动探测与被动探测再到Netflow与INT
    【DPDK】【ring】从DPDK的ring来看x86无锁队列的实现
    【DPDK】【Multiprocess】一个dpdk多进程场景的坑
    【DPDK】【CPU usage】DPDK应用如何计算当前系统的压力
    Kubernetes client-go Informer 源码分析
    Kubernetes Job Controller 原理和源码分析(二)
  • 原文地址:https://www.cnblogs.com/markbin/p/6641628.html
Copyright © 2020-2023  润新知