网站首页 > java教程 正文
1 JVM处理方式
JVM处理方式
将异常信息(异常类名,异常的原因,异常位置)打印在控制台
退出JVM,终止程序的运行
2 捕获异常try…catch
格式
try{
编写可能会出现异常的代码
}catch(异常类型 e){
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}
try:该代码块中编写可能产生异常的代码
catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理
try和catch都不能单独使用,必须连用
示例
/**
单catch捕获处理异常的格式
try{
} catch(异常类名 变量名){
?
}
说明
try代码块
编写可能会出现异常的代码,如果该代码块中的某行代码出现了异常
则try代码块后续的代码不会被执行了
catch代码块:
编写处理异常的代码,如果try代码块中的代码没有出现异常
则catch代码块的代码不会被执行
*/
public class ExceptionDemo01 {
public static void main(String[] args){
int a = 0;
test(a);
}
private static void test(int a) {
try{
/*
1.创建一个对象:ArithmeticException ee = new ArithmeticException("/ by zero");
2.抛出异常对象:ee
*/
int result = 100 / a;
System.out.println("result = " + result);
}catch (ArithmeticException e){
System.out.println("到这里了吗");
// 在调式阶段,一般都会调用该方法打印异常信息
e.printStackTrace();
}
System.out.println("来这里");
}
}
多个异常使用捕获又该如何处理
多个异常分别处理
多个异常一次捕获,多次处理
多个异常一次捕获一次处理
一般我们是使用一次捕获多次处理方式
格式
try{
编写可能会出现异常的代码
}catch(异常类型A e){ 当try中出现A类型异常,就用该catch来捕获
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}catch(异常类型B e){ 当try中出现B类型异常,就用该catch来捕获
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}
多catch处理异常示例
/**
多catch捕获处理异常的格式
try{
?
} catch(异常类名 变量名){
?
} catch(异常类名 变量名){
?
} ...catch(异常类名 变量名){
?
}
说明
try代码块
编写可能会出现异常的代码,如果该代码块中的某行代码出现了异常
则try代码块后续的代码不会被执行了
catch代码块:
编写处理异常的代码,如果try代码块中的代码没有出现异常
则catch代码块的代码不会被执行
*/
public class ExceptionDemo02 {
public static void main(String[] args){
int a = 2;
test(a);
}
private static void test(int a) {
try{
/*
1.创建一个对象:ArithmeticException ee = new ArithmeticException("/ by zero");
2.抛出异常对象:ee
*/
int result = 100 / a;
System.out.println("result = " + result);
// 定义字符串
String str = "abc";
/*
1.创建一个对象:NullPointerException ee = new NullPointerException();
2.抛出异常对象:ee
*/
System.out.println(str.length());
// 定义一个数组
int[] arr = {1,2,3};
/*
1.创建一个对象:ArrayIndexOutOfBoundsException ee = new ArrayIndexOutOfBoundsException("3");
2.抛出异常对象:ee
*/
System.out.println(arr[2]);
System.out.println(str.charAt(4));
} catch (NullPointerException e){
System.out.println("又来了没");
} catch (ArithmeticException e){
System.out.println("来了没");
} catch (ArrayIndexOutOfBoundsException e){
System.out.println("又来了吗");
} catch (Exception e){
System.out.println("来多少次了");
}
System.out.println("来这里");
}
}
多catch捕获处理需要注意的是
try代码块中不可能同时出现两个异常,多个catch代码块不可能同时执行两个
多个异常类名之间有继承关系,则父类类型要放在子类类型下面
多个异常类名之间没有继承关系,则没有顺序要求
3 抛出异常throw和声明异常throws
throw关键字作用
用来抛出异常对象,将异常对象抛给方法调用者,并结束当前方法的运行
throw关键字使用格式
throw 异常对象;
throw关键字的使用位置:使用在方法体中
throws关键字作用
用来声明异常,告诉方法调用者方法可能会出现的异常有哪些,让调用者对异常进行处理
throws关键字使用格式
修饰符 返回值类型 方法名(参数列表)throws 异常类名,... {}
throws关键字的使用位置:使用在方法声明上
示例
public class ExceptionDemo03 {
public static void main(String[] args){
int a = 0;
test(a);
}
private static void test(int a) throws ArithmeticException,NullPointerException {
/*
1. 创建异常对象:ArithmeticException e new ArithmeticException("/ by zero");
2. 抛出异常对象:throw e;
*/
if(a == 0){
// 创建异常对象
ArithmeticException e = new ArithmeticException("除数不为零");
// 抛出异常对象
throw e;
}
int result = 100 / a ;
System.out.println("result = " + result);
System.out.println("这里来");
}
}
4 finally 代码块
finally代码块的特点
只要代码执行流程进入了try代码块,不管是否出现异常,该代码块中的代码都会执行
finally代码块的作用
用来释放资源,比如关闭流,关闭数据库资源
捕获处理的完整格式
try{
?
} catch(异常类名 变量名){
?
} finally{
?
}
示例
public class ExceptionDemo04 {
public static void main(String[] args){
int a = 2;
System.out.println(test(a));
}
private static int test(int a) {
if (a != 0){
try{
/*
1.创建一个对象:ArithmeticException ee = new ArithmeticException("/ by zero");
2.抛出异常对象:ee
*/
int result = 100 / a;
System.out.println("result = " + result); // 50
// 退出JVM,终止程序运行,不会执行finally代码块了
System.exit(0);
return 200;
} catch (Exception e){
System.out.println("来了没");
} finally {
System.out.println("释放资源");
}
}
System.out.println("这里来");
return 100;
}
}
5方法重写异常处理注意点
方法重写时异常处理注意事项(针对编译时异常)
子类重写方法时声明的异常不能大于父类方法声明的异常
6编译时异常和运行时异常
编译时异常的概念
除了运行时异常以为的所有的异常都是编译时异常
运行时异常的概念
只要是RuntimeException或RuntimeException的子类异常都属于运行时异常
运行时异常的特点
方法体中如果抛出的异常是运行时异常,则可以处理,也可以处理
方法声明上声明的异常如果是运行时异常,则方法调用者可以处理,也可以不处理。
编译时异常的特点
方法体中如果抛出的异常是编译时异常,则要求必须要处理
方法声明上声明的异常如果是编译时异常,则要求调用者一定要处理
为什么java编译器对运行时异常管理如此松散?
因为运行时异常一般是可以通过程序猿良好的编程习惯避免
猜你喜欢
- 2024-10-06 Java中的异常(java中的异常是什么)
- 2024-10-06 Java 异常处理(java异常处理关键字)
- 2024-10-06 Java基础:异常捕获与处理,防患于未然
- 2024-10-06 「每日一面」java异常处理(java异常处理步骤)
- 2024-10-06 深入理解java异常处理机制,程序员们会了吗
- 2024-10-06 JAVA这样来处理异常(java 处理异常)
- 2024-10-06 太简单了!这套Java异常处理的总结,80%的人都没看过
- 2024-10-06 “全栈2019”Java异常第十七章:Error详解
- 2024-10-06 Java学习:Java中的异常(java中的异常是什么)
- 2024-10-06 详解Java异常(java异常处理规则(新手必看))
你 发表评论:
欢迎- 最近发表
-
- 你真的会用 Java 中的线程池吗?多个企业级线程池工具类封装实践
- 线程池的实现原理、优点与风险、以及四种线程池实现
- Java线程池ThreadPoolExecutor实现原理剖析
- 深入分析线程池的实现原理(线程池是干嘛的)
- 一文搞懂JAVA线程池工作原理(java线程池的工作流程)
- Java线程池的工作原理(java线程池的实现原理)
- 5分钟读懂C#中TcpClient、TcpListener和Socket三个类的角色
- JVM对象的创建过程(jvm运行过程中创建的对象一般存放在方法区)
- 对象组成与Java内存模型JMM分析(java对象在内存中存储的结构)
- JVM对象内存分配详细过程(栈上分配->TLAB->老年代->Eden区)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)