Java异常机制

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。(语法错误和逻辑错误不是异常)

比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。

异常发生的原因有很多,通常包含以下几大类:

  • 用户输入了非法数据。
  • 要打开的文件不存在。
  • 网络通信时连接中断,或者JVM内存溢出。

这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。

Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError和OOM。一般不编写针对性代码进行处理。

Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。如:空指针访问、试图读取不存在的文件、网络连接中断、数组角标越界。

分类

  • 检查性异常:最具代表性的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在的文件时,一个异常就发生了,这些异常再编译时不能简单地被忽略。
  • 运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
  • 错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译时也是检查不到的。

异常处理机制

  • 抛出异常
  • 捕获异常

异常处理五个关键字

  • try
  • catch
  • finally
  • throw
  • throws

异常处理方式

try-catch-finally:

public class Test {public static void main(String[] args) {int a = 1;int b = 0;try {//监控区域System.out.println(a/b);}catch (Error e){//catch(想要捕获的异常类型) 捕获异常System.out.println("程序出现异常,变量b不能为0");}catch (Exception e){System.out.println("exception");}catch (Throwable e){System.out.println("throwable");}finally {//可以没有finallySystem.out.println("finally");}}
}

throws

将异常抛出交给调用它的上级方法处理。写在方法的声明处,指明此方法执行时,可能会抛出的异常类型。一旦当方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出。后续代码不再执行。

/** 异常处理方式二:throws + 异常类型*/public class ExceptionTest2 {public static void main(String[] args){try {method2();}catch (FileNotFoundException e){e.printStackTrace();} catch (IOException e) {// TODO: handle exceptione.printStackTrace();}method3();}public static void method3(){try {method2();}catch (FileNotFoundException e){e.printStackTrace();} catch (IOException e) {// TODO: handle exceptione.printStackTrace();}}public static void method2() throws FileNotFoundException, IOException{method1();}public static void method1() throws FileNotFoundException, IOException{File file = new File("hello.txt");FileInputStream fis = new FileInputStream(file);int data = fis.read();while(data != -1){System.out.println((char)data);data = fis.read();}fis.close();}}
  • try-catch-finally:真正的将异常处理掉了

  • throws:只是将异常抛给了方法的调用者。并没有真正将异常处理掉。

  • 开发中如何选择使用try-catch-finally还是throws

    • 如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类重写的方法中有异常,必须使用try-catch-finally方式处理。
    • 执行的方法a中先后又调用了另外的几个方法,这几个方法是递进关系执行的。我们建议这几个方法使用throws的方式进行处理。而执行的的方法a可以考虑使用try-catch-finally方式进行处理。

手动抛出异常throw

package com.atm.java;public class StudentTest {public static void main(String[] args) {Student s = new Student();try {s.regis(-1001);System.out.println(s);} catch (Exception e) {// TODO Auto-generated catch blockSystem.out.println(e.getMessage());}}}class Student{private int id;public void regis(int id) throws Exception{if(id > 0){this.id = id;}else{//System.out.println("您输入的数据非法");//手动抛出异常//方法1//throw new RuntimeException("您输入的数据非法");//方法2throw new Exception("您输入的数据非法");}}@Overridepublic String toString() {return "Student [id=" + id + "]";}
}

用户自定义异常

/** 如何自定义异常类?* 1.继承于现有的异常类* 2.提供全局常量 serialVersionUID* 3.提供重载的构造器*/
public class MyException extends RuntimeException{static final long serialVersionUID = -7034897190745766939L;public MyException(){}public MyException(String msg){super(msg);}
}public class StudentTest {public static void main(String[] args) {Student s = new Student();try {s.regis(-1001);System.out.println(s);} catch (Exception e) {// TODO Auto-generated catch blockSystem.out.println(e.getMessage());}}}class Student{private int id;public void regis(int id) throws Exception{if(id > 0){this.id = id;}else{//System.out.println("您输入的数据非法");//手动抛出异常//方法1//throw new RuntimeException("您输入的数据非法");//方法2//throw new Exception("您输入的数据非法");//方法3throw new MyException("不能输入负数");}}@Overridepublic String toString() {return "Student [id=" + id + "]";}}

Java学习笔记 | Java异常处理相关推荐

  1. 狂神说Java学习笔记 Java基础

    目录 机器语言 第二代语言(汇编语言) 第三代语言 高级语言 Java特性和优势 JDK(Java Development Kit) JRE(Java Runtime Enviroment) JVM( ...

  2. java学习笔记—java的学习路线

    Java体系涉及到三个方面:J2SE,J2EE,J2ME(KJAVA). J2SE,Java 2 Platform Standard Edition,我们经常说到的JDK,就主要指的这个,它是三者的基 ...

  3. java学习笔记 java编程思想 第6章 访问权限控制

    文章目录 6.1 包:库单元(the library unit) 6.1.1 代码组织 6.1.2 创建独一无二的包名 练习1 练习2 6.1.3 定制工具类 6.1.4 用import改变行为 练习 ...

  4. Java学习笔记--Java中必记常见异常

    JAVA常见异常 Java.io.NullPointerException null 空的,不存在的 NullPointer 空指针 空指针异常,该异常出现在我们操作某个对象的属性或方法时,如果该对象 ...

  5. JAVA学习笔记——JAVA基础语法(二)

    一.面向对象和面向过程的区别 面向过程:它所考虑的是过程和步骤,比如说开车去深圳我们要考虑的是怎么去也就是说:what  to do 面向对象:它所考虑的是有几个对象,比如开车去深圳我们要考虑的就是有 ...

  6. JAVA学习笔记—JAVA SE(四)JAVA核心库类(下)

    文章目录 四.JAVA核心库类(下) 1. 异常机制和File类 1.1 异常机制 1.1.1 基本概念 1.1.2 异常的分类 1.1.3 异常的避免 1.1.4 异常的捕获 1.1.5 异常的抛出 ...

  7. java学习笔记-java中运算符号的优先顺序

    java中各种运算符具有优先级顺序,一般会先计算优先级高的,再计算优先级低的.可以使用()使得优先级变为最高. 在算术运算中,优先级为 ++ -- * / + - 在在逻辑运算中的优先级是 ! 取反 ...

  8. java学习笔记--java中的基本数组[5]

    java基础很重要, 今天呆家看java视频,顺便总结前几周看的java书籍,做一下简单的总结:1:数组的声明,2:数组的赋值: 3:数组的方法: 声明一个数组主要有两种方式: //类型 []数组名字 ...

  9. JAVA学习笔记——JAVA基础语法之精华

    一.标识符 概念:JAVA里面我们可以给他取名字的(变量.类.方法等等)就是标识符: 注意:1.标识符只能包含字母.数字.下划线还有美元符号$ 2.只能以字母.下划线和美元符号开头 二.变量 概念:J ...

  10. Java学习笔记——Java程序运行超时后退出或进行其他操作的实现

    当程序进入死循环或者由于其他原因无法自行终止的时候,就需要强制退出程序了. 对于开发软件 Eclipse ,在程序执行超时后,可以点击 Terminate 按钮强制退出. 那么,我们可不可以通过程序设 ...

最新文章

  1. snipaste滚动截图方法_电脑必备!这个截图神器比QQ截图更好用
  2. 2018蓝桥杯省赛---java---C---9(小朋友崇拜圈)
  3. 推荐:26种NLP练手项目(代码+数据)
  4. bootstrap中轮播图、模态框、提示框/弹出框、滚动监听、弹性布局、响应式flex、多媒体对象
  5. 华为高管预告手机鸿蒙OS下月上线,华为手机部:我们没说过
  6. Gartner:智能SOC/情报驱动的SOC的五大特征
  7. 调用http_Go教程34:Go微服务间Http+Json调用
  8. Atitit 运维之道 v2 s09.docx Atitit 运维之道 目录 1. 概念 2 1.1. devops算是最低门槛了。什么运维平台,搞来搞去也就那些东西。无外乎cmdb、部署、监
  9. 机器学习笔记(三十一):集成学习
  10. python graphx_Spark GraphX实战
  11. 自学SpringBoot二之配置文件--yml格式配置
  12. 从苏宁电器到卡巴斯基(后传)第04篇:还愿吾爱破解视频教程大赛
  13. 什么是敏捷开发?它有什么特点
  14. VOB文件用什么软件打开,VOB文件如何转换成MP4格式
  15. pandas.plotting.scatter_matrix 参数
  16. 什么是smart原则,有什么好的例子
  17. Vue中使用Ckplayer播放器
  18. 内存分配者-动态内存
  19. 绩效评估、绩效审计与绩效优化
  20. leaflet实现风场流动

热门文章

  1. Flink状态的缩放(rescale)与键组(Key Group)设计
  2. 如何优雅的在word打公式
  3. ObsidianFolderSync 创作格外丝滑
  4. 算法题目打卡:Ques20201008
  5. 拉格朗日插值的优缺点_如何直观地理解拉格朗日插值法?
  6. 一个测试的日常:对于python装饰器的理解(个人心得及体会)
  7. win与安卓同步剪切板 快传照片
  8. adb获取剪贴板内容_Android复制粘贴剪切板内容的一种方法
  9. 生活中的算法的实际举例_生活中的算法
  10. #英语# 表示人的名词后缀论文文献