异常
异常:代码出现的编译或者运行时的错误
异常包含了错误的类型、原因以及位置
异常的分类:
- 运行时异常–RuntimeException,在编译时期可以选择处理或者不处理
- 编译时异常–在编译时期必须处理的异常,是Exception的子类并且是非RuntimeException的子类
异常的体系结构
Throwable
- Error:出现的不可以处理的严重的问题
- Exception:可以处理的问题
package com.it01;
import java.io.FileWriter;
import java.io.IOException;
/*
* 异常的处理方式:
* 1-捕获异常
* try...catch
* try{
* 有可能出现问题的代码;
* }catch(Exception ep){
* 处理异常;
* }
* 2-抛出去
* 不想处理异常或者没有能力处理异常的时候,我们可以选择抛出异常,谁调用方法谁处理异常
* 使用关键字throws在方法的声明抛出异常
* try...catch 执行顺序:try语句-------如果发现异常--------异常下面的代码不再执行---------catch语句
* try语句-------如没有发现异常-----------------catch语句不再执行
* jvm处理异常的方式:
* 返回异常信息,并且终止程序
*/
public class ExceptionDemo {
public static void main(String[] args) throws IOException {
function();
method();
}
public static void method() throws IOException {
//编译时期的异常
FileWriter fw = new FileWriter("a.txt");
}
private static void function() {
try {
System.out.println(2/0);
} catch (ArithmeticException e) {
// TODO: handle exception
System.out.println("分母不能为零");
}
}
}
如何处理异常
package com.it01;
/*
* 处理多个异常:
* 可以使用多个try---catch语句
* 使用一个try和多个catch语句
* 多个catch之间的顺序:
* 多个catch之间可以有子父类
* 平级之间没有顺序关系
* 如果有子父类,父类异常一定要放在后面
*/
public class ExceptionDemo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//method();
try {
//空指针异常
String s = null;
System.out.println(s.length());
int[] arr = new int[5];
System.out.println(arr[8]);
} catch (NullPointerException e) {
// TODO: handle exception
System.out.println("空指针异常");
}catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组越界");
}
}
private static void method() {
try {
//空指针异常
String s = null;
System.out.println(s.length());
} catch (NullPointerException e) {
// TODO: handle exception
System.out.println("空指针异常");
}
try {
//数组越界
int[] arr = new int[5];
System.out.println(arr[8]);
} catch (ArrayIndexOutOfBoundsException e) {
// TODO: handle exception
System.out.println("数组越界");
}
}
}
Throwable的常用方法
- String toString()
- String getMessage()
- void printStackTrace()
package com.it02;
/*
* Throwable的常用方法
* String toString()
* String getMessage()
* void printStackTrace()
*/
public class ExceptionDemo4 {
public static void main(String[] args) {
try {
System.out.println(2/0);
} catch (ArithmeticException e) {
// TODO: handle exception
e.toString();//错误类型和原因
e.getMessage();//错误原因
e.printStackTrace();//返回类型原因和位置
//System.out.println("错误");
}
}
}
finally
package com.it02;
import java.io.FileWriter;
import java.io.IOException;
/*
* finally:组合try--catch语句用于释放资源等收尾工作,finally代码一定会执行
*
* try{
*
* }
* catch(){
*
* }finally{
*
* }
*
*/
public class ExceptionDemo5 {
public static void main(String[] args) {
method();
FileWriter fw= null;
try {
fw = new FileWriter("a.txt");
fw.write("hello");
fw.write("world");
fw.write("java");
System.out.println(2/0);
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//释放资源
try {
if (fw!=null) {
fw.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private static void method() {
try {
System.out.println(2/0);
} catch (Exception e) {
// TODO Auto-generated catch block
//e.printStackTrace();
System.out.println("分母不为0");
}finally {
System.out.println("收尾");
}
}
}
throws和throw
- throws:处理异常的一种方式,把异常抛出,调用者处理
- throw:制造异常的方式,并且结束方法
注意:如果抛出throw的异常时编译时期的异常,必须在方法声明处抛出throws
package com.it03;
import javax.management.RuntimeErrorException;
/*
* throws:处理异常的一种方式,把异常抛出,调用者处理
* throw:制造异常的方式,并且结束方法
*
* 注意:如果抛出throw的异常时编译时期的异常,必须在方法声明处抛出throws
*/
public class ExceptionDemo6 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//boolean flag = checkScore(100);
//System.out.println(flag);
checkScore(110);
}
/*
*
public static boolean checkScore(int score) {
//判断成绩是否符合要求
if (score<0||score>100) {
return false;
}
return true;
}
*/
public static void checkScore(int score) throws Exception {
//判断成绩是狗符合要求
if (score<0||score>100) {
//throw new RuntimeErrorException(null);
//throw new RuntimeErrorException(null,"考试成绩不符合要求");
//throw new Exception("考试成绩不符合要求");
throw new MyException("考试成绩不符合要求");
}
System.out.println("考试成绩符合要求");
}
}
自定义异常
package com.it03;
/*
* 如何书写自定义异常
* 写一个类去继承Exception或者RuntimeException,然后实现多个构造
*/
public class MyException extends RuntimeException{
public MyException() {
super();
// TODO Auto-generated constructor stub
}
public MyException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
}