Java学习之异常

一生懸命吧 2021-01-20 22:45:17
java


一、什么异常。

二、如何处理异常

-try-catch-finally

-throw

-throws

-自定义异常

-异常链

三、异常本质上是程序上的错误,错误在我们编写程序的过程中会经常发生,包括编译期间和运行期间的错误。

括号没有正常配对;语句结束后少写了分号;关键字编写错误;

①使用空对象的引用调用方法。空指针异常。

 

②数组越界

 

③除数为0

这些都是运行期间错误产生的表现。

 

四、在程序运行过程中,意外发生的情况,背离我们程序本身意图的表现,都可以理解为异常。通过合理的异常处理,可以更好地提高程序的健壮性。

五、Throwable是java的当中异常的根类,他有两个重要的子类:Error和Exception

Error是程序无法处理的错误,表示运行应用程序中较严重的问题。java虚拟机出现的一些列问题。

虚拟机错误、内存溢出错误、线程死锁错误。它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,及时确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。

Exception是程序本身可以处理的异常。异常处理通常指针对这种类型异常的处理。

 

六、在java应用程序当中,异常处理机制为:

抛出异常、捕捉异常。

当一个方法当中出现错误引发异常的时候,方法会去创建异常对象并交付给运行时系统进行处理。那这个异常对象就会包含异常类型或者 异常出现时的程序状态。

对于运行时异常、错误或可查异常,Java技术所要求的异常处理方式有所不同。

 抛出异常和捕捉异常是通过5个关键字来实现的,他们分别是:try、catch、finally、throw、throws

 

 

 

try块后可接零个或多个catch块,如果没有catch块,则必须跟一个 finally块。

要不try catch 要不try finally 必须组合使用。

例子:当main方法执行过程的当中产生的报错,

import java.util.Scanner;
public class ErrorTest {
public static void main(String[] args) {
// // 定义两个变量 输出商
// int one = 12;
// int two = 2;
// System.out.println(one/two); //6
// 当这两个变量换成键盘输入
Scanner inputScanner = new Scanner(System.in);
System.out.println("===运算开始===");
System.out.println("请输入第一个整数:");
int one = inputScanner.nextInt();
System.out.println("请输入第二个整数:");
int two = inputScanner.nextInt();
System.out.println(one/two);
System.out.println("===运算结束===");
}
}

当被除数输入0时,程序会报如下的异常

当除数输入一个字母,则报以下错误。(输入格式错误的异常)

 

虽然很简单地一个相处的因素,经过人的输入之后就有很多情况,所以需要合理进行异常处理才行。

将把可能出错的程序用try包裹起来时,

import java.util.Scanner;
public class ErrorTest {
public static void main(String[] args) {
// // 定义两个变量 输出商
// int one = 12;
// int two = 2;
// System.out.println(one/two); //6
// 当这两个变量换成键盘输入
Scanner inputScanner = new Scanner(System.in);
System.out.println("===运算开始===");
try {
System.out.println("请输入第一个整数:");
int one = inputScanner.nextInt();
System.out.println("请输入第二个整数:");
int two = inputScanner.nextInt();
System.out.println(one/two);
} catch (Exception e) {
System.out.println(e);
}
System.out.println("===运算结束===");
}
}

则会打印出

 

在catch中可以通过e.printStackTrace()捕获追踪异常

 

finally包裹是无论怎么样都一定会执行的代码。

import java.util.Scanner;
public class ErrorTest {
public static void main(String[] args) {
// // 定义两个变量 输出商
// int one = 12;
// int two = 2;
// System.out.println(one/two); //6
// 当这两个变量换成键盘输入
Scanner inputScanner = new Scanner(System.in);
System.out.println("===运算开始===");
try {
System.out.println("请输入第一个整数:");
int one = inputScanner.nextInt();
System.out.println("请输入第二个整数:");
int two = inputScanner.nextInt();
System.out.println(one/two);
} catch (Exception e) {
System.out.println(e);
e.printStackTrace();
}finally {
System.out.println("===运算结束===");
}
}
}

多重catch:将代码改造成多个catch块,根据不同类型的报错做处理。

import java.util.InputMismatchException;
import java.util.Scanner;
public class ErrorTest {
public static void main(String[] args) {
// // 定义两个变量 输出商
// int one = 12;
// int two = 2;
// System.out.println(one/two); //6
// 当这两个变量换成键盘输入
Scanner inputScanner = new Scanner(System.in);
System.out.println("===运算开始===");
try {
System.out.println("请输入第一个整数:");
int one = inputScanner.nextInt();
System.out.println("请输入第二个整数:");
int two = inputScanner.nextInt();
System.out.println(one/two);
} catch (ArithmeticException e) {
System.out.println("除数不允许为0");
e.printStackTrace();
} catch(InputMismatchException e) {
System.out.println("请输入数字");
e.printStackTrace();
}
finally {
System.out.println("===运算结束===");
}
}
}

 catch再多的异常一般涵盖不全,所以最后一个 catch中 需要传递Exception类。也是一种安全保障机制,一定要放在最后一个catch

import java.util.InputMismatchException;
import java.util.Scanner;
public class ErrorTest {
public static void main(String[] args) {
// // 定义两个变量 输出商
// int one = 12;
// int two = 2;
// System.out.println(one/two); //6
// 当这两个变量换成键盘输入
Scanner inputScanner = new Scanner(System.in);
System.out.println("===运算开始===");
try {
System.out.println("请输入第一个整数:");
int one = inputScanner.nextInt();
System.out.println("请输入第二个整数:");
int two = inputScanner.nextInt();
System.out.println(one/two);
} catch (ArithmeticException e) {
System.out.println("除数不允许为0");
e.printStackTrace();
} catch(InputMismatchException e) {
System.out.println("请输入数字");
e.printStackTrace();
} catch(Exception e) {
System.out.println(e);
e.printStackTrace();
}
finally {
System.out.println("===运算结束===");
}
}
}

七、System.exit(1)//终止程序运行 括号里面是非0就可以

 

在finally块不要写return xxx。因为当catch和finally中都有return的时候,不管进了哪个catch,都return的是finally里面的值。

版权声明
本文为[一生懸命吧]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4446873/blog/4916963

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云