Java学习笔记 | Java异常处理
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异常处理相关推荐
- 狂神说Java学习笔记 Java基础
目录 机器语言 第二代语言(汇编语言) 第三代语言 高级语言 Java特性和优势 JDK(Java Development Kit) JRE(Java Runtime Enviroment) JVM( ...
- java学习笔记—java的学习路线
Java体系涉及到三个方面:J2SE,J2EE,J2ME(KJAVA). J2SE,Java 2 Platform Standard Edition,我们经常说到的JDK,就主要指的这个,它是三者的基 ...
- java学习笔记 java编程思想 第6章 访问权限控制
文章目录 6.1 包:库单元(the library unit) 6.1.1 代码组织 6.1.2 创建独一无二的包名 练习1 练习2 6.1.3 定制工具类 6.1.4 用import改变行为 练习 ...
- Java学习笔记--Java中必记常见异常
JAVA常见异常 Java.io.NullPointerException null 空的,不存在的 NullPointer 空指针 空指针异常,该异常出现在我们操作某个对象的属性或方法时,如果该对象 ...
- JAVA学习笔记——JAVA基础语法(二)
一.面向对象和面向过程的区别 面向过程:它所考虑的是过程和步骤,比如说开车去深圳我们要考虑的是怎么去也就是说:what to do 面向对象:它所考虑的是有几个对象,比如开车去深圳我们要考虑的就是有 ...
- JAVA学习笔记—JAVA SE(四)JAVA核心库类(下)
文章目录 四.JAVA核心库类(下) 1. 异常机制和File类 1.1 异常机制 1.1.1 基本概念 1.1.2 异常的分类 1.1.3 异常的避免 1.1.4 异常的捕获 1.1.5 异常的抛出 ...
- java学习笔记-java中运算符号的优先顺序
java中各种运算符具有优先级顺序,一般会先计算优先级高的,再计算优先级低的.可以使用()使得优先级变为最高. 在算术运算中,优先级为 ++ -- * / + - 在在逻辑运算中的优先级是 ! 取反 ...
- java学习笔记--java中的基本数组[5]
java基础很重要, 今天呆家看java视频,顺便总结前几周看的java书籍,做一下简单的总结:1:数组的声明,2:数组的赋值: 3:数组的方法: 声明一个数组主要有两种方式: //类型 []数组名字 ...
- JAVA学习笔记——JAVA基础语法之精华
一.标识符 概念:JAVA里面我们可以给他取名字的(变量.类.方法等等)就是标识符: 注意:1.标识符只能包含字母.数字.下划线还有美元符号$ 2.只能以字母.下划线和美元符号开头 二.变量 概念:J ...
- Java学习笔记——Java程序运行超时后退出或进行其他操作的实现
当程序进入死循环或者由于其他原因无法自行终止的时候,就需要强制退出程序了. 对于开发软件 Eclipse ,在程序执行超时后,可以点击 Terminate 按钮强制退出. 那么,我们可不可以通过程序设 ...
最新文章
- snipaste滚动截图方法_电脑必备!这个截图神器比QQ截图更好用
- 2018蓝桥杯省赛---java---C---9(小朋友崇拜圈)
- 推荐:26种NLP练手项目(代码+数据)
- bootstrap中轮播图、模态框、提示框/弹出框、滚动监听、弹性布局、响应式flex、多媒体对象
- 华为高管预告手机鸿蒙OS下月上线,华为手机部:我们没说过
- Gartner:智能SOC/情报驱动的SOC的五大特征
- 调用http_Go教程34:Go微服务间Http+Json调用
- Atitit 运维之道 v2 s09.docx Atitit 运维之道 目录 1. 概念	2 1.1. devops算是最低门槛了。什么运维平台,搞来搞去也就那些东西。无外乎cmdb、部署、监
- 机器学习笔记(三十一):集成学习
- python graphx_Spark GraphX实战
- 自学SpringBoot二之配置文件--yml格式配置
- 从苏宁电器到卡巴斯基(后传)第04篇:还愿吾爱破解视频教程大赛
- 什么是敏捷开发?它有什么特点
- VOB文件用什么软件打开,VOB文件如何转换成MP4格式
- pandas.plotting.scatter_matrix 参数
- 什么是smart原则,有什么好的例子
- Vue中使用Ckplayer播放器
- 内存分配者-动态内存
- 绩效评估、绩效审计与绩效优化
- leaflet实现风场流动