我们在编程过程中,通常需要时刻关注可能遇到的问题,此时可以把问题分为两类:普通问题与异常问题。普通问题:我们可以通过从当前环境中获取到的信息来解决这个问题;而异常问题:在当前环境中获取到的信息并不能解决这个问题,所以我们阻止了程序的执行,跳出当前的环境,将这个异常问题,抛到上一级的环境中去解决。可以看出异常机制存在两种基本模型:终止模型(假设异常非常的关键,程序无法自我修复)和恢复模型(可以通过异常处理程序,调用相应的方法来修复出现的错误),然而我们现在所见到的基本为终止模型。

如果方法内部出现了异常,方法将在抛出异常的过程中终止。我们可以通过try建立监控区,在出现异常时跳转到catch区让方法继续执行。我们在编程过程中,关注的重点常在于异常的名字,所以我们可以定义自己需要的异常,此时只需要继承Exception类即可,例如:

public class LogingException extends Exception{

private static final long serialVersionUID = 1L;

private static Logger logger = Logger.getLogger("LoggingException");

public LogingException(){

StringWriter trace = new StringWriter();

printStackTrace(new PrintWriter(trace));

logger.severe(trace.toString());

}

}

我们实现在一个异常,同时重载了printStackTrace()方法,增加了一个新的功能,在抛出异常时可以自动记录日志。printStackTrace()方法会打印Throwable和Throwable的调用栈轨迹,我们可以通过getStackTrace()获取printStackTrace()所提供的信息,会返回一个由栈轨迹中的元素所构成的数组,元素0为栈顶元素,为调用序列中的最后一个方法的调用;最后一个元素为栈底元素,为调用序列中的第一个方法的调用。我们也可以在catch中将异常重新抛出,此时printStackTrace()显示的为原来的异常抛出点的调用栈信息,如果想显示重新抛出点的信息,可以先调用fillInStackTrace()方法,但此时原来异常抛出点的调用栈信息会丢失。

如果我们也需要显示原始异常的信息该怎么做呢?Throwable的构造方法中其中一个就是介绍cause对象作为参数,cause表示原始异常,可以将原始异常传递给新的异常。在出现异常时,可以通过这样的异常链追踪到异常的最初位置,这也是为什么我们调试异常时先从最下面开始看起。

如果我们在方法中抛出异常时,Java强制我们礼貌的告诉别人某个方法可能会抛出的异常类型,这样别人在调用这个方法时就可以作相应的处理,这就是异常说明,通过关键字throws来实现,它属于方法声明的一部分。在Java的继承关系中关于异常由以下几个需要注意的点:

①如果父类某个非构造方法抛出了异常,那么子类相应的方法只能抛出基类方法中列出的那些异常或异常派生出的异常。

②对于构造方法则恰恰相反,子类构造方法必须抛出包含父类构造方法所抛出的异常,这是由于子类通常需要调用父类的构造方法进行初始化。

③虽然编译器对异常说明做了强制要求,但是异常说明并不属于方法类型一部分,所以就不要想着能通过抛出不同的异常来重载方法了。

④在catch方法对异常类型进行匹配时,catch中的参数exception会匹配该异常类及其子类,匹配成功后,java会认为异常得到了处理,就不在继续向下查找了,这点和以前所学的switch不同,没有break之类的。这点非常重要,如果你修改程序方法,抛出了跟具体派生异常,别人并不需修改代码也可以捕获该异常。例如:

class Annoyance extends Exception{};

class Sneeze extends Annoyance{};

public class Human {

public static void main(String[] args) {

try{

throw new Annoyance();

}catch(Sneeze s){

System.out.println("Caught Sneeze");

}catch(Annoyance a){

System.out.println("Caught Annoyance");

}

try{

throw new Sneeze();

}catch(Annoyance a){

System.out.println("Caught Annoyance");

}

//catch(Sneeze s){

//System.out.println("Caught Sneeze");

//}

}

}

java中还存在一类比较特殊的异常RuntimeException(常见到的NullPointerException就属于它),这属于运行时异常,编译器不对异常声明进行强制检查。这也能给我带来很多的便利,我们可以不用写try/catch或异常声明,如果出现异常,会自动沿着调用栈向上冒泡。也可以通过前面提到的异常链,使用RuntimeException包装强制检查的异常,然后通过getCause()捕获特定的异常。

