一、Exception 类的层次

所有的异常类是从 java.lang.Exception 类继承的子类。

Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。

Error 用来指示运行时环境发生的错误。

异常类有两个主要的子类:IOException 类和 RuntimeException 类。

JAVA异常与异常处理提示:传送门

测试

1、抛出java.lang.ArithmeticException异常

  1. package Cynical_Gary;
  2.  
  3. public class Gary_Text {
  4.  
  5. public static void main(String[] args) {
  6. System.out.println("-1.0/0 = "+(-1.0/0)); //演示负浮点数除以0
  7. System.out.println("+1.0/0 = "+(+1.0/0)); //演示正浮点数除以0
  8. try { //捕捉异常
  9. System.out.println("-1.0/0="+(-1/0)); //演示负整数除以0
  10. }catch(Exception e) {
  11. System.out.println("抛出异常:"+e.getMessage());
  12. }
  13. System.out.println("+1/0="+(+1/0)); //演示正整数除以0
  14. System.out.println("输出结束。");
  15. }
  16. }
  17.  
  18. /*
  19. 输出:
  20. Exception in thread "main" java.lang.ArithmeticException: / by zero
  21. at Cynical_Gary.Gary_Text.main(Gary_Text.java:13)
  22. -1.0/0 = -Infinity
  23. +1.0/0 = Infinity
  24. 抛出异常:/ by zero
  25. */

算数异常

2、抛出java.lang.StringIndexOutOfBoundsException异常

  1. package Cynical_Gary;
  2.  
  3. import java.util.Arrays;
  4.  
  5. public class Gary_Text {
  6.  
  7. public static void main(String[] args) {
  8. int array[] = new int[5];
  9. Arrays.fill(array, 6);
  10. for(int i=0;i<6;i++) {
  11. System.out.println("array["+i+"]"+array[i]);
  12. }
  13. }
  14. }
  15.  
  16. /*
  17. 输出:
  18. array[0]6
  19. array[1]6
  20. array[2]6
  21. array[3]6
  22. array[4]6
  23. Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
  24. at Cynical_Gary.Gary_Text.main(Gary_Text.java:11)
  25.  
  26. */

数组下标越界异常

3、抛出java.lang.NullPointerException异常

  1. package Cynical_Gary;
  2.  
  3. public class Gary_Text {
  4.  
  5. public static void main(String[] args) {
  6. String string = null;
  7. System.out.println(string.toLowerCase());
  8. }
  9. }
  10.  
  11. /*
  12. 输出:
  13. Exception in thread "main" java.lang.NullPointerException
  14. at Cynical_Gary.Gary_Text.main(Gary_Text.java:7)
  15. */

空指针异常

4、抛出java.lang.ClassNotFoundException异常

  1. package Cynical_Gary;
  2.  
  3. public class Gary_Text {
  4.  
  5. public static void main(String[] args) {
  6. try{
  7. Class.forName("com.mysql.jdbc.Driver"); //加载MySQL驱动程序
  8. }catch(ClassNotFoundException e){ //捕获异常
  9. e.printStackTrace(); //打印堆栈信息
  10. }
  11. }
  12. }
  13.  
  14. /*
  15. 输出:
  16. java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
  17. */

缺少类的异常

5、抛出java.lang.IllegalAccessException异常

  1. package Cynical_Gary;
  2.  
  3. import java.lang.reflect.Field;
  4.  
  5. public class Gary_Text {
  6.  
  7. public static void main(String[] args) {
  8. Class<?>clazz = String.class; //获得代表String类的类对象
  9. Field[] fields = clazz.getDeclaredFields(); //获得String类的所有域
  10. for(Field field:fields) { //遍历所有域
  11. try {
  12. System.out.println(field.getInt("hash")); //输出hash的值
  13. }catch(IllegalArgumentException e) { //捕获IllegalArgumentException异常
  14. e.printStackTrace();
  15. }catch(IllegalAccessException e) { //捕获IllegalAccessException异常
  16. e.printStackTrace();
  17. }
  18. }
  19. }
  20. }
  21.  
  22. /*
  23. 输出:
  24. java.lang.IllegalAccessException: Class Cynical_Gary.Gary_Text can not access a member of class java.lang.String with modifiers "private final"
  25. at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
  26. at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(Unknown Source)
  27. at java.lang.reflect.AccessibleObject.checkAccess(Unknown Source)
  28. at java.lang.reflect.Field.getInt(Unknown Source)
  29. at Cynical_Gary.Gary_Text.main(Gary_Text.java:12)
  30. */

