Java异常+解析异常
java.Lang.Throwable**:类是Java语言中所有错误或异常的超类。
Exception:编译期异常,进行编译(写代码)Java程序出现的问题
RuntimeException:运行期异常,Java程序运行过程中出现的问题
Error:错误
异常:可以把异常处理掉,程序可以继续执行。
错误:必修修改源代码,程序才能继续执行。
解析异常:

throw关键字
作用:
可以使用throw关键字在指定的方法中抛出异常
使用格式:
-
throw关键字必须写在方法的内部
-
throw关键字后边new的对象必须是Exception或者Expception的子类对象
-
throw关键字抛出指定的异常对象,我们就必须处理这个异常对象
throw关键字后边创建的是RuntimeExcepton或者是RuntimeException的子类对象,我们可以不处理,默认交给JVM处理(打印异常,中断程序)
throw关键字后边创建的是编译异常(写代码的错误),我们就必须处理这个异常,要么throws,要么try...catch
throw关键字
public static void main(String[] args) {
//int[] arr = null;
int[] arr = new int[3];
int e = a(arr, 3); // 3 以超出范围
System.out.println(e);
//
/*
* 工作中首先对对方传递过来的参数进行合法校验
* 如果参数不合法,我们就必须要抛出异常,告知方法的调用者,传递的参数有问题*/
//注意:NullPointerException (空指针异常)为运行期异常,我们不用处理,默认交给JVM
}
public static int a(int arr[], int index){
/*
* 也可以对index参数进行校验
* 如果参数不在数组的范围内 可以告诉方法的调用者越界了
* 注意:ArrayIndexOutOfBoundsException 为运行期异常,我们不用处理,默认交给JVM*/
if (index<0 || index>arr.length-1){
throw new ArrayIndexOutOfBoundsException("");
}
/*
* 可以对传递过来的参数数组,进行合法校验
* 如果数组arr的值是null
* 那么我们就抛出异常,告知方法的调用者“传递的数组为空”
* */
if (arr==null){
throw new NullPointerException("传递的数组为空");
}
int ele = arr[index];
return ele;
}
注意:
-
throw关键字后边创建的是编译异常(写代码的时候),我们就必须处理这个异常,要么throws,要么try...catch
-
调用了一个声明抛出异常的方法,我们就必须得处理声明的异常
要么继续使用throws声明抛出,交给方法的调用者处理,最终交给JVM
要么try...catch自己处理异常
缺陷:throws异常后 不会进行后续代码 会直接中断。
try...catch:异常处理的第二种方式,自己处理异常
格式:
try{
可能产生异常的代码
}catch(定义一个异常的变量,用来接收try中抛出的异常对象){
异常的处理逻辑,异常对象之后,怎么处理异常对象
一般在工作中,会把异常的信息记录到一个日志中
}
...
catch(异常类名 变量名){
}
注意:
一个try多个catch注意事项:
catch里边定义的异常变量,如果有子父关系,那么子类的异常变量必须写在上边,否则会报错。
- try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象
- 如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行try...catch之后的代码
- 如果try中没有产生异常,那么就不会执行catch中异常的处理逻辑,执行完try中的代码,继续执行try...catch之后的代码
public static void main(String[] args) {
try{
readFile("D:Ware");
} catch (IOException e) {
e.printStackTrace();//会报红字 并打印throw new IOException("文件名的后缀名不对");
// e.printStackTrace();在命令行打印异常信息在程序中出错的位置及原因。
System.out.println("后缀名不对");
}
System.out.println("继续执行");
}
public static void readFile(String fileName) throws IOException{
if (!fileName.endsWith(".txt")){
throw new IOException("文件名的后缀名不对");
}
System.out.println("路径没有问题,读取文件");
}
}

finally
无论是否出现异常都会执行
注意:
- finally不能单独使用,必须和try一起使用
- finally一般用于资源释放(资源回收),无论程序是否出现异常,最后都要资源释放(IO)
注意:如果finally有return语句,永远返回finally中的结果,避免该情况。
自定义异常类
java提供的异常类,不够我们使用,需要自己定义一些异常类
格式:
public class XXXException extends Exception | RuntimeException{
添加一个空参数的构造方法
添加一个带异常信息的构造方法
}
注意:
- 自定义异常一般都是以Exception结尾,说明该类是一个异常类
- 自定义异常类,必须得继承Exception或者RuntimeException
自定义异常__注册练习
public class demo06_02 {
//1.使用数组保存已经注册过的用户民(数据库)
static String[] usernames = {"张三","李四","王五"};
public static void main(String[] args) throws Exception {
//2.使用Scanner获取用户输入的注册的用户名(前端,页面)
Scanner scanner = new Scanner(System.in);
System.out.println("请输入注册用户名");
String username = scanner.next();
checkUsername(username);
}
//3.定义一个方法,对用户输入的用户名进行判断
public static void checkUsername(String username) throws Exception {
//遍历注册过的用户名,获取每一个用户名
for (String name : usernames) {
//使用获取到的用户名和用户输入的用户名比较
if (name.equals(username)){
//结果为true 抛出异常 告知用户已被注册
throw new Exception("该用户已被注册");
}
}
System.out.println("注册成功");
}
}

浙公网安备 33010602011771号