异常就是程序运行过程中阻止当前方法或作用域继续执行的问题;

  任何程序都不能保证完全正常运行,当发生异常时,需要我们去处理异常,特别是一些比较重要的场景,异常处理的逻辑也会比较复杂,比如:给用户提示、保存当前用户操作或改动、未完成的业务回滚、释放程序占用的资源等。

  在Java中,Throwable异常类是所有异常类的祖先,任何异常类都继承于Throwable类;

  Throwable类主要有两个子类:Error类、Exception类

  Error异常类是系统异常,比如:虚拟机错误(VirtualMachineError)、线程死锁(ThreadDeath)等,Error类异常一旦发生,程序将会崩溃

  Exception是开发中我们最常见的一般异常,这种异常原因可能是程序代码编写错误,环境问题,用户输入错误等异常

  Exception异常一般分为:运行时异常(RuntimeException)也称为非检查异常、检查异常;

  非检查异常常见的有:输出空指针时的异常,数组下标越界异常,类型转换异常,算术异常(比如0作为分母)等,运行时异常会由Java虚拟机自动捕获,自动抛出,一般是我们写的代码本身有问题,需要改进我们的代码来解决

  检查异常的原因有可能是:文件异常(不存在或者权限)、数据库连接异常、网络连接异常等,这种异常系统不会自动捕获,需要我们手动添加捕获处理的语句

  

  我们通常使用try-catch以及try-catch-finally代码块来处理异常

  try代码块中是可能发生异常的语句,当程序确实发生异常了,try块中程序会中止执行,并且抛出异常给catch块进行处理,catch根据需要去处理异常、记录错误日志等,看一个简单示例:

  1. import java.util.Scanner;
  2.  
  3. public class Ceshi {
  4. public static void main(String[] args){
  5. try{
  6. System.out.println("请输入一个整数:");
  7. Scanner input = new Scanner(System.in);
  8. int a = input.nextInt();
  9. System.out.println("您输入的是:" + a);
  10. }catch(Exception e){
  11. System.out.println("输入异常");
  12. e.printStackTrace(); //打印异常信息
  13. }
  14. System.out.println("程序执行结束");
  15. }
  16. }

这是一个最简单的异常处理,通过Scanner获取用户输入,当用户正确输入时程序正常执行,当然catch块不会被执行,但是用户如果输入的不是整数,那么就会抛出异常给catch块,可以利用printStackTrace()方法打印具体的异常,注意无论程序是否异常try-catch外的语句都会被正常执行,错误结果如下:

根据结果可以看到我们输入字符串"3s"之后,抛出了异常并且提示输入异常,最后但是try-catch后面的语句正常执行,抛出的e.printStackTrace()会在最后被打印出来,可以看出来是Ceshi.java第就行发生了异常产生了终止,那么就是在a接收输入这一行语句中发生的异常,那么在这一行之后的所有try块中的语句便终止执行

另外如果try中的代码会抛出好几个类型的异常,那么我们需要多个catch块来处理,并且加上finally进行善后处理工作

  1. import java.util.Scanner;
  2. import java.util.InputMismatchException;
  3. import java.lang.ArithmeticException;
  4. public class Ceshi {
  5. public static void main(String[] args){
  6. Scanner input = new Scanner(System.in);
  7. try{
  8. System.out.println("请输入分子:");
  9. int a = input.nextInt();
  10. System.out.println("您输入分母:");
  11. int b = input.nextInt();
  12. System.out.println("计算结果是:" + a*1.0/b);
  13. }catch(InputMismatchException e){
  14. System.out.println("请输入整数");
  15. e.printStackTrace(); //打印异常信息
  16. }catch(ArithmeticException e){
  17. System.out.println("分母不能为0");
  18. e.printStackTrace(); //打印异常信息
  19. }catch(Exception e){
  20. System.out.println("其他未知异常");
  21. e.printStackTrace();
  22. }finally{
  23. input.close();
  24. }
  25. System.out.println("程序执行结束");
  26. }
  27. }

