异常
异常:在Java语言中将程序执行中发生的不正常情况称为“异常”(开发过程中的语法错误和逻辑错误不是异常)
Java程序在执行过程中所发生的异常事件可分为两类:
➢Error: Java 虚拟机无法解决的严重问题。如: JVM系统内部错误、资源耗尽等严重情况。比如: StackOverflowError和OOM。 一般不编写针对性的代码进行处理。
➢Exception:其它因编程错误或偶然的外在因素导致的一般性问题, 可以使用针对性的代码进行处理。例如: .空指针访问,试图读取不存在的文件,网络连接中断,数组角标越界
异常体系结构
java. lang. Throwable
|----java.lang. Error:一般不编写针对性的代码进行处理。
|----java.lang. Exception:可以进行异常的处理
|----编译时异常(checked)
|----IOException
|----FileNotFoundException
|----ClassNotFoundException
|----运行时异常(unchecked)
|----NullPointerException
|----ArrayIndexOutOfBoundsException
|----ClassCastException
|----NumberFormatException
|----InputMismatchException
|----ArithmeticException
编译时异常会编译时直接报错,运行时异常会在运行时报错
异常处理
抓抛模型
过程一-: “抛”:程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象。并将此对象抛出。一旦抛出对象以后,其后的代码就不再执行。
过程二: “抓”:可以理解为异常的处理方式:①try-catch-finally ②throws
try-catch-finally的使用
try{
/ /可能出现异常的代码
}catch(异常类型1 变量名1){
/ /处理异常的方式1
}catch(异常类型2 变量名2){
/ /处理异常的方式2
}catch(异常类型3 变量名3){
/ /处理异常的方式3
finally{
//一定会执行的代码
}
说明:
1.finally是 可选的。
2.使用try将可能出现异常代码包装起来,在执行过程中,一旦出现异常, 就会生成一个对应异常类的对象,根据此对复的类型,去catch中进行匹配
3.一旦try中的异常对象匹配到某一 个catch时,就进入catch中进行异常的处理。一旦处理完成,就跳出当前的try-catch结构(在没有写finally的情况)。继续执行其后的代码
4. catch中的异常类型如果没有子父类关系, 则谁声明在上,谁声明在下无所谓。catch中的异常类型如果满足子父类关系,则要求子类一定声明在父类的上面。 否则,报错
5.常用的异常对象处理的方式: ①String getMessage( ) ②printStackTrace()
6.在try结构中声明的变量,再出了try结构以后,就不能再被调用
实例代码
public class test {
public static void main(String[] args) {
try{
int a=0;
int b=0;
System.out.println(a/b);
}catch (ArithmeticException e){
e.printStackTrace();
}finally {
System.out.println("测试");
}
}
}
finally中声明的是-定会被执行的代码。即使catch中又出现异常了,try中有return语句,catch中有
return语句等情况。
示例代码
public class test {
public static void main(String[] args) {
int num = method();
System.out.println(num);
}
public static int method(){
try{
int arr[]={1,2,3};
int num = arr[3];
return num;
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("数组下标越界");
return -1;
}
finally {
return -2;
}
}
}
/*输出结果为:
数组下标越界
-2
*/
像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动的回收的,我们需要自己手动的进行资源的释放。此时的资源释放,就需要声明在finally中。
public class test {
public static void main(String[] args) throws IOException {
try {
File file = new File("test.txt");
FileInputStream fis = new FileInputStream(file);
int data = fis.read();
while (data != -1) {
System.out.println((char) data);
data = fis.read();
}
}catch (FileNotFoundException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}finally{
try{
fis.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
}
throw + 异常类型
1."throws +异常类型"写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。一但当方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出。异常代码后续的代码,就不再执行
2.try-catch-finally :真正的将异常给处理掉了。
示例代码
public class test {
public static void main(String[] args){
try {
method();
}catch (IOException e){
e.printStackTrace();
System.out.println("异常处理");
}
}
static void method() throws IOException {
File file = new File("test.txt");
FileInputStream fis = new FileInputStream(file);
int data = fis.read();
while (data != -1) {
System.out.println((char) data);
data = fis.read();
}
fis.close();
}
}
子类抛出的异常大小只能小于等于父类
手动抛出异常
throw new RuntimeExecption("自己需要输入的内容");
throw new Execption("自己需要输入的内容");
自定义异常
如何自定义异常类?
1.继承于现有的异常结构: RuntimeException 、Exception
2.提供全局常量: serialVersionUID
3.提供重载的构造器
示例代码
public class test {
public static void main(String[] args){
try {
Student S = new Student(-2);
}catch (Exception err){
System.out.println(err.getMessage());
}
}
}
class Student{
int id;
public Student(int id) throws Exception {
if (id > 0){
this.id = id;
}
else{
throw new MyException("不能输入负数");
}
}
}
public class MyException extends Exception{
static final long serialVersionUID = -3387516993124229840L;
public MyException(){
};
public MyException(String msg){
super(msg);
}
}