package cn.temptation;

 public class Sample01 {
public static void main(String[] args) {
/*
* 异常:Java程序在运行过程中出现的错误
*
* 类 Throwable:Java 语言中所有错误或异常的超类。
* 只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。
* 类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。
*
* 类 Error:Error 是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获的严重问题。
* 大多数这样的错误都是异常条件。虽然 ThreadDeath 错误是一个“正规”的条件,但它也是 Error 的子类,因为大多数应用程序都不应该试图捕获它。
*
* 类 Exception:Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。
*
* 异常的分类:
* 1、编译时异常:Exception类中除去RuntimeException及其子类以外其他的
* 2、运行时异常:RuntimeException及其子类
*
* 异常的处理方式:
* 1、try...catch...finally格式及其变体
* 2、throws/throw
*
* try...catch...finally处理方式:
* try {
* 可能出现问题的代码
* } catch(异常名称 变量) {
* 针对问题的处理
* } finally {
* 释放资源等操作
* }
*
* try...catch...finally处理的变体方式:
* try {
* 可能出现问题的代码
* } catch(异常名称 变量) {
* 针对问题的处理
* }
*/ // 下句语句编译阶段无语法错误,但是执行时产生异常,这个异常不是由开发人员来处理,应该由开发人员编写代码时就进行判断处理
// System.out.println(2 / 0); // 【针对单个异常】
// try {
// System.out.println(2 / 0);
// } catch (ArithmeticException e) {
// System.out.println("除数不能为0");
// } // 【针对多个异常】
int[] arr = { 1, 2, 3 }; // try {
// // 如果没有进行异常处理,执行时,首先JVM捕获数组越界异常
// System.out.println(arr[3]);
// System.out.println(2 / 0);
// } catch (ArrayIndexOutOfBoundsException e) {
// System.out.println("数组的索引越界");
// } catch (ArithmeticException e) {
// System.out.println("除数不能为0");
// } // 上述的异常处理代码会显示"数组的索引越界",因为代码的顺序执行,首先捕获到索引越界异常,如果解决掉这个问题,再执行会捕获到除数为0的异常 // try {
// System.out.println(arr[3]);
// System.out.println(2 / 0);
// } catch (Exception e) {
// System.out.println("代码有问题");
// } // 上述的异常处理代码使用异常基类Exception类,这样不用明确指出是哪一种异常(偷懒写法) // 【JDK 1.7之后开始支持的语法】
try {
System.out.println(arr[3]);
System.out.println(2 / 0);
} catch (ArrayIndexOutOfBoundsException | ArithmeticException e) {
System.out.println("代码有问题");
} // 上述的异常处理代码需要多个异常是针对同一类类型的问题,否则无法明确具体是什么异常
}
}
 package cn.temptation;

 public class Sample02 {
public static void main(String[] args) {
/*
* 对异常的两种处理方式的理解:
* 类比生病
* 1、哪里有病了哪里疼痛,直接就在对应的问题就发现问题
* 2、有病的地方并不是病因产生的地方,而是病状呈现的地方,也就是问题不断抛出最后得到的结果
*/ // try...catch...finally处理时的注意问题:
// 1、同时使用父类异常 和 子类异常时,父类异常不能写在子类异常之前,否则有语法错误
// try {
// System.out.println(2 / 0);
// } catch (Exception e) {
// System.out.println("代码有问题");
// } catch (ArithmeticException e) {
// // 语法错误:Unreachable catch block for ArithmeticException. It is already handled by the catch block for Exception
// System.out.println("除数不能为0");
// } // 下面语句执行时显示子类异常信息
try {
System.out.println(2 / 0);
} catch (ArithmeticException e) {
// 语法错误:Unreachable catch block for ArithmeticException. It is already handled by the catch block for Exception
System.out.println("除数不能为0");
} catch (Exception e) {
System.out.println("代码有问题");
}
}
}
 package cn.temptation;

 public class Sample03 {
public static void main(String[] args) {
/*
* Throwable类的常用成员方法:
* 1、String getMessage() :返回此 throwable 的详细消息字符串。
* 2、String toString() :返回此 throwable 的简短描述。
* 3、void printStackTrace() :将此 throwable 及其追踪输出至标准错误流。
*/ try {
System.out.println(2 / 0);
} catch (Exception e) {
System.out.println(e.getMessage()); // / by zero
System.out.println(e.toString()); // java.lang.ArithmeticException: / by zero
e.printStackTrace(); // java.lang.ArithmeticException: / by zero at cn.temptation.Sample03.main(Sample03.java:13)
}
}
}
 package cn.temptation;

 public class Sample04 {
public static void main(String[] args) {
/*
* throws 关键字的使用:
* 定义方法时,使用throws关键字标记需要暴露出来被开发人员处理的问题
*/ // 下句语句对calc方法的调用,因为在主函数中没有对calc方法抛出的异常进行处理,所以异常还是由jvm进行捕获
// 调用calc方法,收到其抛出的异常,没有进行处理
// calc(); try {
// 调用calc方法,收到其抛出的异常,并进行处理
calc();
} catch (ArithmeticException e) {
System.out.println("除数不为0");
}
} // 在方法内部对异常不进行处理,在方法的声明上通过throws标记需要处理的异常,并向外抛出
// 定义计算方法
public static void calc() throws ArithmeticException {
System.out.println(2 / 0);
}
}
 package cn.temptation;

 public class Sample05 {
public static void main(String[] args) {
/*
* throw关键字的使用:
* 用在方法内部,出现某种情况程序无法继续运行时,需要进行跳转通过throw把异常对象进行抛出
*
*
* throws 和 throw 的区别:
* 1、throws
* A:用在方法声明中,后面是异常类名
* B:throws后可以有多个异常类名,之间使用英文逗号分隔
* C:表示抛出异常,由方法的调用者进行处理
* D:throws表示出现异常的可能,不一定会发生这些异常
*
* 2、throw
* A:用在方法内,后面是异常类的对象
* B:throw后只能抛出一个异常对象
* C:表示抛出异常,由方法内的语句处理,方法被调用时,调用方法处进行捕获处理
* D:throw表示抛出异常,执行throw一定是抛出了某种异常
*/ // 使用throw关键字,在方法中抛出异常的实例对象,方法调用时没有语法错误
// calc(); // 下面代码捕获到ArithmeticException异常,并执行catch代码块的处理
// try {
// calc();
// } catch (ArithmeticException e) {
// System.out.println("计算异常");
// } // 方法声明上throws出的异常 和 方法内throw出的异常是父子关系,必须进行异常处理,否则就语法出错
// method1(); // try {
// method1();
// } catch (Exception e) {
// System.out.println("除数不为0");
// } // 方法声明上throws出的异常 和 方法内throw出的异常同级且不相同,以throw出的异常为准
method2();
} // 声明计算方法
public static void calc() {
int i = 2;
int j = 0; if (j == 0) { // 判断除数是0
throw new ArithmeticException();
} else {
System.out.println(i / j);
}
} public static void method1() throws Exception {
int i = 2;
int j = 0; if (j == 0) { // 判断除数是0
throw new ArithmeticException();
} else {
System.out.println(i / j);
}
} public static void method2() throws ArrayIndexOutOfBoundsException {
int i = 2;
int j = 0; if (j == 0) { // 判断除数是0
throw new ArithmeticException();
} else {
System.out.println(i / j);
}
}
}
 package cn.temptation;

 public class Sample06 {
public static void main(String[] args) {
/*
* 两种异常处理方式的选择:
* 1、如果在方法内部进行处理,选择try...catch...finally结构
* 2、如果在方法外部进行处理,选择throws/throw
*
* finally的特点:finally中的语句一定会被执行
* 注意:在执行finally语句块之前虚拟机终止了,那么finally语句块中的语句不会执行
*/ try {
System.out.println(2 / 0);
} catch (Exception e) {
System.out.println("异常处理");
/*
* System类的常用成员方法:
* static void exit(int status) :终止当前正在运行的 Java 虚拟机。
*/
System.exit(0);
} finally {
System.out.println("finally中的语句一定会被执行");
}
}
}
 package cn.temptation;

 public class Sample07 {
public static void main(String[] args) {
// 在try...catch...finally...结构中使用return的问题:
// 1、catch语句块中有return语句,finally语句块中没有return语句,执行顺序为:
// 先执行catch语句块中return语句之前的语句,再执行finally语句块中的语句,最后执行catch中的return语句,显示结果为4
// 2、catch语句块中有return语句,finally语句块中也有return语句,执行顺序为:
// 先执行catch语句块中return语句之前的语句,再执行catch中的return语句,然后执行finally语句块中的语句,最后执行finally语句块中的return语句,显示结果为5
System.out.println(show());
} public static int show() {
try {
System.out.println(2 / 0);
return 3;
} catch (Exception e) {
System.out.println("异常处理");
return 4;
} finally {
System.out.println("finally中的语句");
return 5;
}
}
}
 package cn.temptation;

 public class Sample08 {
public static void main(String[] args) {
// try...catch...finally...形式
// 完整形式
try { } catch (Exception e) { } finally { } // try...catch..(单个异常)
try { } catch (Exception e) { } // try...catch..(多个异常)
try { } catch (ArithmeticException e) { } catch (Exception e) { } // try...finally...
// 没有catch代码块结构语法也正确,这种形式目的是为了使用后释放资源
try { } finally { } // 语法错误
// try {
//
// } // 语法错误
// catch (Exception e) {
//
// } // 语法错误
// catch (Exception e) {
//
// } finally {
//
// } // 语法错误
// finally {
//
// }
}
}
 package cn.temptation;

 public class Sample09 {
public static void main(String[] args) {
// 自定义异常类
try {
show(200);
} catch (TestException e) {
e.printStackTrace();
}
} public static void show(int age) throws TestException {
if (age < 0 || age > 150) {
throw new TestException("年龄错误!");
} else {
System.out.println("年龄为:" + age);
}
}
} /**
* 自定义异常类
*/
class TestException extends Exception {
// 构造函数
public TestException() { } public TestException(String msg) {
super(msg);
}
}

