java异常处理_weixin_34228387的博客-程序员秘密

技术标签: java  

可直接看这篇文章即可:http://www.importnew.com/26613.html

java异常类图

非检查异常(unckecked exception):Error 和 RuntimeException 以及他们的子类。javac在编译时,不会提示和发现这样的异常,不要求在程序处理这些异常。所以如果愿意,我们可以编写代码处理(使用try…catch…finally)这样的异常,也可以不处理。对于这些异常,我们应该修正代码,而不是去通过异常处理器处理 。这样的异常发生的原因多半是代码写的有问题。如除0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,使用了空对象NullPointerException等等。

检查异常(checked exception):除了Error 和 RuntimeException的其它异常。javac强制要求程序员为这样的异常做预备处理工作(使用try…catch…finally或者throws)。在方法中要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。这样的异常一般是由程序的运行环境导致的。因为程序可能被运行在各种未知的环境下,而程序员无法干预用户如何使用他编写的程序,于是程序员就应该为这样的异常时刻准备着。如SQLException , IOException,ClassNotFoundException 等。

更直白的说法:

What:什么是检查异常(checked exception)?

就是编译器要求你必须处置的异常。不知道你编程的时候有没有遇到过,你写的某段代码,编译器要求你必须要对这段代码try...catch,或者throws exception,如果你遇见过,没错,这就是检查异常,也就是说,你代码还没运行呢,编译器就会检查你的代码,会不会出现异常,要求你对可能出现的异常必须做出相应的处理。

What:什么是非检查异常(unchecked exceptions)?

编译器不要求强制处置的异常,虽然你有可能出现错误,但是我不会在编译的时候检查,没必要,也不可能。

Why:为什么有非检查异常?
你想想非检查异常都有哪些?NullPointerException,IndexOutOfBoundsException,VirtualMachineError等,这些异常你编译的时候检查吗?再说了,明明可以运行时检查,都在编译的时候检查,你写的代码还能看吗?而且有些异常只能在运行时才能检查出来,比如空指针,堆溢出等。

Exception异常进行划分,它可分为运行时异常和非运行时异常。

What:什么是运行时异常?

都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是非检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

What:什么是非运行时异常?

是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不要自定义检查异常。

 

 

抛出异常有三种形式,一是throw,一个throws,还有一种系统自动抛异常。下面它们之间的异同。

一、系统自动抛异常

当程序语句出现一些逻辑错误、主义错误或类型转换错误时,系统会自动抛出异常:

public static void main(String[] args) { 
    int a = 5, b =0; 
    System.out.println(5/b); 
    //function(); 
}

 系统会自动抛出ArithmeticException异常

或者

public static void main(String[] args) { 
    String s = "abc"; 
    System.out.println(Double.parseDouble(s)); 
    //function(); 
}

  系统会自动抛出NumberFormatException异常。

二、throw

throw是语句抛出一个异常,一般是在代码块的内部,当程序出现某种逻辑错误时由程序员主动抛出某种特定类型的异常

public static void main(String[] args) { 
    String s = "abc"; 
    if(s.equals("abc")) { 
      throw new NumberFormatException(); 
    } else { 
      System.out.println(s); 
    } 
    //function(); 
} 

运行时,系统会抛出异常:Exception in thread "main" java.lang.NumberFormatException at......

三、throws

throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)

public void function() throws Exception{......}

  当某个方法可能会抛出某种异常时用于throws 声明可能抛出的异常,然后交给上层调用它的方法程序处理

public class testThrows {
 
    public static void function() throws NumberFormatException {
        String s = "abc";
        System.out.println(Double.parseDouble(s));
    }
 
    public static void main(String[] args) {
        try {
            function();
        } catch (NumberFormatException e) {
            System.err.println("非数据类型不能强制类型转换。");
            //e.printStackTrace(); 
        }
    }
}
 

运行结果:非数据类型不能强制类型转换。

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


五、编程习惯
  1: 在写程序时,对可能会出现异常的部分通常要用try{...}catch{...}去捕捉它并对它进行处理;
  2: 用try{...}catch{...}捕捉了异常之后一定要对在catch{...}中对其进行处理,那怕是最简单的一句输出语句,或栈输入e.printStackTrace();
  3: 如果是捕捉IO输入输出流中的异常,一定要在try{...}catch{...}后加finally{...}把输入输出流关闭;
  4: 如果在函数体内用throw抛出了某种异常,最好要在函数名中加throws抛异常声明,然后交给调用它的上层函数进行处理。

转载于:https://www.cnblogs.com/myseries/p/10146867.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34228387/article/details/94712246

智能推荐

如何优雅地使用Sublime Text3_扶摇万仞的博客-程序员秘密

原文地址:http://liuyanzhao.com/1892.html

交叉编译内核模块时 Makefile 文件的编写_longyu_wlz的博客-程序员秘密_交叉编译makefile编写

