文章内容输出来源:拉勾教育Java就业急训营
前言
基于Java异常,IO流,多线程,网络编程,反射机制
一、异常
异常 :指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。
在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理。
异常指的并不是语法错误,语法错了,编译不通过,不会产生字节码文件,根本不能运行.
编译时出现错误,可以及时处理。运行后,出现的非正常中断是异常。所以需要封装异常。异常处理机制会将代码执行交给异常处理器。
1.异常分类
Throwable是 Java 语言中所有错误或异常的超类。下一层分为Error和Exception
Exception(RuntimeException、CheckedException)
Exception有两个分支,一个是运行时异常RuntimeException,一个是CheckedException。
检查异常CheckedException,如I/O错误导致的IOException、SQLException。
RuntimeException是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。 如:NullPointerException、ClassCastException;出现RuntimeException,一定是程序员的错误.
检查异常CheckedException:一般是外部错误,这种异常都发生在编译阶段,Java编译器会强制程序去捕获此类异常,即会出现要求你把这段可能出现异常的程序进行try catch,该类异常一般包括几个方面:
- 试图在文件尾部读取数据
- 试图打开一个错误格式的URL
- 试图根据给定的字符串查找class对象,而这个字符串表示的类并不存在
2.异常的处理
Java异常处理的五个关键字:try、catch、finally、throw、throws
2.1 抛出异常throw
throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。
使用格式:throw new 异常类名(参数);
public static int getElement(int[] arr,int index){
//判断 索引是否越界
if(index<0 || index>arr.length‐1){
/*
判断条件如果满足,当执行完throw抛出异常对象后,方法已经无法继续运算。
这时就会结束当前方法的执行,并将异常告知给调用者。这时就需要通过异常来解决。
*/
throw new ArrayIndexOutOfBoundsException("哥们,角标越界了~~~");
}
int element = arr[index];
return element;
}
2.2 Objects非空判断
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException() ;
return obj;
}
2.3 声明异常throws
关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常).
throws用于进行异常类的声明,若该方法可能有多种异常情况产生,那么在throws后面可以写多个异常类,用逗号隔开。
public class ThrowsDemo {
public static void main(String[] args) throws IOException {
read("a.txt");
}
public static void read(String path)throws FileNotFoundException, IOException {
if (!path.equals("a.txt")) {
//如果不是 a.txt这个文件
// 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw
throw new FileNotFoundException("文件不存在");
}
if (!path.equals("b.txt")) {
throw new IOException();
}
}
}
2.4 捕获异常try…catch
try{
编写可能会出现异常的代码
}catch(异常类型 e){
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}
2.5 finally 代码块
finally:有一些特定的代码无论异常是否发生,都需要执行,所以在finally代码块中存放的代码都是一定会被执行的。finally不可单独使用
public class TryCatchDemo {
public static void main(String[] args) {
try {
read("a.txt");
} catch (FileNotFoundException e) {
//抓取到的是编译期异常 抛出去的是运行期
throw new RuntimeException(e);
} finally {
System.out.println("不管程序怎样,这里都将会被执行。");
}
System.out.println("over");
}
/*
*
* 当前的这个方法中 有异常 有编译期异常
*/
public static void read(String path) throws FileNotFoundException {
if (!path.equals("a.txt")) {
//如果不是 a.txt这个文件
// 假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw
throw new FileNotFoundException("文件不存在");
}
}
}
如果finally有return语句,永远返回finally中的结果,避免该情况.
2.6 注意:
- 如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常。
- 父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出
3 自定义异常类
异常类如何定义:
- 自定义一个编译期异常: 自定义类 并继承于java.lang.Exception 。
- 自定义一个运行时期的异常类:自定义类 并继承于java.lang.RuntimeException 。
例如: 定义一个登陆异常类RegisterException:
// 业务逻辑异常
public class RegisterException extends Exception {
/**
* 空参构造
*/
public RegisterException() {
}
/**
*
* @param message 表示异常提示
*/
public RegisterException(String message) {
super(message);
}
}
public class Demo {
// 模拟数据库中已存在账号
private static String[] names = {
"bill","hill","jill"};
public static void main(String[] args) {
//调用方法