异常!!!看看生活中的异常例子:

正常情况下,从家到公司上班,只需要20分钟!但如果在路上碰到堵车或修路或车突然自燃等问题,那就没办法正常去上班了。其中堵车或修路或车突然自燃等问题就属于异常。

碰到异常,就需要处理,不然就只能中断上班了。


在Java程序中的异常表示什么意思呢?

Java中的错误分为两类:错误(Error)和异常(Exception)

错误一般都是在编译前IDE就能发现并提示,例如非要给整型变量赋一个超大的数值:

这就是一个典型的Error。

程序在运行时出现的问题,就叫异常!!!如果在编程时不考虑到对这些异常的处理,当出现异常时,程序就会停止。例如下面示例中的除0错误:

1
2
3
4
5
6
7
public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.print("请输入整数:");
    int i = input.nextInt();
    int sum = 10/i;
    System.out.println(sum);
}

这段代码在编译时是没有任何问题的,但在运行时输入0就会提示有异常:

出现错误很好解决,在编码环节改正确就OK了,但有的时候是否出现异常就不是开发者能控制的(如上例),所以开发者只能预判哪些地方有可能出现异常,提前做好处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.print("请输入整数(不能输入0):");
    int i = input.nextInt();
    int sum = 0;
    try {
        sum = 10/i;
    catch (Exception e) {
        // TODO: handle exception
        System.out.println("不能输入0,不能输入0,不能输入0!!!听不懂国语么!!!");
    }
     
    System.out.println(sum);
}

结果:

可以发现结果中不再出现异常的信息,而且换成了我们自己的提示信息。

就跟下面两个图的区别一下,如果异常直接出现在用户面前,用户很有可能就再也不用你的程序了,而如果给个提示,则用户有可能会继续使用。

    


异常的概念就介绍完毕啦!!!,接下来看看Java中是如何处理异常的。

Java中的常见异常如下图:

当然,这只列出了一部分,还有很多的异常已比较常见,当大家碰到时最好查一下JDK。

Java中异常的三种处理方式:

  1. try-catch-finally

  2. throw和throws

一、try-catch-finally

try部分是必须的,用来捕获异常,一般把有可能出现异常的代码放入其中。

catch部分可以有零到多个,是用来判断异常类别并进行处理,一般把异常处理代码放入其中。

finally部分可选,无论是否有异常都必须执行的代码放入其中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int firstNum = 12
int secondNum = 0;
try {
    int result = firstNum/secondNum;
    System.out.println("两个数字相除的结果是:"+result)       
}catch(ArithmeticException e) {
    System.out.println("算术异常:");
}catch(NumberFormatException e) {
    System.out.println("数字转换异常");
}catch(ArrayIndexOutOfBoundsException e){
    System.out.println("数组下标越界异常");
}catch(Exception e) {
    System.out.println("其他异常");
}
finally{
    System.out.println("我是必须要执行滴,快叫爸爸!");
}

二、thorw和throws

这个关键字的作用是抛出异常,它不处理。

我叫小明给我带份红烧肉,小明去食堂发现没有红烧肉(这就相当于异常出现了),他不知道如何处理,就回到寝室告诉我没有红烧肉,然后我再来处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class XiaoMing {
    //买食物的方法
    public void buyFood(String food) throws Exception{
        //用一个集合表示食堂的所有菜
        List<String> foods = new ArrayList<String>();
        foods.add("青椒鸡蛋");
        foods.add("青椒肉丝");
        foods.add("红烧排骨");
        foods.add("土豆欢声");
        //表示是否有该食物的状态
        int state = 0;   //默认没有 0.没有该食物 1.有该食物
        for (String string : foods) {
            if(food.equals(string)){
                state = 1;
                break;
            }
        }
         
        if(state==0){
              throw new Exception("你要吃的菜没有了!");
        }
    }
}

编写测试代码:

不瞎的朋友应该发现有什么问题了吧?

是的,因为buyFood()方法后面我们加了throws Exception,所以在调用时IDE就认为这儿极有可能会有异常,我们就必须处理它,还是两种方式,要么使用try-catch,要么在main方法后继续抛异常(throws Exception)。

在Java中,除了使用JDK中定义好的异常外,我们还可以自定义异常,这个很简单,定义一个类,继承Exception类,重写一个参数的构造方法就OK了。


好吧,异常到这儿就够用了,需要深入了解的朋友,请自行百度吧,哈哈!

“软件思维”博客地址:51CTO博客园,感兴趣的小伙伴可以去看相关的其它博文。

《Java从入门到放弃》JavaSE入门篇:异常的更多相关文章

  1. dotnet 从入门到放弃的 500 篇文章合集

    本文是记录我从入门到放弃写的博客 博客包括 C#.WPF.UWP.dotnet core .git 和 VisualStudio 和一些算法,所有博客使用 docx 保存 下载:dotnet 从入门到 ...

  2. [Python 从入门到放弃] 6. 文件与异常(二)

    本章所用test.txt文件可以在( [Python 从入门到放弃] 6. 文件与异常(一))找到并自行创建 现在有个需求,对test.txt中的文本内容进行修改: (1)将期间的‘:’改为‘ sai ...

  3. 《Java从入门到放弃》入门篇:springMVC数据校验

    昨天我们扯完了数据传递,今天我们来聊聊数据校验的问题.来,跟着我一起读:计一噢叫,一按艳. 在springMVC中校验数据也非常简单,spring3.0拥有自己独立的数据校验框架,同时支持JSR303 ...

  4. 《Java从入门到放弃》入门篇:hibernate中的多表对应关系

    hibernate中的对应关系其实就是数据库中表的对应关系, 就跟某些电影中的某些场景是一样一样滴. 比如可以是一男一女,还可以是一男多女, 更可以是多男一女,最后最后最后还可以是多男多女!!! 有些 ...

  5. 《Java从入门到放弃》入门篇:hibernate查询——HQL

    不知不觉又到了hibernate的最后一篇了,只感觉时光飞逝~,岁月如梭~! 转眼之间,我们就···························,好吧,想装个X,结果装不下去了,还是直接开始吧· ...

  6. 《Java从入门到放弃》入门篇:springMVC数据传递

    springMVC中的数据传递方式与JSP和Struts2相比,更加的简单.具体有什么样的区别呢?我们通过下面这张图来对比就知道了. 随手画的,有些错别字,不用太在意..... 接下来,进入正题,sp ...

  7. Java性能测试从入门到放弃-详解篇

    Jmeter组件分类说明 Jmeter的组件可以放在任意位置 线程池:用于创建线程.每个线程会"批次顺序"执行任务,因此后面的任务可根据前面的任务决定具体的操作.          ...

  8. 函数响应式编程(FRP)从入门到”放弃”——基础概念篇

    前言 研究ReactiveCocoa一段时间了,是时候总结一下学到的一些知识了. 一.函数响应式编程 说道函数响应式编程,就不得不提到函数式编程,它们俩到底有什么关系呢?今天我们就详细的解析一下他们的 ...

  9. python从入门到放弃之线程篇

    一,什么是多线程? 1.多线程的概念? 说起多线程,那么就不得不说什么是线程,而说起线程,又不得不说什么是进程. 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分 ...

  10. [Python 从入门到放弃] 5. 文件与异常(一)

    1.文件操作: 文件操作包含读/写 从文件中读取数据 向文件写入数据 Python中内置了open()方法用于文件操作 (更多关于open()BIF介绍 阅读此篇) 基本模板: 1.获取文件对象 2. ...

随机推荐

  1. python爬取百度搜索结果ur汇总

    写了两篇之后,我觉得关于爬虫,重点还是分析过程 分析些什么呢: 1)首先明确自己要爬取的目标 比如这次我们需要爬取的是使用百度搜索之后所有出来的url结果 2)分析手动进行的获取目标的过程,以便以程序 ...

  2. Javascript DOM 编程艺术———总结-1

    第一章: 1.DOM:是一套对文档内容进行抽象和概念化的方法,是一种API. 2.W3C对DOM的定义:一个与系统平台和编程语言无关的借口程序和脚本可以通过这个接口动态的访问和修改文档内容,结构和样式 ...

  3. Tornado 判断用户登录状态和操作权限(装饰器)

    判断是否登录: def authenticated(method): '''''' @functools.wraps(method) def wrapper(self, *args, **kwargs ...

  4. NYOJ--541--最强DE 战斗力(递推)

    最强DE 战斗力 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 春秋战国时期,赵国地大物博,资源非常丰富,人民安居乐业.但许多国家对它虎视眈眈,准备联合起来对赵国发 ...

  5. Javascript随笔2(JQuery)

    1.jQuery 语法 Tips: 通过 CDN(内容分发网络)引用JQuery:(link的引用最好放在script的引用之前) <script src="http://apps.b ...

  6. linux 压缩解压打包工具大集合

    压缩.解压缩及归档工具有很多,今天小编就整理几个大家较为常用的. compress gzip  bzip2 xz zip tar cpio 一.压缩.解压工具 用法 压缩 工具 压缩后 压缩包格式 解 ...

  7. Web前端学习开篇

    首先想想自己喜欢干什么?想干什么?脑袋需要什么?什么对自己来说最重要?自己的规划? 本人数字媒体技术专业,想学Web前端开发有好长时间了,有一定的基础,所以就想进一步深入学习.谁料想,我怎么那么没有耐 ...

  8. ReactiveSwift源码解析(十二) MutableProperty基本代码实现

    前两篇博客我们分别聊了ReactiveSwift框架中的负责标记对象的生命周期的类Lifetime以及负责原子性操作的Atomic类的具体代码实现.前两篇博客之所以聊Lifetime以及Atomic的 ...

  9. 火币网现货API[Python3版]

    火币 期货 现货 API [Python3版] 一.Util.py,基础类,包括参数配置.签名,HTTP 请求方法,发送信息到API #coding=utf-8 import hashlib impo ...

  10. 四种JavaScript隐式类型转换的总结

    一般存在四种情况,JavaScript会对变量的数据类型进行转换. 目录 * if中的条件会被自动转为Boolean类型 * 会被转为false的数据 * 会被转为true的数据 * 参与+运算都会被 ...