1.异常

导致程序的正常流程被中断的事件,叫做异常;异常的处理有 try catch finally throws;无论是否出现异常,finally中的代码都会被执行;异常分类: 可查异常,运行时异常和错误3种 ;可查异常: 必须进行处理的异常,要么try catch住,要么往外抛,谁调用,谁处理,运行时异常:不是必须进行try catch的异常,除数不能为0异常:ArithmeticException 下标越界异常:ArrayIndexOutOfBoundsException 空指针异常:NullPointerException 错误Error,指的是系统级别的异常,通常是内存用光了其中,运行时异常和错误又叫非可查异常

throws与throw这两个关键字接近,不过意义不一样,有如下区别:

1. throws 出现在方法声明上,而throw通常都出现在方法体内。

2. throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某个异常对象。

一个异常的执行顺序1、new一个异常对象2、终止当前的执行程序。3、弹出异常对象的引用。4、异常处理机制接管被终止的执行程序。5、寻找一个恰当的地点(异常处理程序)继续执行程序。1、捕获异常引入一个概念:监控区域 -- 一段可能产生异常的代码并且后面跟着处理异常的代码

(1)try块

一个方法内部出现问题,或者一个方法内部调用其他方法的时候出现问题,当前程序会立刻中断。如果你不希望程序中断,可以在这个块儿中增加一个“尝试”各种可能产生各种异常的方法调用,他就是try块儿

try{ String ljh = null ; ljh.equals("qwe");}

-(2)catch异常处理程序

必须紧跟在try后面,当你希望对异常做出处理,异常处理程序就是你最好的选择,在这里你可以针对每种想要捕获的异常,准备相应的应对措施,这就是catch

try{ String ljh = null ; ljh.equals("qwe");}catch(Type1 e1){ e1.printStackTrace();}catch(Type2 e2){ e2.printStackTrace();}catch(Type3 e3){ e3.printStackTrace();} // etc...

当异常抛出后,异常处理机制会寻找与异常类型匹配的catch块儿,例如type2类型的异常就会执行e2.printStackTrace();

注意一点:当异常处理机制匹配到了一个异常处理程序时,会在当前异常程序处理完毕后结束整个异常处理环节,其他的异常处理程序不会再执行。

终止模型

:这种模型将假设错误非常关键,以至于程序无法返回到异常发生的地方继续执行,一旦异常抛出错误就意味着世界末日,意味着死亡,意味着GG

恢复模型

:异常处理程序发现了错误,并且修复了错误然后重新调用出问题的方法,并且认为第二次调用该方法会成功。通常可以将try块放入while循环中,不断执行方法,直到得到满意的结果。

File f = new File("d:/LOL.exe"); try { System.out.println("试图打开 d:/LOL.exe"); new FileInputStream(f); System.out.println("成功打开"); } catch (FileNotFoundException e) { System.out.println("d:/LOL.exe不存在"); e.printStackTrace(); } //任何除数不能为0:ArithmeticException int k = 5 / 0; //下标越界异常:ArrayIndexOutOfBoundsException int j[] = new int[5]; j[10] = 10; //空指针异常:NullPointerException String str = null; str.length();//自定义异常class EnemyHeroIsDeadException extends Exception{ public EnemyHeroIsDeadException(){ } public EnemyHeroIsDeadException(String msg){ super(msg); }}public static void main(String[] args) { try{ String ljh = null ; try{ ljh.equals("qwe"); }catch(Exception e){ throw new EnemyHeroIsDeadException("ljh = null"); } }catch(EnemyHeroIsDeadException e){ System.out.println("RuntimeException"); e.printStackTrace(); }}

2.异常原理

Throwable : Throwable类是整个Java异常体系的父类

