【Java 进阶篇】【第二课】异常处理

概念



异常处理的存在是为了:

    允许程序员跳过无法处理的问题,继续开发后续的工作,或根据异常做出更加聪明的处理方式。

Java中存在一类对象叫“异常对象”。

当异常情况发生时,就会暗战预先的设定,抛出(throw) 代表当前状况的对象;抛出其实就是一种特殊的返回方式,该线程会暂停,逐层退出调用,直到遇到异常处理器(Exception Handler)

异常处理器可以捕捉(catch)的异常对象,然后根据对象来决定下一步是提醒用户、处理一次还是退出程序等等..

基本结构



异常处理器由 try, catch, finally(这个可以没有) 以及随后的程序块组成 :

try
{
  ...;
}

catch()
{
  ...;
}

catch()
{
  ...;
}

finally
 {
  ...;
}

异常处理器 监视try后面的程序块,catch的括号中需要有一个参数,用来代表索要捕捉的异常的类型。catch会捕捉相应的类型和它的派生类。

try所监视的程序库可能抛出不止一种类型的异常,所以一个异常处理器可以有多个catch模块。

finally后面的程序块,无论是否发生异常,都会被执行。

我们在try中放入可能出错,需要监视的程序,在catch中设计应对异常的方案。

简单例子


 1 public class two
 2 {
 3     public two() throws IOException
 4     {
 5         BufferedReader br = new BufferedReader(new FileReader("file.txt"));
 6         try
 7         {
 8             StringBuilder sb = new StringBuilder();
 9             String line = br.readLine();
10
11             while (line != null)
12             {
13                 sb.append(line);
14                 sb.append("\n");
15                 line = br.readLine();
16             }
17             String everything = sb.toString();
18         }
19         catch (IOException e)
20         {
21             e.printStackTrace();
22             System.out.println("IO problem");
23         }
24         finally
25         {
26             br.close();
27         }
28     }
29 }

第19行,如果我们捕捉到了这样异常的话(即IOException类对象的e),可以对该对象对象。比如调用对象的printStackTrace(),打印出当前栈的状况 。

无论是否有异常,程序最终会进入finally块中,清空文件描述符所占据的资源。

异常类Trowable



Java中的异常类都继承自Trowable类。一个Throwable类的对象都可以抛出(throw)。

Throwable对象可以分为两组。

一组是unchecked异常(图中橘黄色),异常处理机制往往不用于这组异常:

Error类通常是指Java的内部错误以及如资源耗尽的错误。当Error(及其衍生类)发生时,我们不能在编程层面上解决Error,所以应该直接退出程序。

RuntimeException(及其衍生类)是Java程序自身造成的,也就是说,由于程序员在编程时犯错。

RuntimeException完全可以通过修正Java程序避免。比如将一个类型的对象转换成没有继承关系的另一个类型,即ClassCastException。这类异常应该并且可以避免。

一组是checked异常:

这些类是由编程与环境互动造成程序在运行时出错。

   比如读取文件时,由于文件本身有错误,发生IOException。再比如网络服务器临时更改URL指向,造成MalformedURLException。文件系统和网络服务器是在Java环境之外的,并不是程序员所能控制的。如果程序员可以预期异常,可以利用异常处理机制来制定应对预案。比如文件出问题时,提醒系统管理员。再比如在网络服务器出现问题时,提醒用户,并等待网络服务器恢复。

异常处理机制主要是用于处理这样的异常。

异常处理例子


 1 public class two
 2 {
 3     public static void main(String[] args)
 4     {
 5         Battery aBattery = new Battery(2);
 6         aBattery.useBattery(-2.5);
 7     }
 8 }
 9
10 class Battery
11 {
12     private double power = 0.0; // percentage of battery
13     Battery(double p)
14     {
15         power = p;
16     }
17
18     public boolean useBattery(double p)
19     {
20         try
21         {
22             test(p);
23         }
24         catch (Exception e)
25         {
26             System.out.println("catch Exception");
27             System.out.println(e.getMessage());
28             p = 0.0;
29         }
30
31         if (this.power >= p)
32         {
33             this.power = this.power - p;
34             return true;
35         }
36         else
37         {
38             this.power = 0.0;
39             return false;
40         }
41     }
42
43     private void test(double p) throws Exception
44     {
45         if (p < 0) {
46             Exception e = new Exception("p must be positive");
47             throw e;
48         }
49     }
50 }