以上的处理就比较合理了,首先保证输入是整数,如果都是整数那么分母为0也会抛出异常,最后如果还有我们考虑不到的异常,那么就通过Exception父类抛出异常,catch异常块从上到下一般是是由小到大或者由子类到父类的异常类抛出,就是从作用范围来说从细节到整体,Exception异常类抛出必须放在最后面,这样能抛出我们开发中遇到的所有异常,另外finally块建议带上,当遇到异常时,他可以释放前面还未操作的系统资源,比如例子中的关闭输入,这样能提高程序的健壮性,如果try和catch中有返回值,那么finally中的语句会在try和catch语句块中的return返回值返回到调用者之前,获得该返回值,我们可以在程序中输出他们,但是放在try-catch-finally外返回值时在finally是无法获取到的,只能获取前面的变量值

  Java中方法异常抛出,因为很多代码我们会写到方法中,为了便于管理,我们可以在专门的方法中处理异常,所以我们可以将方法中的异常向上抛出,可以写一个方法来简单抛出异常,代码如下:

  1. public void divide(int a,int b) throws Exception {
  2. if(b == 0){
  3. throw new Exception("除数不能为零!");
  4. }else{
  5. System.out.println("结果为:" + a*1.0/b);
  6. }
  7. }

当该方法被调用时,那么如果发生异常,异常将抛出到调用的语句块中,我们可以在调用的时候进行处理,比如:

  1. public void complte() {
  2. try{
  3. divide(5,0); //此时发生异常,调用方法将异常抛出到这里
  4. }catch(Exception e){
  5. System.out.println(e.getMessage()); //此处捕获异常,将方法中定义的异常信息抛出
  6. }
  7. }

这样就把方法中的异常抛出并进行了处理,另外我们还可以不在complte方法中抛出,还可以向上抛出,由上面调用该方法时抛出异常,代码如下:

  1. public void complte() throws Exception {
  2. /**
  3. * 省略方法中的代码
  4. */
  5. divide(5,0); //将里面的异常抛出到调用complte方法的位置
  6. }

这样的话异常继续向上抛出,最终还是按照第二段代码的方式来处理异常,所以用throws关键字声明此方法向上抛出异常,用throw关键字来抛出异常

  自定义异常

  除了利用系统的异常我们还可以自定义异常,以便适应我们情景的需要,简单定义个异常类:

  1. public class CeshiException extends Exception {
  2.  
  3. public CeshiException(){
  4.  
  5. }
  6.  
  7. public CeshiException(String message){
  8. super(message);
  9. }
  10. }

注意,自定义异常类必须继承于Exception异常类,里面定义了一个有参数的构造方法来自定义异常信息,无参的构造方法是为了实例化类时,默认不会发生错误,那么我们可以在方法中具体来使用这个自定义异常类了:

  1. public class ChainTest {
  2.  
  3. /**
  4. * test1():抛出自定义异常
  5. * test2():调用test1(),捕获自定义异常,并且包装成运行时异常,抛出新异常
  6. * main方法中,调用test2(),尝试捕获test2()方法抛出的异常
  7. */
  8. public static void main(String[] args) {
  9. ChainTest ct = new ChainTest();
  10. try{
  11. ct.test2();
  12. }catch(Exception e){
  13. e.printStackTrace();
  14. }
  15. }
  16.  
  17. public void test1() throws CeshiException{
  18. throw new CeshiException("原始自定义异常抛出");
  19. }
  20.  
  21. public void test2(){
  22. try {
  23. test1();
  24. } catch (CeshiException e) {
  25. // TODO Auto-generated catch block
  26. RuntimeException newExc =
  27. new RuntimeException("抛出新运行时异常");
  28. newExc.initCause(e); //引用原始异常方法,异常链
  29. throw newExc;
  30. }
  31. }
  32. }

根据代码可以看出,main方法调用test2方法并捕获test2方法抛出的异常,而test2方法中运行test1并捕获test1方法中抛出的自定义异常,并且自己也抛出一个新的运行时异常抛出到main方法中,而test1方法通过声明自定义异常类实现了抛出自定义异常类中的异常方法,将异常抛出到test2中,这样就好比一连串的异常抛出和异常处理,同时结合了自定义异常,这样就形成了一个小型的异常链,就好像链式反应一样去抛出异常

  最后,总结一下,通过try-catch来处理异常,并不能避免错误的存在性,而是尽量提高程序的健壮性,减小程序错误而带来的安全风险和损失,我们不能一味的用try-catch来屏蔽错误,我们应该采用合理的逻辑算法来解决程序设计的不足,try-catch只是一个作为辅助使用,不可以过分依赖;

  在多重catch块之后,最好加个catch(Exception e){}来处理其他可能会被遗漏的未知的异常,对于不太确定的异常,可以加上try-catch来处理潜在的风险;

  对于异常一定要尽量去处理,千万不要只是简单地使用e.printStackTrace();来打印错误信息,这样就失去了异常处理的意义;

  具体如何处理异常,应该根据不同的业务需求和异常类型来确定;

  最后要善于在try-catch块后面添加finally语句块,释放系统资源的占用,比如网络连接、数据库连接、文件关闭等;

  什么时候怎么使用异常,还需要自己以后在开发中慢慢的熟悉

