一/在处理异常时有二种选择
第一种/自己处理 — try…catch
意义:如果是自己在本方法内的代码出了问题,且这个问题不关系到方法的形参接收处,不关系到他人(或者其它类)传递的某些参数存在错误,能够明确是自身的代码存在错误的情况下
则使用"自己处理".
1/普通格式: 如果异常代码体没有调用到’抛出了异常’的方法,那么则以此格式定义.在此情况下,'异常捕获处理类’是哪个,则因异常的代码不同而不同.
格式:
try{
//异常代码体
}catch(异常捕获处理类 自定义异常处理对象名){
自定义异常处理对象名.printStackTrace();
}
格式例子
:try {
System.out.println(intarray[2]);
}catch(ArrayIndexOutOfBoundsException ExceptionCobj){
ExceptionCobj.printStackTrace();
System.out.println("数组调用出错!数组[2]不存在!");
}
2/抛出格式:如果在异常代码体中调用了[抛出了异常]的方法,那么'异常捕获处理类'则固定为"xxxxException"(有时直接为"Exception").
假如说同时具有了上述[普通格式]的情况,那么需要在catch的判断处再多声明一个[异常捕获处理类]即可.
格式:
try {
抛出了异常的方法();
}catch(xxxxException 自定义对象名){
自定义对象名.printStackTrace();
}
格式例子:
try {
抛出了异常的方法();
}catch(ParseException methodException){
自定义对象名.printStackTrace();
}
应用示例:
public class tryOfcatch {
public static void main(String[] args) {
int[] intarray = new int[2];
try {
System.out.println(intarray[2]);
}catch(ArrayIndexOutOfBoundsException ExceptionCobj){
ExceptionCobj.printStackTrace();
System.out.println("数组调用出错!数组[2]不存在!");
}
System.out.println("====================");
}
}
“ArrayIndexOutOfBoundsException"为判断一个类名(用于异常判断的类),其类名和其错误类型相对应.这里的错误为数组出现错误.因此为"ArrayIndexOutOfBoundsException”.那么如何在知道错误的情况下,输入同错误类型所对应的类名呢?
有两个获取类名的标准:
1/就是我在输出处打了红色下划线的地方(ArrayIndexOutOfBoundsException).部分错误的类名都可以这样参考.
2/如果用try…catch处理一个’通过throws抛出了异常的方法’,也就是异常代码体处调用了的是一个抛出了异常的方法,那么其判断类名则为"xxxxException".(有时直接为Exception)
示例图如下:
输出结果(斜杠字体的上下顺序可能会变更):
java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2
数组调用出错!数组[2]不存在!
at code.study.Exception.tryOfcatch.main(tryOfcatch.java:13)
Process finished with exit code 0
第二种/返回给调用处
意义:如果可以确定这个异常错误,是因为方法接收到的参数出错,或团队开发中其它人模块/类所传递给我方的数据存在错误(如IO中读取文件时,别人发给自己的路径存在错误),
那么此时则需要以"抛回去"的方式,将异常信息返回给调用处或传参处.让其负责调用处/传参处的其它人进行解决,故命名"抛出异常".如果是这种情景则有先用这个.
但有时,这会被用来逃避自己的错误,抛出自己的错误.如果是这个情景,则推荐优先用第一种.
格式:
权限修饰符 返回值类型-可选 方法名(形参-可选) throws xxxxException{
//方法体
}
格式例子:
public static void throwsException() throws ParseException {
String timeStr = "1997/01/01";
SimpleDateFormat simpleDateFormatObj = new SimpleDateFormat("yyyy/MM/dd"); //yyyy - 年份 MM - 月份 dd - 日期
Date timeDateObj = simpleDateFormatObj.parse(timeStr);//将String字符串时间转换为Date数据类型.
// simpleDateFormat的构造日期格式,必须跟括号内的日期格式一致
//此处需要异常处理,Alt+Enter用throws进行处理
}
二 调用异常的相关信息:
1/public String getMessage() 将异常信息转为String类型以便输出,内容详细.
格式如: methodException.getMessage();
2/public String toString() 将异常信息转为String类型以便输出,但内容可能不太详细.
格式如: methodException.toString();
3/public String printStackTrace() 将异常信息输出在控制台
格式如:methodException.printStackTrace()
三/自定义异常捕获处理类
意义:异常捕获类也可以自定义,以满足对特殊异常的处理需求.
要求1/需要一个’自定义异常捕获类’来接收和发送异常信息,只要该类继承了’Exception’或’RuntimeException’,就可以当作异常捕获类用.
{自定义异常捕获类}的定义格式:
权限修饰符 class 自定义类名 extends Exception/RuntimeException{
public 无参构造() {
}
public 有参构造(String message) {
super(message);
}
}
要求2/需要自定义一个’抛出处理类’来判断某个代码是否存在异常,如果异常则调用’自定义异常捕获类’,通过’自定义异常捕获类’来传递异常信息.
{抛出处理类}的定义格式:
public class 自定类名 {
public 自定义返回值类型-可选 自定义抛出方法名(判断参数) throws {异常捕获类之类名}
//{异常判断体},如果异常则执行代码:throw new CustomException();对{异常捕获类}传递异常信息.
//如果没有异常,则执行其它代码.
}
}
注意:如果{异常捕获类}继承的为RuntimeException,则此处不必用throws抛出,
如果继承的为Exception,则此处必须在{抛出处理类}的方法名括号后面加上throws+{异常捕获类之类名}来抛出.
自定义异常捕获处理类的使用格式:
调用格式步骤一:抛出处理类 自定义对象名 = new 抛出处理类();
调用格式步骤二:自定义对象名.自定义抛出方法名(参数);
注意:因调用其属于可能出现异常的情况,所以编译器会要求你在此通过alt+enter选择一个异常处理方式来将",
要么是自己处理的try…catch 或者是抛出异常的throws
例子: