Java基础教程——异常处理详解
异常处理
好程序的特性
- 可重用性
- 可维护性
- 可扩展性
- 鲁棒性
|--|--Robust的音译
|--|--健壮、强壮之意
|--|--指在异常和危险情况下系统依然能运行,不崩溃

Java中,写下如下代码:
public class TestException {
public static void main(String[] args) {
int a = 10 / 0;
System.out.println("-END-");
}
}
代码运行到“10 / 0”时出错,整个程序会中断,表现为最后的"-END-"没有输出。
java.lang.ArithmeticException: / by zero
很显然这不算好的程序,好的程序应该做好异常处理,不能说一处出错整体崩盘。
异常处理
异常处理,就是当程序出了错误时,系统不崩溃。
顶层类:Throwable
| 大分类 | 小分类 | |
|---|---|---|
| Error | 处理不了 | |
| Exeption | 编译时异常 | 必须处理(不处理编译不通过) |
| 运行时异常 | 可以处理 |
Error示例:
public class TestError {
// Exception in thread "main" java.lang.StackOverflowError
public static void main(String[] args) {
m();
}
static void m() {
m();
}
}
不断递归,导致出现栈溢出:
Exception in thread "main" java.lang.StackOverflowError
编译时异常:
import java.io.FileNotFoundException;
public class 异常处理 {
static void TestException1() {
try {
throw new FileNotFoundException("编译时异常,必须处理,要么自己处理,要么抛出");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
static void TestException2() throws FileNotFoundException {
throw new FileNotFoundException("编译时异常,必须处理,要么自己处理,要么抛出");
}
public static void main(String[] args) {
TestException1();
try {
TestException2();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
try.catch.finally
Try{尝试执行}
Catch{出错时执行}
Finally{出不出错都执行,在return之前执行}
public class 异常处理 {
public static void main(String[] args) {
int a = 10, b = 0;
TestException(a, b);
}
static boolean TestException(int a, int b) {
try {
System.out.println(a / b);
} catch (ArithmeticException e) {// 声明,此处可能抛出"算术异常"
System.out.println("系统维护中,请稍后重试");
return false;
} finally {
System.out.println("---END---");
}
return true;
}
}
运行结果:
系统维护中,请稍后重试
---END---
try(with resources)语法
从Java 7开始,Java支持try-with-resources 语句,称为 ARM 块(Automatic Resource Management) ,自动资源管理——try...catch代码运行完毕后,自动释放资源,即使出现异常也会关闭资源。
这种语句可以使得try...catch代码变得简洁(手动关闭资源往往需要考虑多种场景,导致代码臃肿)。
这个功能在IO中用的比较多,Scnner没必要做异常处理,以下仅是一个示例:
import java.util.Scanner;
public class TryWith {
public static void main(String[] args) {
testTryWith();
testTryWith();
}
private static void testTryWith() {
try (Scanner sc = new Scanner(System.in)) {
sc.nextLine();
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("finally");
}
}
}
finally
java.util.NoSuchElementException: No line found
finally
扩展阅读:
[try...catch的前世今生]: https://www.cnblogs.com/tigerlion/p/10659675.html
throw自定义异常
自定义异常类,继承Excption类
一般需要写一个带参构造方法
public class Test自定义异常 {
public static void main(String[] args) {
int a = 10;
TestException(a);
}
static boolean TestException(int money) {
try {
if (money < 10000) {
// 拋一個異常對象
throw new DidiException("系統升級,請半年后重試");
}
} catch (Exception e) {// 声明,此处可能抛出"算术异常"
e.printStackTrace();
return false;
} finally {
System.out.println("---END---");
}
return true;
}
}
class DidiException extends Exception {
public DidiException(String message) {
super(message);
}
}
运行结果:
DidiException: 系統升級,請半年后重試
---END---
at Test自定义异常.TestException(Test自定义异常.java:10)
at Test自定义异常.main(Test自定义异常.java:4)
Java基础教程——异常处理详解的更多相关文章
- Java基础之 数组详解
前言:Java内功心法之数组详解,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) 数组概念 同一种类型数据的集合.其实数组就是一个容器. 数组 ...
- java基础之:详解内部类(转载)
可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...
- Java基础知识面试题详解(2019年)
文章目录 1. 面向对象和面向过程的区别 2. Java 语言有哪些特点? 3. 关于 JVM JDK 和 JRE 最详细通俗的解答 JVM JDK 和 JRE 4. Oracle JDK 和 Ope ...
- JAVA异常与异常处理详解
一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域的情况,称之为异常. java中异常的体系是怎么样的呢? 1.Java中的所有不正常类都 ...
- JAVA异常与异常处理详解【转】
感谢!!!原文地址:https://www.cnblogs.com/knightsu/p/7114914.html 一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在ja ...
- Java基础(52):ClassCastException详解(转)
ClassCastException,从字面上看,是类型转换错误,通常是进行强制类型转换时候出的错误.下面对产生ClassCastException异常的原因进行分析,然后给出这种异常的解决方法. 这 ...
- java基础(十四)-----详解匿名内部类——Java高级开发必须懂的
在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.匿名内部类使用的形参为何要为final. 使用匿名内部类内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: n ...
- Java基础之数组详解
数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java 语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如 numbers[1 ...
- java 基础之--反射详解
java 反射绝大部分都位于 java.lang.reflect package 中:常用的类就是: 1.class类:代表一个类 2.field类:代表类的成员变量 3.method:代表类的方法 ...
随机推荐
- 第 1 篇:Vue.js 很高兴认识你
作者:HelloGitHub--追梦人物 Hello Vue 既然是学习编程,那就遵循一下那个古老的传统仪式. 首先我们新建一个 todos.html 文件,用任何一个你喜欢的文本编辑器或者 IDE ...
- nacos 作为配置中心使用心得--配置使用
1.页面配置 撇开原理不谈,先来介绍下nacos的基本使用,如下图nacos配置是以data id为单位进行使用的,基本上一个服务的一个配置文件就对应一个data id,支持的格式有xml,yaml, ...
- ERP收付款的操作与设计--开源软件诞生22
赤龙ERP收款付款讲解--第22篇 用日志记录"开源软件"的诞生 [进入地址 点亮星星]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redra ...
- Python彩蛋、字典、列表高级用法、元类、混入、迭代器、生成器、生成式、git
一.类与类的关系 关注公众号"轻松学编程"了解更多. is-a 继承 继承是指一个类(称为子类.子接口)继承另外一个类(称为父类.父接口)的功能, 并可以增加它自己的新功能的能力. ...
- 简单Emacs配置
(global-set-key [f9] 'compile-file) (global-set-key [f10] 'gud-gdb) (global-set-key (kbd "C-s&q ...
- ATcoder Grand Contest总结
最前面: AT的题都很有思维难度,总结一下一些AT的常规操作 1.对于有操作的题目,如果正面推不行的话考虑倒推,将操作转化,寻找更好的性质 2.模型转化,看到某一种的计算的式子,需要考虑有没有更简化的 ...
- malloc,calloc,realloc三者的区别
malloc,calloc,realloc三者都可以运用与动态分配数组. malloc:用malloc必须要自己初始化,可以用memset(arr,0,cnt*sizeof(int)) calloc: ...
- c#写入文件流
using (FileStream wir=new FileStream(@"C:\Documents and Settings\Administrator\桌面\1.txt",F ...
- 【Mycat】Mycat核心开发者带你看尽Mycat三大核心配置文件
写在前面 在分布式数据库中间件领域,Mycat和ShardingSphere可以说是在开源界有着相当重要的位置,不少小伙伴也在问我:Mycat和sharding-jdbc哪个好呀!其实,就我本身而言, ...
- 在java9+版本中,接口的内容和注意
1.成员变量其实就是常量,格式: [public] [static] [final] 数据类型 常量名称 = 数据值: 注意: 常量必须进行赋值,而且一旦赋值不能改变. 常量名称完全大写,用下划线进行 ...