Throwable -抛出异常类与自定义异常类
/*
自定义异常类
java提供的异常类,不够我们使用,需要自己定义一些异常类
格式:
public class XXXException extends Exception/runtimeException{
添加一个空参数的构造方法
添加一个带异常信息的构造方法
}
注:
1.自定义异常类一般是Exception结尾,说明该类是一个异常类
2.必须继承Exception/RuntimeException
*/
public class RegisterException extends Exception {
//添加一个带空参数的异常
public RegisterException() {
} //查看异常源码可知,可以让父类的构造方法来解决异常信息
public RegisterException(String message) {
super(message);
} }
import java.util.Scanner; /**
* 利用异常,模拟注册功能
*/ public class IsRegister {
//1.数组保存已经注册的用户名(数据库)
static String[] usename = {"赵", "王", "孙"}; public static void main(String[] args) /*throws RegisterException*/ {
//2.一般从前端获取数据源
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名: ");
String name = sc.nextLine();
checkUsename(name); }
//3.定义一个方法对用户输入的数据进行判断
public static void checkUsename(String name) /*throws RegisterException*/ {
for (String usename : usename) {
if(usename.equals(name)){
try {
throw new RegisterException("用户已注册"); //运行期异常,可以不用throws和try catch
} catch (RegisterException e) {
e.printStackTrace();
return;//结束
}
}
}
//注册成功
System.out.println("注册成功");
}
}
/*
//Throwable所有异常的超类
Exception -编译异常,可以throws或者try{}catch{} -子类
RuntimeException -运行异常,可以不处理,让JVM处理
Error -无法处理,必须修改源代码,内存溢出,系统崩溃 -子类
异常处理过程:方法里面异常,查看有没有异常处理逻辑,若没有
——把内容,原因,位置报告JVM——找到方法的调用者(main)
——查看有没有异常处理逻辑,若没有——返回给JVM,JVM控制台打印,并且中断程序 //运行时异常
throw关键字
作用:可以使用throw关键字在指定的方法中抛出指定的异常
格式:throw new xxxException("异常产生的原因")
注:1.throw关键字必须在方法的内部
2.throw关键字new的必须是Exception或其子类对象
3.throw关键字抛出指定的异常对象,我们必须处理这个对象
1.throw关键字后边创建的是RuntimeException或其子类对象,可以交给JVM(打印异常+中断程序)
2.throw关键字后边创建的是编译异常(写代码的时候),要么throws,要么try catch
工作中,必须对对方传递过来的方法进行合法化校验,不合法,则抛出异常的方式给到调用者 //编译异常
throws关键字:异常处理的第一种方式,交给被人处理
作用:
当方法的内部抛出异常对象的时候,那么我们就必须处理这个异常对象
throws将异常对象声明(内容,原因,位置)给调用者,自己不处理,最终会交付给JVM
格式:
修饰符 返回值类型 方法名(参数列表)throws XXXException,XXX,XXX{
throw new XXXException("异常的原因")
}
注意:throws 后面的异常声明必须是Exception或其子类
方法内部如果有多个异常对象,throws必须声明多个
如果异常对象有子父类对象,直接声明父类异常即可
此外,如一旦声明抛出异常的方法,就必须处理该异常,要么继续在调用对象throws声明异常,最后交给方法调用者最后交给JVM,中断
要么try...catch自己处理(一般这种比较好)不中断 try catch:异常处理的第二种方式,自己处理
格式:try{
可能异常的代码
}catch(定义一个异常变量接受try中异常变量){
异常处理逻辑,工作中会把信息记录进日志
}
...
catch(定义一个异常变量接受try中异常变量){
异常处理逻辑,工作中会把信息记录进日志
}
注:try中可能有对个异常对象,所以需要多个catch来处理
如果try中产生异常,就会执行catch的异常处理逻辑,继续执行之后的代码
如果catch里的异常类有父子类关系,子类应该写在上边(二义性),Exception所有的异常类 finally
格式:try{
可能异常的代码
}catch(定义一个异常变量接受try中异常变量){
异常处理逻辑,工作中会把信息记录进日志
}
...
catch(定义一个异常变量接受try中异常变量){
异常处理逻辑,工作中会把信息记录进日志
}finally{
无论代码是否出现异常,这里都会执行
}
注:finally不能单独使用,必须与try一起用,finally一般用于资源释放,无论程序是否有异常,均需要释放资源 */ import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List; public class Throwable {
public static void main(String[] args) /*throws IOException*/ {
//RuntimeException可以不用自己处理交给JVM
//int[] num=new int[5];
//getElement(num,6); //编译异常,需要自己处理,使用throws
//readFile("c:\\b.txt");不会执行,因为上面的异常JVM让程序已经中断 //使用try catch
try {
readFileC("c:\\b.txt"); //有可能出现异常的代码
} catch (ArrayIndexOutOfBoundsException e) {//throws声明的什么异常,就用来生成对象来接收
//异常处理逻辑
/*
Throwable类中定义了三个方法:
String toString() - 返回此 throwable 的详细消息字符串。
StackTraceElement[] getStackTrace() - 提供编程访问由 printStackTrace() 输出的堆栈跟踪信息,JVM打印默认调用此方法
String getMessage() -返回此 throwable 的简短描述。
*/
System.out.println(e.toString()); //java.lang.ArrayIndexOutOfBoundsException: Index 4 out of bounds for length 3
System.out.println(e.getMessage()); //Index 4 out of bounds for length 3
System.out.println(e.getStackTrace()); //[Ljava.lang.StackTraceElement;@4e50df2e
}finally {
System.out.println("资源释放"); //finally无论是否异常,均执行
}
System.out.println("劳资没有中断,太强了"); } public static void getElement(int[] arr, int index) { //运行期异常,可以不用自己处理
if (index > 4 || index < 0) {
throw new ArrayIndexOutOfBoundsException("数组索引有问题"); //ArrayIndexOutOfBoundsException运行期异常,交给JVM,不用自己throw
}
//在Objects里有个判断NullPointerException的方法可以判断 对象 是否为空,简化上述代码
//格式Objects.requireNonNull(对象名);
//另一个重载Objects.requireNonNull(对象名,"抛出的信息") } /*
定义一个方法,对传递的文件路径合法化判断,使用throws
由于FileNotFoundException extends IOException
所以声明IOException即可
*/
public static void readFile(String src) throws IOException {
//抛出文件位置异常
if (!src.equals("c:\\a.txt")) {
throw new FileNotFoundException("文件位置不匹配");
}
//抛出文件后缀异常
if (!src.endsWith(".txt")) {
throw new IOException("文件位置不匹配"); }
} public static void readFileC(String src) {
List<Integer> integers = List.of(1, 2, 3);
integers.get(4); }
}
Throwable -抛出异常类与自定义异常类的更多相关文章
- Java异常类和自定义异常类
自定义异常类: public class ExtendsException extends Exception { private static final long serialVersionUID ...
- C# 自定义异常类 throw语句抛出异常
Exception概述: 异常(Exception)一般分为两大类SystemException.ApplicationException,前者是预定义的异常类,后者是用户自定义异常类时需要继承的类 ...
- [转]如何编写和应用Java的自定义异常类
编写自定义异常类实际上是继承一个API标准异常类,用新定义的异常处理信息覆盖原有信息的过程.常用的编写自定义异常类的模式如下: public class CustomException exten ...
- java中自定义异常类
hello,大家好,今天跟大家分享一下java中如何自定义异常,以后如果有新的心得,再添加,欢迎前辈指导... 首先,上Api,看一下异常和错误的父类: 然后,现在假设我有个循环(i=0;i<1 ...
- java基础之自定义异常类及throw和throws的区别
一.异常的架构: Throwable类:所以异常类都是Throwable的子类,它派生两个子类 Error和Exception. Error类:表示仅靠程序本身无法恢复的的严重错误,比如内存溢出,虚拟 ...
- 【java】自定义异常类
目录结构: contents structure [+] 为什么需要自定义异常类 自定义异常的方式 实例 日常日志 一,为什么需要自定义异常类 当java中的异常类型没有能够满足我们所需的异常的时候就 ...
- java的自定义异常类
编写自定义异常类的模式 编写自定义异常类实际上是继承一个Exception标准异常类,用新定义的异常处理信息覆盖原有信息的过程.常用的编写自定义异常类的模式如下: public classCustom ...
- java -> 异常类与自定义异常
异常 什么是异常?Java代码在运行时期发生的问题就是异常. 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 异常的继承体 ...
- Java自定义异常类
用户可以根据自己的需要定义自己的异常类,定义异常类只需要继承Exception类即可 //================================================= // Fi ...
随机推荐
- Neo4j的查询语法笔记(二)
cypher是neo4j官网提供的声明式查询语言,非常强大,用它可以完成任意的图谱里面的查询过滤,我们知识图谱的一期项目 基本开发完毕,后面会陆续总结学习一下neo4j相关的知识.今天接着上篇文章来看 ...
- NGUI的HUD Text的扩展插件学习--(UIFollowTarget)的使用
一,我们先导入NGUI_HUD_Text_v1.11包,导入包后会在项目生成一个这样的文件夹 二,我们添加一个cube,给cube添加一个空的游戏对象 二,我们使添加一个label,然后给label添 ...
- spark浅谈(3):
一.shuffle操作 1.spark中特定的操作会触发我们都知道的shuffle事件,shuffle是spark进行数据重新分布的机制,这通常涉及跨执行程序和机器来赋值数据,使得混洗称为复杂而且昂贵 ...
- 类目(category) - 类扩展(extension) 区别
说明: 方法,属性或变量: 类别只能添加方法,不能添加属性(理论上,但可以通过runtime的关联添加). 扩展可以添加方法和实例变量或属性,实例变量默认@private类型.扩展是类别的一个特例 ...
- idea旗舰版续命
首先鼓励大家使用正版!我一直用的是免费的社区版,但发现有一些功能被阉割了,比如weblogbic就不支持,无奈现在的项目要用到这个,只能去下载旗舰版. 旗舰版需要付费,作为程序员的我为了一个临时的项目 ...
- python基础--文件的操作
#r w a 文件读取操作 默认打开为读操作 #f=open('coldplay.txt','r',encoding="utf-8")#open函数默认已系统编码方式打开windo ...
- 【学习】008 Socket网络编程
课程目标 网络模型 TCP协议与UDP协议区别 Http协议底层实现原理. 什么是网络模型 网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机.数据传递本身没有多大的难度, ...
- shell 数组中 @ 跟 * 的区别
关于在shell脚本中数组变量中 “*”跟 “@” 区别 “*”当变量加上“” 会当成一串字符串处理. “@”变量加上“” 依然当做数组处理. 在没有加上“” 的情况下 效果是等效的. #!/bin/ ...
- Python---基础---dict_tuple_set
2019-05-21 ------------------------ help(tuple) ------------------------- Help on class tuple in mod ...
- R语言把DataFrame的一行变成向量
在R语言里面,DataFrame的一列数据本质上可以认为是一个向量或列表,但是一行数据不是. 今天有一个31列的数据集,由于放在第一行的变量名格式不规范,读入数据的时候不能顺带读入变量名.于是跳过首行 ...