java通过异常处理错误,java基础之通过错误处理异常相关推荐

  1. JAVA编译异常处理:java.lang.OutOfMemoryError: PermGen space

    JAVA编译异常处理:java.lang.OutOfMemoryError: PermGen space 参考文章: (1)JAVA编译异常处理:java.lang.OutOfMemoryError: ...

  2. Java getter和Setter:基础、常见错误和最佳实践

    getter和setter在Java中得到了广泛的应用.它看起来很简单,但并不是每个程序员都能正确地理解和实现这种方法.因此,在本文中,我想深入讨论Java中的getter和setter方法-从基础到 ...

  3. java程序经过编译后会产生byte code_学习廖雪峰的JAVA教程---异常处理(Java的异常)...

    在计算机程序运行的过程中,总是会出现各种各样的错误. 有一些错误是用户造成的,比如,希望用户输入一个int类型的年龄,但是用户的输入是abc: // 假设用户输入了abc:String s = &qu ...

  4. Java基础篇:什么是异常,异常处理的基础是什么?

    异常是在运行时代码序列中产生一种异常情况.换句话说,异常是一个运行时错误.在不支持异常处理的计算机语言中,错误必须被手工的检查和处理--典型的是通过错误代码的运用等等.这种方法既很笨拙也很麻烦. Ja ...

  5. java中异常处理语句错误用法的是_Java异常处理语句及解析

    Java异常处理语句及解析 一.选择题 1.java中用来抛出异常的关键字是 (C) A.tryB.catchC.throw D.finally 2.关于异常,下列说法正确的是 (A) A.异常是一种 ...

  6. [JAVA_开课吧资源]第一周 Java语言概述、Java语言基础

    主题一 Java语言概述 » JDK介绍及其基本组件 Sun公司利用Java开发工具箱(Java Development Toolkit ,JDK)发布Java的各个版本.JDK由开发和测试Java程 ...

  7. 二十九、Java的异常处理

    @Author:Runsen @Date:2020/6/3 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

  8. JAva入门 活着_java基础回顾

    最近在回顾java基础知识,收货颇多,在此做个总结 1.List和Set的区别 ---List -----可以允许重复的对象 -----可以插入null元素 -----是一个有序容器,保持着每个元素的 ...

  9. java doubke类型转换为String_Java基础知识面试题大集合

    本文整理自作者:ThinkWon  链接: blog.csdn.net/ThinkWon/article/details/104390612 本文知识点目录 Java概述 何为编程 什么是Java j ...

  10. java package报错_Java基础知识总结 - 超详细篇(上)

    1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具和jre. 2,JRE:Java Runtime Environment,java程序的运行环境,ja ...

最新文章

  1. Java并发——ReentrantLock
  2. po 价格条件表_SAP-MM定价条件全解析 -
  3. 量子计算机怎么编程,量子计算机编程(一)——QPU编程
  4. Socket选项之SO_RCVTIMEO 和SO_SNDTIMEO
  5. apache禁止訪问某些文件或文件夹的方法
  6. 1000道Python题库系列分享九(31道)
  7. python解析json多行_用Python将JSON单行解析为多行CSV
  8. 将标签重新定义为4个空格
  9. vscode eslint 格式化完之后,一个标签多行,看的头疼
  10. 谷歌正式推出在线云储存服务Google Drive
  11. 手机电子词典_一个落榜生的醒悟:我的梦想,是手机夺走的!
  12. Java 视频资源分享(干货)
  13. Prescan(一):无人驾驶仿真软件简介
  14. 【“计算机科学与技术”专业小白成长系列】Peter Norvig:十年学会编程
  15. 计算机远程桌面连接连接不上,电脑远程桌面连接不上的解决方法
  16. 洛谷 3097 USACO13DEC 最优挤奶 Optimal Milking
  17. 【历史上的今天】4 月 3 日:亚马逊卖出第一本书;世界上第一通手机电话;IBM 计算机先驱出生
  18. win10九月十五更新补丁导致共享打印机无法连接
  19. 英特尔推出全新RRP物联网平台 计划为零售技术投资一亿美元
  20. 8.10 12.1-12.5

热门文章

  1. 2022-2028年中国SCR脱硝催化剂行业研究及前瞻分析报告
  2. 使用Docker搭建svn服务器教程
  3. 2022-2028年中国综艺节目市场深度调研及投资前景预测报告
  4. java发送简单邮件_Java程序实现发送简单文本邮件
  5. Redis 笔记(03)— string类型(设置key、获取key、设置过期时间、批量设置获取key、对key进行加减、对key值进行追加、获取value子串)
  6. 德国最受欢迎的程序员技能排行
  7. Mysql创建数据库用户
  8. Java中类、常量、变量、方法名等命名规则
  9. Auto ML自动特征工程
  10. NVIDIA® TensorRT™ supports different data formats