public class Throwable implements Serializable { /** * Holder class to defer initializing sentinel objects only used * for serialization. */ private static class SentinelHolder { /** * {@linkplain #setStackTrace(StackTraceElement[]) Setting the * stack trace} to a one-element array containing this sentinel * value indicates future attempts to set the stack trace will be * ignored. The sentinal is equal to the result of calling:
* {@code new StackTraceElement("", "", null, Integer.MIN_VALUE)} */ public static final StackTraceElement STACK_TRACE_ELEMENT_SENTINEL = new StackTraceElement("", "", null, Integer.MIN_VALUE); /** * Sentinel value used in the serial form to indicate an immutable * stack trace. */ public static final StackTraceElement[] STACK_TRACE_SENTINEL = new StackTraceElement[] {STACK_TRACE_ELEMENT_SENTINEL}; }// 无参构造函数public Throwable() { fillInStackTrace(); }// 构造函数public Throwable(String message) { fillInStackTrace(); detailMessage = message; }} public synchronized Throwable fillInStackTrace() { if (stackTrace != null || backtrace != null /* Out of protocol state */ ) { backtrace = nativeFillInStackTrace(); stackTrace = libcore.util.EmptyArray.STACK_TRACE_ELEMENT; } return this; } @FastNative // 调用native方法 private static native Object nativeFillInStackTrace();

构造函数调用

fillInStackTrace

内部

stackTrace

是一个

StackTraceElement

数组

private StackTraceElement[] stackTrace = libcore.util.EmptyArray.STACK_TRACE_ELEMENT;// 包含声明的类、方法名 文件名 行数private String declaringClass; private String methodName; private String fileName; private int lineNumber;

nativeFillInStackTrace

:这是个native方法,也就是个底层本地方法来获取当前线程的堆栈信息。据悉这是一个非常耗时的方法。如果我们仅仅需要用到异常的传播性质,而不关心异常的堆栈信息,那么完全可以在自定义异常类的时候重写fillInStackTrace()方法。

异常输出:printStackTrace

try { System.out.println("试图打开 d:/LOL.exe"); new FileInputStream(f); System.out.println("成功打开"); } catch (FileNotFoundException e) { System.out.println("d:/LOL.exe不存在"); e.printStackTrace(); } public void printStackTrace() { printStackTrace(System.err); } public void printStackTrace(PrintStream s) { printStackTrace(new WrappedPrintStream(s)); } private void printStackTrace(PrintStreamOrWriter s) { // Guard against malicious overrides of Throwable.equals by // using a Set with identity equality semantics. Set dejaVu = Collections.newSetFromMap(new IdentityHashMap()); dejaVu.add(this); synchronized (s.lock()) { // Print our stack trace s.println(this); StackTraceElement[] trace = getOurStackTrace(); for (StackTraceElement traceElement : trace) s.println("\tat " + traceElement); // Print suppressed exceptions, if any for (Throwable se : getSuppressed()) se.printEnclosedStackTrace(s, trace, SUPPRESSED_CAPTION, "\t", dejaVu); // Print cause, if any Throwable ourCause = getCause(); if (ourCause != null) ourCause.printEnclosedStackTrace(s, trace, CAUSE_CAPTION, "", dejaVu); } }

e.printStackTrace();

调用Exceptiond的printStackTrace方法,其方法内循环遍历StackTraceElement数组 输出抛出异常的相关类信息

getOurStackTrace()

public StackTraceElement[] getStackTrace() { return getOurStackTrace().clone();}private synchronized StackTraceElement[] getOurStackTrace() { // Initialize stack trace field with information from // backtrace if this is the first call to this method if (stackTrace == UNASSIGNED_STACK || (stackTrace == null && backtrace != null) /* Out of protocol state */) { int depth = getStackTraceDepth(); stackTrace = new StackTraceElement[depth]; for (int i=0; i < depth; i++) stackTrace[i] = getStackTraceElement(i); } else if (stackTrace == null) { return UNASSIGNED_STACK; } return stackTrace;}

Error : Error表示程序在运行期间出现了十分严重、不可恢复的错误

public class Error extends Throwable { static final long serialVersionUID = 4980196508277280342L; public Error() { super(); } public Error(String message) { super(message); } public Error(String message, Throwable cause) { super(message, cause); } public Error(Throwable cause) { super(cause); } protected Error(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); }}

Exception:Exception是应用层面上最顶层的异常类

public class Exception extends Throwable { static final long serialVersionUID = -3387516993124229948L; public Exception() { super(); } public Exception(String message) { super(message); } public Exception(String message, Throwable cause) { super(message, cause); } public Exception(Throwable cause) { super(cause); } protected Exception(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); }}

java 异常 理解_Java:深入理解异常相关推荐

  1. java 异常 理解_java中的异常理解

    java异常是java提供的用于处理程序中错误的一种机制. 所谓错误是指在程序运行的过程中发生的一些异常事件(如:除0溢出,数组下标越界,所要读取的文件不存在). 设计良好地程序应该在程序异常发生时提 ...

