zoukankan      html  css  js  c++  java
  • 详解 异常

    讲到这个板块,本人相信有丰富编程经验的同学,就会特别注意啦。因为我们编写的代码,随着代码量的增加,出现错误的几率也会增大。但是,一旦我们在一个程序中编写了很多代码,这时候出现错误,就会很头疼,因为有时候改了这边,那边就要出问题。所以,本人现在通过这篇博文来讲解一下,在Java中,我们该如何处理异常。



    异常:

    概述:
    异常就是Java程序在运行过程中出现的错误。

    首先,本人来展示一个在C语言中我们经常会出现的问题,在Java中的一种异常——“内存泄漏”
    看下段代码:
    异常 导致 内存泄漏


    现在,本人来介绍下 异常的继承体系:

    异常的继承体系:

    继承体系
    异常的基类: Throwable

    • 严重问题: Error 不予处理,因为这种问题一般是很严重的问题,比如: 内存溢出
    • 非严重问题: Exception,又分为:
      1. 编译时异常: 非RuntimeException(亦或被称为 非运行时异常
      2. 运行时异常: RuntimeException

    如果觉得文字描述不太清晰,那么请看下图:
    异常的继承体系


    那么,本人就来讲解下这两类异常的区别吧:

    两类异常的区别:

    编译时异常(非运行时异常)和 运行时异常 的 区别

    • 编译时异常:
      Java程序必须显示处理否则程序就会发生错误无法通过编译
    • 运行时异常:
      无需显示处理,也可以和编译时异常一样处理

    那么,现在本人来介绍下Throwable类:


    Throwable类:

    概念

    用于 处理异常信息 的类

    在这里,本人先来介绍下Throwable这个类中的常用API:

    Throwable的常用API

    • getMessage():
      获取异常信息,返回字符串。
    • toString():
      获取异常类名和异常信息,返回字符串。
    • printStackTrace():
      获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。

    那么,现在本人来展示下这个类的使用:

    package about_io;
    
    public class Test {
    	
    	public static void main(String[] args) {
            try {
                System.out.println(1 / 0);
            } catch (ArithmeticException e) {
                //这里面,是try里面一旦遇到该异常,就进catch
                e.printStackTrace();//打印异常的堆栈信息
                
                String message = e.getMessage(); //获取异常信息
                System.out.println(e.toString());
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("之后的代码");
        }
    	
    }
    

    那么,让我们来看一下运行结果:
    在这里插入图片描述


    JVM对于异常的处理方法:

    对于异常,JVM的处理方法:

    • 自己将该问题解决,然后继续运行
    • 自己没有针对的解决方式,只有交给调用main的JVM来处理
      JVM有一个默认的异常处理机制:
      1. 将该异常的名称,异常的信息.异常出现的位置打印在了控制台上,
      2. 将程序停止运行(即:可认为异常相当于return)

    由于本人在下面的讲解中,要处理“除0错”的异常,
    所以,本人就通过“除0错”异常来展示下JVM的处理方法:
    在这里插入图片描述
    可以看到:
    异常信息被打印在了控制台上,
    并且程序在发生异常的那一行停止了,没再运行后面的代码。

    现在,本人来告诉大家一个关于“除0错”的一个非常奇怪的知识点:

    除0异常只会出现在int型中

    下面我们来编写两段代码来验证下:

    package com.mec.about_expection;
    
    public class Test {
    
    	public static void main(String[] args) {
    		double num = 1.0;
    		
    		System.out.println(num / 0.0);
    	}
    
    }
    

    在这里插入图片描述

    现在,本人为了更进一步验证“除0错异常”只会出现在int类型中,来编写一个Complex类(即:验证用户自定义类型也不会出现“除0错异常”):

    package com.mec.complex;
    
    public class Complex {
    	private double real;
    	private double vir;
    	
    	public Complex(double real, double vir) {
    		this.real = real;
    		this.vir = vir;
    	}
    	
    	public Complex() {
    		this(0.0, 0.0);
    	}
    
    	public Complex(Complex c) {
    		this(c.real, c.vir);
    	}
    
    	public double getReal() {
    		return real;
    	}
    
    	public void setReal(double real) {
    		this.real = real;
    	}
    
    	public double getVir() {
    		return vir;
    	}
    
    	public void setVir(double vir) {
    		this.vir = vir;
    	}
    	
    	public Complex add(Complex c) {
    		this.real += c.real;
    		this.vir += c.vir;
    		
    		return this;
    	}
    	
    	public static Complex add(Complex one, Complex another) {
    		return new Complex (one).add(another);
    	}
    	
    	private static Complex opposite(Complex c) {
    		return new Complex(-c.real, -c.vir);
    	}
    	
    	private static Complex reciprocal(Complex c) {
    		double model = c.real * c.real + c.vir * c.vir;
    		
    		if(Math.abs(model) < 1e-6) {
    			return null;
    		}
    		
    		return new Complex(c.real / model, -c.vir / model);
    	}
    	
    	public Complex sub(Complex c) {
    		return this.add(opposite(c));
    	}
    	
    	public static Complex sub(Complex one, Complex another) {
    		return new Complex(one).add(opposite(another));
    	}
    	
    	public Complex mul(Complex one) {
    		double real = this.real;
    		
    		this.real = real * one.real - this.vir * one.vir;
    		this.vir = real * one.vir - this.vir * one.real;
    		
    		return this;
    	}
    
    	public static Complex mul(Complex one, Complex another) {
    		return new Complex (one).mul(another);
    	}
    	
    	public static Complex div(Complex one, Complex another) {
    		Complex rec = reciprocal(another);
    		return rec == null ? null : new Complex(one).mul(rec);
    	}
    	
    	@Override
    	public String toString() {
    		return "(" + real + "," + vir + ")";
    	}
    	
    	@Override
    	public boolean equals(Object obj) {
    		if(null == obj) {
    			return false;
    		}
    		if(this == obj) {
    			return true;
    		}
    		if(!(obj instanceof Complex)) {
    			return false;
    		}
    		Complex c = (Complex) obj;
    		return Math.abs(this.real - c.real) < 1e-6
    				&& Math.abs(this.vir - c.vir) < 1e-6;
    	}
    	
    }
    

    在这里插入图片描述

    在这里,我们能够清晰地看到——没有出现“除0错异常”。
    这是为什么呢?
    答曰:除0异常只会出现在int型中


    对于异常,我们有两种处理方式

    异常的处理方式:

    请观看本人博文——《详解 异常的处理方式》


    接下来,本人要讲解一个非常重要的知识点——自定义异常

    自定义异常:

    请观看本人博文 —— 《详解 自定义异常》


  • 相关阅读:
    MYSQL分库分表
    MYSQL主从数据库
    mysql not in用法
    python 文件及目录操作
    python 读写文件
    python字符编码
    python类的继承、封装和多态
    python之定义类创建实例
    理解OSI参考模型
    python闭包与装饰器
  • 原文地址:https://www.cnblogs.com/codderYouzg/p/12418394.html
Copyright © 2011-2022 走看看