在 x86 服务器上交叉编译 arm64 的单个内核模块前几天帮助同事交叉编译了一个 arm64 的内核模块,在这里记录一下关键的步骤。交叉编译内核修改 Makefile 文件后编译修改的 Makefile 文件内容如下:KERNELDIR :=pathPWD :=$(shell pwd)obj-m += xxxx.oall: make CROSS_COMPIL...

分割一个装有多组数据List集合,并将其每组数据分别存放至不同的List集合中_w32718155的博客-程序员秘密

在工作中,我们经常会遇到一个装有多组数据List集合,此时,我们需要将其取出,然后存放至不同的List当中,对其进行分类存放,然后后续对该数据进行处理。

opencv、VINS-mono在Ubuntu 20.04上安装过程中遇到的问题总结_乘凉~的博客-程序员秘密

因为需要在Ubuntu 20.04上安装运行港科大的VINS-mono,所以必须先安装opencv 3.3.1、Eigen xxx 以及ceres xxx,现记录安装过程中遇到的问题。此贴专门用来记录安装过程中遇到的问题及解决方法,至于opencv、Eigen、ceres以及VINS-mono的安装过程请参考另一篇博客:链接:1、编译opencv遇到的问题错误1:宏未定义错误描述:In file included from /home/acl/111/opencv-3.3.1/modules/vid

TCP/IP学习笔记-UDP协议_Jingo_Cat的博客-程序员秘密

写在前面:仅供学习使用UDP的简介 UDP(User Datagram Protocol,用户数据报协议),提供面向无连接的不可靠传输服务。属于OSI参考模型中的传输层协议。UDP的正式规范是IETF RFC768。UDP在IP报文的协议号是17。 UDP协议不提供拥塞控制、流量控制、差错纠正机制。 UDP的特征 不可靠、无连接、不分片、速度快、实时性 不可靠 通俗点讲就是不靠谱,数据包在传输过程中丢失的话是不会重传的。 无连接 通俗点讲就是一个无协

安装微型计算机(pc机),微型计算机安装调试与维修_摸鱼肥宅的博客-程序员秘密

微型计算机安装调试与维修出版时间:2010年09月定  价:34.00I S B N :9787533746377所属分类: 考试&nbsp考试>计算机考试&nbsp标  签:其他考试计算机考试《微型计算机安装调试与维修》根据本职业的工作特点,以掌握实用操作技能和能力培养为根本出发点,围绕相应的鉴定标准和考试大纲编写而成。全书分为两篇:上篇为基础知识,共9...

随便推点

解决vue项目elemenui样式修改失效_qq_42259086的博客-程序员秘密

1、显示如果没有引用scss 修改elemenUI样式要写在vue.app中才可以生效2、打包后(1)样式未生效和main.js中的引用顺序有关注意:要在app前引用elementUI样式(2)尽量使用elementui官网给出的参数修改...

html引入字体包的方法_wxxmagical的博客-程序员秘密_html引用字体包

@font-face {//这里定义你引入字体包的名称 font-family: 'mFontRegular'; src:url('字体包资源路径');}html { width: 100%; height: 100%; position: relative; background-color: #000; //background-size: 100% auto; //background-position: top; fon

DispatcherServlet.java 的doDispatch方法详解_forrestGTJU的博客-程序员秘密

为什么研究doDispatch方法? 来看下图,Springmvc 的很多组件都是围绕着DispatchServlet工作的。而其doDispatch方法用代码的方式呈现了如下图的完整的流程前端控制器DispatcherServlet(不需要工程师开发),由框架提供作用:接收请求,响应结果,相当于转发器,中央处理器。有了dispatcherServlet减少了其它组件之间的耦合度。...

DevExpress GridControl使用方法总结_zhishiheng的博客-程序员秘密_devexpress grid

一、如何解决单击记录整行选中的问题View->OptionsBehavior->EditorShowMode 设置为:Click二、如何新增一条记录(1)、gridView.AddNewRow()(2)、实现gridView_InitNewRow事件三、如何解决GridControl记录能获取而没有显示出来的问题gridView.populateColumns();四、如何让行只能选择而不能编辑(或

idea导入maven项目出现多处:java程序包XXX不存在,java找不到符号,项目代码出现多处飙红。_Lee_ipex的博客-程序员秘密_maven项目导入idea

idea导入maven项目出现多处java程序包XXX不存在,java找不到符号的问题,项目本身代码出现多处飙红,主要原因:idea版本问题。

指针和引用的区别_btooth的博客-程序员秘密

一、C++中引用和指针的区别指针初始化的时候,可以指向一个地址,也可以为空。引用必须初始化为另一个变量. int ival = 1024; int *pi  = &ival; // a pointer int &rval = ival; // a reference二、估计很多人在编写C++程序都或多或少的会用到pointer 和 reference这两种东西,但是他们两者到底有什么样