非法访问异常

6、抛出java.io.FileNotFoundException异常

  1. package Cynical_Gary;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.IOException;
  7.  
  8. public class Gary_Text {
  9.  
  10. public static void main(String[] args) {
  11. FileInputStream fis = null; //创建一个文件输入流对象
  12. try {
  13. File file = new File("d\\kira.txt"); //创建一个文本对象
  14. fis = new FileInputStream(file); //初始化文件输入流对象
  15. }catch(FileNotFoundException e) { //捕获异常
  16. e.printStackTrace();
  17. }finally {
  18. try {
  19. fis.close(); //释放资源
  20. }catch(IOException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. }
  25. }
  26.  
  27. /*
  28. 输出:
  29. java.io.FileNotFoundException: d\kira.txt (系统找不到指定的路径。)
  30. at java.io.FileInputStream.open0(Native Method)
  31. at java.io.FileInputStream.open(Unknown Source)
  32. at java.io.FileInputStream.<init>(Unknown Source)
  33. at Cynical_Gary.Gary_Text.main(Gary_Text.java:14)
  34. Exception in thread "main" java.lang.NullPointerException
  35. at Cynical_Gary.Gary_Text.main(Gary_Text.java:19)
  36.  
  37. */

文件无法发现异常

7、抛出java.lang.ClassNotFoundException异常

  1. package Cynical_Gary;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.SQLException;
  6.  
  7. public class Gary_Text {
  8.  
  9. public static void main(String[] args) {
  10. String URL = "jdbc:mysql://localhost:3306/db_database"; //MySQL数据库的URL
  11. String DRIVER = "com.mysql.jdbc.Driver"; //数据库的用户名
  12. String USERNAME = "mr"; //数据库的用户名
  13. Connection connection = null;
  14.  
  15. try {
  16. Class.forName(DRIVER); //加载驱动
  17. connection = DriverManager.getConnection(URL,USERNAME,""); //建立连接
  18. }catch(SQLException e) {
  19. e.printStackTrace();
  20. }catch(ClassNotFoundException e) {
  21. e.printStackTrace();
  22. }finally {
  23. try {
  24. connection.close();
  25. }catch(SQLException e){
  26. e.printStackTrace();
  27. }
  28. }
  29. }
  30. }
  31.  
  32. /*
  33. 输出:
  34. java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
  35. at java.net.URLClassLoader.findClass(Unknown Source)
  36. at java.lang.ClassLoader.loadClass(Unknown Source)
  37. at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
  38. at java.lang.ClassLoader.loadClass(Unknown Source)
  39. at java.lang.Class.forName0(Native Method)
  40. at java.lang.Class.forName(Unknown Source)
  41. at Cynical_Gary.Gary_Text.main(Gary_Text.java:16)
  42. Exception in thread "main" java.lang.NullPointerException
  43. at Cynical_Gary.Gary_Text.main(Gary_Text.java:24)
  44.  
  45. 这里需要将MySQL数据库驱动包配置到构建路径中,否则将不能抛出SQLException异常,而是抛出ClassNotFoundException异常
  46. */

数据库操作异常

8、抛出java.lang.UnsupportedOperationException异常

  1. package Cynical_Gary;
  2.  
  3. public class Gary_Text {
  4. public static void throwException(){
  5. throw new UnsupportedOperationException("此方法尚未实现"); //抛出异常
  6. }
  7. public static void main(String[] args) {
  8. Gary_Text.throwException();
  9. }
  10. }
  11.  
  12. /*
  13. 输出:
  14. Exception in thread "main" java.lang.UnsupportedOperationException: 此方法尚未实现
  15. at Cynical_Gary.Gary_Text.throwException(Gary_Text.java:6)
  16. at Cynical_Gary.Gary_Text.main(Gary_Text.java:9)
  17. */

方法中抛出异常

9、抛出java.lang.ClassNotFoundException异常

  1. package CynicalGary;
  2.  
  3. public class Gary_Text {
  4. public static void throwsException() throws ClassNotFoundException{ //抛出异常
  5. Class.forName("com.mysql.jdbc.Driver");
  6. }
  7.  
  8. public static void main(String[] args) {
  9. try { //捕获异常
  10. Gary_Text.throwsException(); //调用抛出异常
  11. }catch(ClassNotFoundException e) {
  12. e.printStackTrace();
  13. }
  14. }
  15.  
  16. }
  17.  
  18. /*
  19. 输出
  20. java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
  21. at java.net.URLClassLoader.findClass(Unknown Source)
  22. at java.lang.ClassLoader.loadClass(Unknown Source)
  23. at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
  24. at java.lang.ClassLoader.loadClass(Unknown Source)
  25. at java.lang.Class.forName0(Native Method)
  26. at java.lang.Class.forName(Unknown Source)
  27. at CynicalGary.Gary_Text.throwsException(Gary_Text.java:5)
  28. at CynicalGary.Gary_Text.main(Gary_Text.java:10)
  29. */

方法上抛出异常

10、抛出CynicalGary(自定义类).DivideZeroException异常

  1. package CynicalGary;
  2.  
  3. public class DivideZeroException extends ArithmeticException{ //自定义异常类
  4. public DivideZeroException() { //实现默认构造方法
  5. }
  6. public DivideZeroException(String msg) { //实现有输出信息的构造方法
  7. super(msg);
  8. }
  9. }

自定义异常类

  1. package CynicalGary;
  2.  
  3. import java.util.Arrays;
  4.  
  5. public class Gary_Text {
  6. public static void main(String[] args) {
  7. int[] array = new int[5];
  8. Arrays.fill(array, 5);
  9. for(int i=4;i>-1;i--)
  10. {
  11. if(i==0) {
  12. throw new DivideZeroException("除零异常");
  13. }
  14. System.out.println("array["+i+"]/"+i+"="+array[i]/i);
  15. }
  16. }
  17. }
  18.  
  19. /*
  20. 输出
  21. array[4]/4=1
  22. array[3]/3=1
  23. array[2]/2=2
  24. array[1]/1=5
  25. Exception in thread "main" CynicalGary.DivideZeroException: 除零异常
  26. at CynicalGary.Gary_Text.main(Gary_Text.java:12)
  27. */

测试自定义异常类

11、抛出java.lang.ClassNotFoundException:异常

  1. package CynicalGary;
  2.  
  3. public class Gary_Text {
  4. public static void main(String[] args) {
  5. try {
  6. System.out.println("进入try语句块");
  7. Class<?>clazz = Class.forName("");
  8. System.out.println("离开try语句块");
  9. }catch(ClassNotFoundException e) {
  10. System.out.println("进入catch语句块");
  11. e.printStackTrace();
  12. System.out.println("离开catch语句块");
  13. }finally {
  14. System.out.println("进入finally语句块");
  15. }
  16. }
  17. }
  18.  
  19. /*
  20. 输出
  21. 进入try语句块
  22. 进入catch语句块
  23. java.lang.ClassNotFoundException:
  24. at java.lang.Class.forName0(Native Method)
  25. at java.lang.Class.forName(Unknown Source)
  26. at CynicalGary.Gary_Text.main(Gary_Text.java:7)
  27. 离开catch语句块
  28. 进入finally语句块
  29. */

捕获单个异常

捕获单个异常,Java中捕获异常是通过try...catch...dinally语句来完成的,其中try语句块是必须的,catch和finally语句块可以选择一个或两个。try语句块用来放置可能出现问题的语句,catch语句块用来放置异常后执行的代码,finally语句块用来放置无论是否发送异常都需要执行的代码

12、抛出java.lang.ClassNotFoundException异常

  1. package CynicalGary;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.SQLException;
  6.  
  7. public class Gary_Text {
  8. private static String URL = "jdbc:mysql://localhost:3306/db_database";//数据库URL
  9. private static String DRIVER = "com.mysql.jdbc.Driver"; //数据库驱动
  10. private static String USERNAME ="Gary"; //用户
  11. private static String PASSWORD = "123456"; //密码
  12. private static Connection conn;
  13. public static Connection getConnextion() {
  14. try {
  15. Class.forName(DRIVER);
  16. conn = DriverManager.getConnection(URL, USERNAME, PASSWORD); //建立连接
  17. return conn;
  18. }catch(ClassNotFoundException e) {
  19. e.printStackTrace();
  20. }catch(SQLException e) {
  21. e.printStackTrace();
  22. }
  23. return null;
  24. }
  25.  
  26. public static void main(String[] args) {
  27. Gary_Text.getConnextion();
  28. }
  29. }
  30.  
  31. /*
  32. 输出
  33. java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
  34. at java.net.URLClassLoader.findClass(Unknown Source)
  35. at java.lang.ClassLoader.loadClass(Unknown Source)
  36. at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
  37. at java.lang.ClassLoader.loadClass(Unknown Source)
  38. at java.lang.Class.forName0(Native Method)
  39. at java.lang.Class.forName(Unknown Source)
  40. at CynicalGary.Gary_Text.getConnextion(Gary_Text.java:15)
  41. at CynicalGary.Gary_Text.main(Gary_Text.java:27)
  42. */

捕获多个异常

异常方法

  1. public String getMessage()
  2. 返回关于发生的异常的详细信息。这个消息在Throwable 类的构造函数中初始化了。
  3. public Throwable getCause()
  4. 返回一个Throwable 对象代表异常原因。
  5. public String toString()
  6. 使用getMessage()的结果返回类的串级名字。
  7. public void printStackTrace()
  8. 打印toString()结果和栈层次到System.err,即错误输出流。
  9. public StackTraceElement [] getStackTrace()
  10. 返回一个包含堆栈层次的数组。下标为0的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底。
  11. public Throwable fillInStackTrace()
  12. 用当前的调用栈层次填充Throwable 对象栈层次,添加到栈层次任何先前信息中。

Throwable 类的主要异常方法

二、捕获异常

单重捕获异常

使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。

try/catch代码块中的代码称为保护代码,使用 try/catch 的语法如下:

  1. try
  2. {
  3. // 程序代码
  4. }catch(ExceptionName e1)
  5. {
  6. //Catch 块
  7. }
  1.  

Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。

如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。

多重捕获块

一个 try 代码块后面跟随多个 catch 代码块的情况就叫多重捕获。

多重捕获块的语法如下所示:

  1. try{
  2. // 程序代码
  3. }catch(异常类型1 异常的变量名1){
  4. // 程序代码
  5. }catch(异常类型2 异常的变量名2){
  6. // 程序代码
  7. }catch(异常类型2 异常的变量名2){
  8. // 程序代码
  9. }
 

上面的代码段包含了 3 个 catch块。

可以在 try 语句后面添加任意数量的 catch 块。

如果保护代码中发生异常,异常被抛给第一个 catch 块。

如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。

如果不匹配,它会被传递给第二个 catch 块。

如此,直到异常被捕获或者通过所有的 catch 块。

三、throws/throw 关键字:

java中的异常抛出通常使用throw和throws关键字来实现。

throw ----将产生的异常抛出,是抛出异常的一个动作

一般会用于程序出现某种逻辑时程序员主动抛出某种特定类型的异常。如:
  语法:throw (异常对象),如:

  1. public static void main(String[] args) {
  2. String s = "abc";
  3. if(s.equals("abc")) {
  4. throw new NumberFormatException();
  5. } else {
  6. System.out.println(s);
  7. }
  8. //function();
  9. }

运行结果:

  1. Exception in thread "main" java.lang.NumberFormatException
  2. at test.ExceptionTest.main(ExceptionTest.java:67)

throws----声明将要抛出何种类型的异常(声明)。

语法格式:

  1. public void 方法名(参数列表)
  2. throws 异常列表{
  3. //调用会抛出异常的方法或者:
  4. throw new Exception();
  5. }

throw与throws的比较
1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

四、finally关键字

finally 关键字用来创建在 try 代码块后面执行的代码块。

无论是否发生异常,finally 代码块中的代码总会被执行。

在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。

  1. try{
  2. // 程序代码
  3. }catch(异常类型1 异常的变量名1){
  4. // 程序代码
  5. }catch(异常类型2 异常的变量名2){
  6. // 程序代码
  7. }finally{
  8. // 程序代码
  9. }

五、自定义异常

在 Java 中你可以自定义异常。编写自己的异常类时需要记住下面的几点。

  • 所有异常都必须是 Throwable 的子类。
  • 如果希望写一个检查性异常类,则需要继承 Exception 类。
  • 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。

感谢:

菜鸟教程:传送门

Java常见异常和解决办法:传送门

Java基础__Java中异常处理那些事的更多相关文章

  1. Java基础__Java中自定义集合类

    Java基础__Java中集合类 传送门 自定义MyArrayList集合实现:增加数据.取数据.查看集合中数据个数方法 package com.Gary; public class MyArrayL ...

  2. Java基础__Java中常用数学类Math那些事

     测试 package Cynical_Gary; public class Cynical_Text { public static void main(String[] args){ System ...

  3. Java基础__Java中集合类

    ArrayList:有序.可重复.线程不安全.内部使用数组进行存储 LinkedList:有序.可重复.线程不安全.内部使用引用进行存储[可以很方便的进行插入.删除数据] Vector:有序.可重复. ...

  4. Java基础学习中一些词语和语句的使用

    在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...

  5. Java基础(中)

    面向对象基础 面向对象和面向过程的区别 两者的主要区别在于解决问题的方式不同: 面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题. 面向对象会先抽象出对象,然后用对象执行方法的方式 ...

  6. 黑马程序员----java基础笔记中(毕向东)

    <p>------<a href="http://www.itheima.com" target="blank">Java培训.Andr ...

  7. java基础系列--Exception异常处理

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7191280.html 1.概述 Java代码中的异常处理是非常重要的一环,从代码中可以看到 ...

  8. 有关JAVA基础学习中的集合讨论

        很高兴能在这里认识大家,我也是刚刚接触后端开发的学习者,相信很多朋友在学习中都会遇到很多头疼的问题,希望我们都能够把问题分享出来,把自己的学习思路整理出来,我们一起探讨一起成长.    今天我 ...

  9. java基础学习总结——异常处理

    一.异常的概念 异常指的是运行期出现的错误,也就是当程序开始执行以后执行期出现的错误.出现错误时观察错误的名字和行号最为重要.

随机推荐

  1. C++ Primer 回炉重铸(一)

    过去学C++语法都是用的这本C++Primer第五版 说实话,这本书应该是业界用的最多的一本类似于C++语法的百科全书了.. 但是感觉自己学了这么长时间的C++,语法层次还是不够牢固. 比如templ ...

  2. C++ 二阶构造模式

    1.如何判断构造函数的执行结果? 构造函数没有返回值,所以不能通过返回值来判断是构造函数是否构造成功. 如果给构造函数强行加入一个返回值,用来表示是否构造成功.这样确实能够反映出构造的结果,但是不够优 ...

  3. windows下使用zookeeper

    windows下dos窗口操作:https://blog.csdn.net/a632189007/article/details/78085858

  4. GitLab: Deploy keys are not allowed to push code.

    被这个问题坑了,大半天.写此博文,愿入坑的童鞋能及时托坑 一.当你第一次pull或者push gitlab远程项目的时候提示你一个该建立一个sshkey,此时你在客户端生成sshkey 二.切记要把这 ...

  5. 11 Python之初识函数

    ---恢复内容开始--- 1. 什么是函数? f(x) = x + 1 y = x + 1 函数是对功能或者动作的封装 2. 函数的语法和定义 def 函数名(): 函数体 调用: 函数名() 3. ...

  6. 07 Python爬虫验证码处理

    大部分门户网站在进行登录的时候,如果用户连续登录的次数超过3次或者5次的时候,就会在登录页中动态生成验证码.通过验证码达到分流和反爬的效果. 一. 云打码平台处理验证码的流程: 1.对携带验证码的页面 ...

  7. Spring Boot整合dubbo(注解的方式)

    一.创建项目 1.创建一个空的项目 2.在空的项目中添加两个Spring Boot模块,如下图所示 二.在provider模块中的pom文件中添加依赖 <dependency> <g ...

  8. HTTPS中SSL/TLS握手时的私钥用途(RSA、ECDHE)

    从上一篇HTTPS中CA证书的签发及使用过程中知道服务端在申请CA证书时只上交了密钥对中的公钥,那么只有服务端知道的私钥有什么作用呢? SSL/TLS层的位置 SSL/TLS层在网络模型的位置,它属于 ...

  9. Delphi 变量的作用域

  10. ansible简要说明

    说明 Ansible是一个python编写模型驱动的配置管理器,支持多节点发布.远程任务执行.默认使用 SSH 进行远程连接.无需在被管理节点上安装附加软件,可使用各种编程语言进行扩展.本文基于ans ...