Java异常与异常处理简单使用的更多相关文章

  1. 第11章 Java异常与异常处理

    1.Java异常简介 1.什么是异常异常出现的时候代码会无法正常运行下去,会产生各种问题2.捕捉异常的作用提早发现异常,方便查找问题,并给出解决方法3.Java中的异常1.Java中所有不正常的类都是 ...

  2. 那些年,我们不懂的却又不得不提的 JAVA异常和异常处理!

    ---恢复内容开始--- 首先,我是个小小的菜鸟,最近突然突发奇想,想研究一下java的异常和异常的处理,稍有些理解,老鸟们莫要嘲笑... 既然要讲异常和异常的处理,我们就要先了解异常,那么,什么是异 ...

  3. java异常,异常处理,异常类 关键字:throws 和 throw 自定义的异常类

    package cn.kecheng; import java.util.Scanner; /**异常:异常是指在程序的运行过程中所发生的不正常的情况,它会中断正在运行的程序 异常处理机制:java中 ...

  4. JAVA异常与异常处理详解

    一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域的情况,称之为异常. java中异常的体系是怎么样的呢? 1.Java中的所有不正常类都 ...

  5. Java异常及异常处理

    如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法.在这种情况下会抛出一个封装了错误信息的对象.此时,这个方法会立刻退出同时不返回任何值.另外,调用这个方法的其他代码也无法继续执行, ...

  6. Java异常与异常处理

    异常体系结构 1.所有异常都继承于Throwable类,其下有两大子类: (1)Error类:错误,一般编程人员不太接触,如虚拟机错误.线程死锁.硬伤:使程序崩溃 (2)Exception类:异常,编 ...

  7. JAVA异常与异常处理详解【转】

    感谢!!!原文地址:https://www.cnblogs.com/knightsu/p/7114914.html 一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在ja ...

  8. JAVA异常及其异常处理方式

    异常处理 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用Syste ...

  9. JAVA 异常和异常处理

    目录 一.异常 1.基本概念 2.异常体系图 3.五大运行时异常 4.编译异常 二.异常处理 1.异常处理的方式 1.1try-catch异常处理 注意事项 课堂练习题 1.2throws异常处理 注 ...

随机推荐

  1. BZOJ-1013 球形空间产生器sphere 高斯消元+数论推公式

    1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3662 Solved: 1910 [Subm ...

  2. [NOIP2008] 提高组 洛谷P1155 双栈排序

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...

  3. adb devices找不着设备

    第1步,查找设备VID VID是04E8,那么打开C:\Users\liujuan\Documents\.android\adb_usb.ini 在里面添加上设备即是 0x04E8,保存并关闭 然后c ...

  4. Android学习笔记02-Mac下编译java代码

    在Mac OS上配置JDK 1.7. 一 下载 Mac版本的JDK1.7 从以下下载地址,下载Mac版本的JDk1.7 安装文件 jdk-7u79-macosx-x64.dmg. http://www ...

  5. KindEditor上传本地图片在ASP.NET MVC的配置

    http://www.cnblogs.com/upupto/archive/2010/08/24/1807202.html 本文解决KindEditor上传本地图片在ASP.NET MVC中的配置. ...

  6. static 类也可以有static构造函数

    public static class A { static A() { } } static构造函数不能是public,也不可能被主动调用,所以public没有意义

  7. boost库(条件变量)

    1相关理念 (1)类名 条件变量和互斥变量都是boost库中被封装的类. (2)条件变量 条件变量是thread库提供的一种等待线程同步的机制,可实现线程间的通信,它必须与互斥量配合使用,等待另一个线 ...

  8. latex+bibtex+jabref(zz)

    很好的的latex使用心得: bibtex现学现卖 http://derecks.blog.sohu.com/118984444.html latex+bibtex+jabref http://blo ...

  9. Struts2中使用Servlet API步骤

    Struts2中使用Servlet API步骤 Action类中声明request等对象 Map<String, Object> request; 获得ActionContext实例 Ac ...

  10. Array和ArrayList互相转换

    class Order{ public string orderId; public string orderName; public decimal orderPrice; } public cla ...