前言:想要学好异常,需要了解JVM虚拟机知识,这里涉及面试常问的内存溢出错误解决办法
一、异常是什么?
- 定义
程序运行过程中,由于某些原因导致程序出错,从而结束程序运行,这就称为异常
-  java异常的结构图(超类、子类关系等结构) 
  
  Java 中所有的错误和异常最终都继承自 java.lang.Throwable 这个类。 
 (当然,Object类是Java中所有类的父类,也是Throwable的父类。不过这儿讨论的是异常,所以我们常说,异常的超类是Throwable 类。)
 Java标准库内建了一些通用的异常,这些类以Throwable为顶层父类。
 Throwable下面一层只派生出2个子类:Error类 和 Exception类。
-  2.1 错误:Error类以及它的子类的实例,代表了JVM本身的错误。 
 错误不能被程序员通过代码处理,Error很少出现。
 因此,程序员应该关注Exception为父类的分支下的各种子异常类。
-  2.2 异常: Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。 
 可以被Java异常处理机制使用,是异常处理的核心。(Exception分为:RuntimeException和非RuntimeException )
二、error 和 exception区别 ?
-  相同点: 
 一、都继承自Throwable类
 二、都没有自己实现的方法,都是继承Throwable和Object的
 三、都有四个构造方法,参数及实现的功能一样
-  不同点: 
 一、Error属于系统级错误称之为“错误”,不可被捕获,也就是无法用try catch/throws机制;
 Exception属于应用程序级错误称之为“异常”,可以通过捕获避免,也就是可以用try catch/throws机制;
 二、Error无需在程序中以throws子句中抛出; 而Exception需要抛出
 三、存在Error错误程序不能运行或是运行中断; 存在Exception错误程序可运行并抛出
三、unchecked异常和checked异常的区别
Java 定义了两种异常( C# 只有unchecked异常 ):
-  非受查异常 (Unchecked exception): 
 Error和子类、 继承自 Exception 的 RuntimeException和子类都称为非受查异常,
 就是代码不需要强制处理它们的异常也能通过编译,所以它们称作 unchecked exception。RuntimeException(运行时异常)不需要try…catch…或throws 机制去强制处理。
 编译器不强制记录异常,但是!我们一般都建议手动捕获异常,做自己的逻辑处理。
 生产中,非受查异常中的RuntimeException异常最常见~
-  受查异常 (checked exception): 
 继承自 Exception 的 非RuntimeException:IOException 和其子类、SQLException等等,都是受查异常。代码需要强制处理抛出的异常,要么用 try catch 语句,要么直接用 throws 语句声明,否则编译不通过!!!
 比如:FileNotFoundException, 不处理则会爆红,不能编译!编译器强制我们处理
 生产中,这种异常不常见~
四、java中的异常处理机制(2种)
- try/catch 捕获异常机制(捕获异常)
- throws 声明异常机制(抛出异常)
try :定义可能发生异常的代码 (监控区域)
catch:用来捕捉try中发生的异常(捕获异常区域)
finally:无论是否有异常都会执行的代码(处理善后工作)【除了在一种情况下不能被执行:当执行到System.exit(1)用来强制关闭虚拟机时】
throw :抛出异常
throws :声明异常
【注意事项】
-  即使try和catch块中存在return语句,finally语句也会执行。是在执行完finally语句后再通过return退出。 
-  finally语句块只有一种情况是不会执行的,那就是在执行finally之前遇到了System.exit(0)结束程序运行。 
五.java中异常处理结构
- try-catch 结构:
public static void main(String[] args) {
        FileReader reader = null;
        try{
            System.out.println("第0次打印...");
            reader = new FileReader("D:/a.txt");
            System.out.println("第1次打印...");
            char c = (char)reader.read();
            System.out.println("2"+c);
        }catch(FileNotFoundException e){    //子类异常放在父类异常前面
            System.out.println("第3次打印...");
            e.printStackTrace();
        }catch(IOException e){       //父类异常放在异常后面
            e.printStackTrace();
        }
}
-  try-catch-finally 
 略。
-  多重catch使用结构 
//假设下面的D:/a.txt不存在!!!!
public static void main(String[] args) {
        FileReader reader = null;
        try{
            System.out.println("第0次打印...");
            reader = new FileReader("D:/a.txt");
            System.out.println("第1次打印...");
            char c = (char)reader.read();
            System.out.println("2"+c);
        }catch(FileNotFoundException e){//子类异常放在父类异常前面
            System.out.println("第3次打印...");
            e.printStackTrace();
        }catch(IOException e){ //父类异常放在异常后面
            e.printStackTrace();
        }finally{
            System.out.println("第4次打印...");
            try{
                if (reader != null){
                    reader.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
}

- throws声明异常结构
六、遇到异常怎么打印日志?(从下面5种中选一个自己要的)
public static void main( String[] args ) {
    public String str =null;
	
	try{
		if(str.equals("张三")){
			str = "李四";
		}
	}catch (Exception e){
	    //第1种
		System.out.println("e.getMessage()打印结果: "+ e.getMessage());
		//第2种
		System.out.println("e.getLocalizedMessage()打印结果: "+ e.getLocalizedMessage());
		//第3种
		System.out.println("ExceptionUtils.getStackTrace()打印结果: "+ ExceptionUtils.getStackTrace(e));
		//第4种
		System.out.println("e.toString()打印结果: "+ e.toString());
		System.out.println("============分割线=============");
		//第5种
		e.printStackTrace();
	}
}
七、常见错误异常(每个都要记住5个,面试会问)
-  常见error:(未受查异常/非编译时异常) 
 OutOfMemoryException - 内存溢出异常(面试官可能问你:遇到这个,你怎么解决)
 StackOverflowError - 深递归导致栈被耗尽而抛出的异常
 ThreadDeath - 内存溢出异常(面试官可能问你:遇到这个,你怎么解决)
 VirtualMachineError
 NoClassDefFoundError - 类定义错误异常
 IOError
 …
-  常见RuntimeException:(未受查异常/非编译时异常) 
 NullPointerException - 空指针引用异常
 ClassCastException - 类型强制转换异常
 IndexOutOfBoundsException - 下标越界异常
 ArrayIndexOutOfBoundsException - 数组下标越界异常
 ArithmeticException - 算术运算异常
 IllegalArgumentException - 传递非法参数异常
 SecurityException - 违背安全原值异常
 …
-  非RuntimeException 之 IOException相关:(受查异常/编译时异常) 
 FileNotFoundException - 文件未找到异常
 NumberFormatException - 数据类型转换异常
…
- 非RuntimeException 之 ClassNotFoundException (受查异常/编译时异常)
- 非RuntimeException 之 SQLException:(受查异常/编译时异常)
常见error解决方案:
八、转载
https://blog.csdn.net/qq_45055856/article/details/97817768
 https://blog.csdn.net/m0_67929156/article/details/124112811
 https://blog.csdn.net/m0_54189068/article/details/127106337
 https://blog.csdn.net/song12345xiao/article/details/126489652
 https://blog.csdn.net/qq_40041868/article/details/123471481
 https://blog.51cto.com/u_15271242/2909987
 http://events.jianshu.io/p/3714a154adf8
 https://www.ngui.cc/el/423994.html?action=onClick
 https://blog.csdn.net/Jin_Kwok/article/details/79866465



