运行结果为:

catch Exception
p must be positive

自定义异常



待续..............

......................................

....................................

媳妇让给带饭。

 

时间: 2024-12-20 20:32:08

【Java 进阶篇】【第二课】异常处理的相关文章

【Java 进阶篇】【第一课】String类

引用 String类包含在java.lang包中.这个包会在Java启动的时候自动import,所以可以当做一个内置类(built-in class).我们不需要显式的使用import引入String类. 创建 String类是唯一一个不需要new关键字来创建对象的类.使用的时候需要注意 String s = "Hello World!"; System.out.println(s); 操作 可以用+实现字符串的连接(concatenate),比如: "abc" +

java--努力且进步着:面向对象(1)《java进阶篇》--黑马程序员

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 面向对象 主要内容:<  思想概述.设计实现.成员变量和局部变量.类名作为形参.匿名对象.封装.private关键字.this关键字 > 1 面向对象思想概述 面向对象是基于面向过程的编程思想 面向对象思想特点 是一种更符合我们思想习惯的思想 可以将复杂的事情简单化 将我们从执行者变成了指挥者 2 面向对象开发设计以及特征 软件整个的开发流程: 1.分析: 2.设计: 3.编程(开发): 需

Java进阶学习第二十三天——国际化与AJAX、JSON

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.06.10 lutianfei none 国际化 软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的.符合来访者阅读习惯的页面或数据. 国际化又称为 i18n:internationalization 软件实现国际化,需具备哪些特征: 对于程序中固定使用的文本元素,例如菜单栏.导航条等中使用的文本元素.或错误提示信息,状态信息等,需要根据来访者的地区和国家,选择不

Java进阶篇设计模式之一 ----- 单例模式

前言 在刚学编程没多久就听说过设计模式的大名,不过由于当时还是个彻彻底底的菜鸟,并没有去触碰.直到在开始工作中对简单的业务代码较为熟悉之后,才正式的接触设计模式.当时最早接触的设计模式是工厂模式,不过本文讲的是单例模式,这里就留着下篇文章中在讲解.至于为什么先讲解单例模式? 那是因为单例模式是设计模式中最简单的... .凡事总有个先后顺序,所以就先易后难了.好了,废话不多说了,开始进入正片. 设计模式简介 说明:这里说了的简介就是真的 "简介". 什么是设计模式 设计模式是一套被反复使

Java进阶篇设计模式之七 ----- 享元模式和代理模式

前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 用通俗的话来说就是进行共用.生活中也有一些例子,比如之前很火的共享单车,更早之前的图书馆,编程中经常用的String类,数据库连接池等等.当然,享元模式主要的目的是复用,如果该对象没有的话,就会进行创建. 享

Java进阶篇设计模式之八 ----- 责任链模式和命令模式

前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern). 责任链模式 简介 责任链模式顾名思义,就是为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式.在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接

Java进阶篇设计模式之九----- 解释器模式和迭代器模式

前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解释器模式(Interpreter Pattern)和迭代器模式(Iterator Pattern). 解释器模式 简介 解释器模式顾名思义,就是对某事物进行解释.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 解释器模式

Java进阶篇设计模式之十三 ---- 观察者模式和空对象模式

前言 在上一篇中我们学习了行为型模式的备忘录模式(Memento Pattern)和状态模式(Memento Pattern).本篇则来学习下行为型模式的最后两个模式,观察者模式(Observer Pattern)和空对象模式模式(NullObject Pattern). 观察者模式 简介 观察者模式又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependents)模式.观察者模式定义

Java进阶篇 设计模式之十四 ----- 总结篇

前言 本篇是讲述之前学习设计模式的一个总结篇,其目的是为了对这些设计模式的进行一个提炼总结,能够通过查看看此篇就可以理解一些设计模式的核心思想. 设计模式简介 什么是设计模式 设计模式是一套被反复使用的.多数人知晓的.经过分类编目的.代码设计经验的总结. 为什么使用设计模式 使用设计模式是为了重用代码.让代码更容易被他人理解.保证代码可靠性. 设计模式类型 设计模式有23种类型.按照主要分类可以分为三大类: 一.创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 n