【原】Java学习笔记030 - 异常的更多相关文章

  1. 1.13(java学习笔记)异常机制

    异常不同于错误,它是程序运行时产生的未知问题. 如果把程序比喻成一辆汽车,那么汽车开着开着突然前面出现了一个大石头挡住了路,这就叫异常. 那么出现了这个异常我们需要去处理,比如打电话给公路管理局,让它 ...

  2. Java学习笔记__异常机制_try_catch_finally_return执行顺序

    package cn.xiaocangtian.Exception; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...

  3. Java 学习笔记之 异常法停止线程

    异常法停止线程: public class RealInterruptThread extends Thread { @Override public void run() { try { for ( ...

  4. JAVA学习笔记—review基本知识[反射与异常]

    JAVA学习笔记—review基本知识[反射与异常] 1.异常: 1.1异常的分类: Java会将所有的异常封装成对象,其根本父类为Throwable. Throwable有两个子类:Error 和E ...

  5. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  6. java学习笔记16--I/O流和文件

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input  Output)流 IO流用来处理 ...

  7. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

  8. 0032 Java学习笔记-类加载机制-初步

    JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...

  9. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

随机推荐

  1. iOS-主线程刷新UI【+单例】

    主线程刷新UI dispatch_async(dispatch_get_main_queue(), ^{ /// }); 单例 static Tools *_sharedManger; @implem ...

  2. BZOJ 1037: [ZJOI2008]生日聚会Party [序列DP]

    1037: [ZJOI2008]生日聚会Party Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2249  Solved: 1337[Submit] ...

  3. 3.C++内联函数,默认参数,占位参数

    本章主要内容: 1)内联函数(替代宏代码段) 2)默认参数 3)占位参数 1.C++的内联函数分析 1.1讲解内联函数之前,首先回忆下之前讲的define宏定义: 之前讲过宏定义会经过预处理器进行文本 ...

  4. (python基础)时间辍time、时间元组localtime、时间格式化strftime

    可以直接将下方代码运行查看结果:#!/usr/bin/python# coding=utf-8import time # 引入time模块# 时间戳:# 每个时间戳都以自从1970年1月1日午夜(历元 ...

  5. asp.net Global.asax 不运行解决

    asp.net application的站点发布后 Global.asax 未运行,搞了好久终于解决, 解决方法如下: publish设置 该设置经测试在win server 2003 和2008 都 ...

  6. 017 Java中的静态代理、JDK动态代理、cglib动态代理

    一.静态代理 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. 静态代理由业务实现类.业务代理类两部分组成.业务实现类负责实现主要的业务方法,业 ...

  7. 在CentOS 7中安装Jetty服务器

    Jetty 是一款纯Java的HTTP (Web) 服务器和Java Servlet容器. 通常在更大的网络框架中,Jetty经常用于设备间的通信,而其他Web服务器通常给"人类" ...

  8. 在Windows下为PHP5.5安装redis扩展

    使用phpinfo()函数查看PHP的版本信息,这会决定扩展文件版本   根据PHP版本号,编译器版本号和CPU架构, 选择php_redis-2.2.5-5.5-ts-vc11-x86.zip和ph ...

  9. 洛谷P1896 [SCOI2005]互不侵犯King【状压DP】

    题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入格式: 只有一行,包含两个数N,K ...

  10. cookie session区别

      先理解为什么出现cookie和session: 为了使得网站可以跟踪客户端与服务器之间的交互,保存和记忆每个用户的身份和信息,我们需要一种强有力的解决方案,这样就产生了会话控制. 会话控制思想就是 ...