  2. java 异常 日志_java中的异常、断言、日志(一)

    1.Java异常处理i.异常的概念和Java里面的异常体系结构1)基本概念:程序中的异常,一般成为例外情况,可以理解为是非正常情况,其他编程语言里面也有这样的情况,Java里面同样存在这样一个体系结构 ...

  3. Java错别字检查_java中关于异常的处理

    初学java的时候,当我们碰到异常时,一般会把异常直接throws抛出去,或则在catch的时候,简单的写一句打印异常信息,但是在实际开发中,是不能这么做的.如果我们将底层的某一个异常简单的print ...

  4. java线程异常终止_java线程莫名异常退出时,如何捕获异常信息

    之前有同事说他的程序里的线程时常莫名退出,日志中没有任何异常信息. 目前我知道的可以获取线程异常信息的方法主要有 1.Future>和ScheduledFuture>的get()方法 2. ...

  5. java线程释放_Java多线程出现异常会自动释放锁

    Java多线程出现异常会自动释放锁 package com.wkcto.intrinsiclock; /** * 同步过程中线程出现异常, 会自动释放锁对象 * * Author: 老崔 */ pub ...

  6. java升序问题_JAVA并发理解之重排序问题

    首先我们先来了解一下什么是重排序:重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段. 从Java源代码到最终实际执行的指令序列,会分别经历下面3种重排序,如下图所示 上述的1 ...

  7. java运行时异常中文_JAVA——运行时异常(RuntimeException)

    Exception中有一个特殊的子类异常RuntimeException运行时异常. 如果在函数内抛出该异常,函数上可以不用声明,编译一样通过. 如果在函数上声明了该异常.调用者可以不用进行处理.编译 ...

  8. java 获取方法_Java 反射理解(三)-- Java获取方法信息

    Java 反射理解(三)-- Java获取方法信息 基本的数据类型.void关键字,都存在类类型. 举例如下: public class ClassDemo2 { public static void ...

  9. java 数据库 异常类型_Java基础 -- 常见异常

    1.常见异常 Exception 类是 Throwable 类的子类.除了Exception类外,Throwable还有一个子类Error . 异常类有两个主要子类:IOException和Runti ...

最新文章

  1. 通知 | 2020年度“RONG”奖学金入围答辩名单公布
  2. 微服务实践分享(8) 控制调用中心
  3. 为什么电商的命门是供应链?
  4. 四面体的表面积_为了解释南北两极海陆的分布,科学家提出了一个“四面体”的观点...
  5. Python 编码规范 PEP 8
  6. jwt配置 restful_SpringBoot实现JWT保护前后端分离RESTful API
  7. 浏览器兼容问题及解决方案
  8. Gazebo烧脑系列:挑战赛
  9. 法定节假日调整方案公布
  10. 2011英语一长难句
  11. 天涯上令人肝肠寸断的100个经典签名
  12. 冰雪复古优化服务器,冰雪复古单职业:最适合长久稳定打金的传奇
  13. 设备价格暴涨让苹果公司在俄罗斯的最大授权经销商被迫关门谢客
  14. 比如说,你下午四点钟来。那么从三点钟起,我就开始感到幸福。时间越临近,我就越感到幸福。到了四点钟的时候,我就会坐立不安:我就会发现幸福的代价。...
  15. Convolutional Neural Network
  16. 欢迎访问4W家庭理财主页!
  17. 【美团】职级、薪酬、绩效全认知
  18. Hive(11):Hive的函数之内置函数
  19. 编写一个程序,分别使用字节流和字符流拷贝一个文本文件
  20. 各大免费邮箱邮件群发账户SMTP服务器配置及SMTP发送量限制情况

热门文章

  1. 应用工程师解读:电流反馈放大器
  2. IPMSM的FOC驱动最大转矩电流比推导计算方法
  3. Android EditText之输入限制设置
  4. 思迈特软件Smartbi:企业HR面对大量的人力资源如何做数据分析
  5. App inventor arduino 手机蓝牙通信实现
  6. Git版本控制——场景七:找bug
  7. 中国移动、中国联通、中国电信号码网段大全
  8. 河南公办计算机中等专业学校,河南中专公办排名
  9. 毕业生迷茫,中年人焦虑,职场路如何越走越宽?
  10. Android手机遥控器解决方案