导读
1.异常分类
2.异常处理分类
3.try-catch-finally机制
4.throw&throws机制
5.自定义异常类
6.异常链
异常分类
Error表示严重的错误,即使出现也并不是程序本身的问题,一般不予以关注
Unchecked Exception:编译器不要求强制处理的异常
包括RuntimeException及其子类
Checked Exception:编译器必须处理异常,即编译时异常
如:IOException, SQLException
异常处理分类
try-catch-finally机制
try块:用于捕获异常
catch块:用于处理try捕获到的异常
finally块:无论是否捕获到异常,都可以执行
package com.hala.exception;
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args){
Scanner input=new Scanner(System.in);
try{
System.out.println("+++++++运算开始+++++++");
System.out.print("请输入第一个数:");
int one=input.nextInt();
System.out.print("请输入第二个数:");
int two=input.nextInt();
System.out.println("one和two的商是:"+(one/two));
}catch(Exception e){
System.out.println("程序出错了~~");
//此句作用为打印错误信息
e.printStackTrace();
}
finally{
System.out.println("+++++++运算结束+++++++");
}
System.out.println("谢谢使用");
}
}
输出结果
+++++++运算开始+++++++
请输入第一个数:12
请输入第二个数:0
程序出错了~~
java.lang.ArithmeticException: / by zero
+++++++运算结束+++++++
谢谢使用
at com.hala.exception.Demo1.main(Demo1.java:15)
多个catch块
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args){
Scanner input=new Scanner(System.in);
try{
System.out.println("+++++++运算开始+++++++");
System.out.print("请输入第一个数:");
int one=input.nextInt();
System.out.print("请输入第二个数:");
int two=input.nextInt();
System.out.println("one和two的商是:"+(one/two));
//算术异常
}catch(ArithmeticException e){
System.out.println("除数不允许为零");
//此句作用为打印错误信息
e.printStackTrace();
//输入格式异常
}catch(InputMismatchException e){
System.out.println("请输入整数");
e.printStackTrace();
//异常的父类要放在最后
}catch(Exception e){
System.out.println("出错了~~");
e.printStackTrace();
}
finally{
System.out.println("+++++++运算结束+++++++");
}
System.out.println("谢谢使用");
}
}
输出结果
请输入第一个数:12
请输入第二个数:0
除数不允许为零
java.lang.ArithmeticException: / by zero+++++++运算结束+++++++
谢谢使用
at com.hala.exception.Demo1.main(Demo1.java:16)
+++++++运算开始+++++++
请输入第一个数:12
请输入第二个数:4.5
请输入整数
java.util.InputMismatchException
+++++++运算结束+++++++
谢谢使用
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at com.hala.exception.Demo1.main(Demo1.java:15)
终止finally的方法
package com.hala.exception;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args){
Scanner input=new Scanner(System.in);
try{
System.out.println("+++++++运算开始+++++++");
System.out.print("请输入第一个数:");
int one=input.nextInt();
System.out.print("请输入第二个数:");
int two=input.nextInt();
System.out.println("one和two的商是:"+(one/two));
}catch(ArithmeticException e){
System.out.println("除数不允许为零");
System.exit(1);
//此句作用为终止程序,其后的语句均不会执行
e.printStackTrace();
}catch(InputMismatchException e){
System.out.println("请输入整数");
e.printStackTrace();
}catch(Exception e){
System.out.println("出错了~~");
e.printStackTrace();
}
finally{
System.out.println("+++++++运算结束+++++++");
}
System.out.println("谢谢使用");
}
}
输出结果
+++++++运算开始+++++++
请输入第一个数:12
请输入第二个数:0
除数不允许为零
return关键字在异常处理中的作用
package com.hala.exception;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args){
int result=test();
System.out.println("one和two的商是:"+result);
}
public static int test(){
Scanner input=new Scanner(System.in);
try{
System.out.println("+++++++运算开始+++++++");
System.out.print("请输入第一个数:");
int one=input.nextInt();
System.out.print("请输入第二个数:");
int two=input.nextInt();
return (one/two);
}catch(ArithmeticException e){
System.out.println("除数不允许为零");
return 0;
}finally{
System.out.println("+++++++运算结束+++++++");
return -1;
//这里注意一旦finally中有了return那么他会覆盖前边的return值
//即这个函数始终返回-1
}
}
}
输出结果
+++++++运算开始+++++++
请输入第一个数:12
请输入第二个数:3
+++++++运算结束+++++++
one和two的商是:-1
+++++++运算开始+++++++
请输入第一个数:12
请输入第二个数:0
除数不允许为零
+++++++运算结束+++++++
one和two的商是:-1
package com.hala.exception;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args){
int result=test();
System.out.println("one和two的商是:"+result);
}
public static int test(){
Scanner input=new Scanner(System.in);
try{
System.out.println("+++++++运算开始+++++++");
System.out.print("请输入第一个数:");
int one=input.nextInt();
System.out.print("请输入第二个数:");
int two=input.nextInt();
return (one/two);
}catch(ArithmeticException e){
System.out.println("除数不允许为零");
return 0;
}finally{
System.out.println("+++++++运算结束+++++++");
}
}
}
输出结果
+++++++运算开始+++++++
请输入第一个数:12
请输入第二个数:0
除数不允许为零
+++++++运算结束+++++++
one和two的商是:0
throw&throws机制
throws
处理方法1
package com.hala.exception;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args){
try {
int result=test();
System.out.println("one和two的商是:"+result);
System.out.println("+++++++运算结束+++++++");
} catch (InputMismatchException e) {
System.out.println("除数不能为0");
e.printStackTrace();
} catch (ArithmeticException e) {
System.out.println("请输入一个整数");
e.printStackTrace();
}
}
/*通过throws抛出异常时,针对可能出现的多种异常,处理情况:
* 1.throws后边接多个异常类型,用逗号分隔
* 2.
*/
public static int test() throws ArithmeticException,InputMismatchException {
Scanner input=new Scanner(System.in);
System.out.println("+++++++运算开始+++++++");
System.out.print("请输入第一个数:");
int one=input.nextInt();
System.out.print("请输入第二个数:");
int two=input.nextInt();
return (one/two);
}
}
输出结果
+++++++运算开始+++++++
请输入第一个数:12
请输入第二个数:0
请输入一个整数
java.lang.ArithmeticException: / by zero
at com.hala.exception.Demo1.test(Demo1.java:30)
at com.hala.exception.Demo1.main(Demo1.java:9)
⚠️这个处理异常有快捷键
右键需要加try-catch的地方->Surround With->Try/catch Block
Try/catch Block:每个Exception类型占一个catch
Try/multi-catch Block:多个Exception类型占一个catch
处理方法2
package com.hala.exception;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args){
try {
int result=test();
System.out.println("one和two的商是:"+result);
System.out.println("+++++++运算结束+++++++");
} catch (InputMismatchException e) {
System.out.println("除数不能为0");
e.printStackTrace();
} catch (ArithmeticException e) {
System.out.println("请输入一个整数");
e.printStackTrace();
}catch(Exception e){
System.out.println("出错了~~");
e.printStackTrace();
}
}
/*通过throws抛出异常时,针对可能出现的多种异常,处理情况:
* 1.throws后边接多个异常类型,用逗号分隔
* 2.throws后边直接接Exception,注意处理时catch中一定要有针对Exception的处理
*/
public static int test() throws Exception {
Scanner input=new Scanner(System.in);
System.out.println("+++++++运算开始+++++++");
System.out.print("请输入第一个数:");
int one=input.nextInt();
System.out.print("请输入第二个数:");
int two=input.nextInt();
return (one/two);
}
}
输出结果
+++++++运算开始+++++++
请输入第一个数:12
请输入第二个数:0
请输入一个整数
java.lang.ArithmeticException: / by zero
at com.hala.exception.Demo1.test(Demo1.java:34)
at com.hala.exception.Demo1.main(Demo1.java:9)
throw
package com.hala.exception;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args) {
try {
test();
} catch (Exception e) {
e.printStackTrace();
}
}
//这里注意throws后边的异常必须是throw后边的父类或者本身,不能是其子类
public static void test() throws Exception {
Scanner input=new Scanner(System.in);
System.out.print("请输入你的年龄:");
int a=input.nextInt();
if(a<18||a>80){
throw new Exception("年龄必须在18岁与80岁之间!");
}else{
System.out.println("欢迎入住~~");
}
}
}
输出结果
请输入你的年龄:2
java.lang.Exception: 年龄必须在18岁与80岁之间!
at com.hala.exception.Demo1.test(Demo1.java:21)
at com.hala.exception.Demo1.main(Demo1.java:9)
自定义异常类
HotelAgeException类
package com.hala.exception;
public class HotelAgeException extends Exception{
public HotelAgeException(){
super("年龄必须在18岁与80岁之间!");
}
}
Demo1类
package com.hala.exception;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args) {
try {
test();
} catch (HotelAgeException e) {
//e.getMessage()是用于获得自定义类的信息的
System.out.println(e.getMessage());
e.printStackTrace();
}
}
public static void test() throws HotelAgeException {
Scanner input=new Scanner(System.in);
System.out.print("请输入你的年龄:");
int a=input.nextInt();
if(a<18||a>80){
throw new HotelAgeException();
}else{
System.out.println("欢迎入住~~");
}
}
}
输出结果
请输入你的年龄:12
年龄必须在18岁与80岁之间!
com.hala.exception.HotelAgeException: 年龄必须在18岁与80岁之间!
at com.hala.exception.Demo1.test(Demo1.java:22)
at com.hala.exception.Demo1.main(Demo1.java:9)
异常链
package com.hala.exception;
public class HotelAgeException extends Exception{
public HotelAgeException(){
super("年龄必须在18岁与80岁之间!");
}
}
package com.hala.exception;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args) {
try {
testThree();
} catch (Exception e) {
e.printStackTrace();
}
}
//异常链的逻辑
/*
* 主函数catch信息=testThree()的throws信息
* 主函数testThree() catch信息=testTwo()的throws信息
* 主函数testTwo() catch信息=testOne()的throws信息
*/
public static void testOne() throws HotelAgeException{
throw new HotelAgeException();
}
public static void testTwo() throws Exception{
try {
testOne();
} catch (HotelAgeException e) {
//两种写法可以打印整条异常链
//写法一
throw new Exception("我是异常1",e);
}
}
public static void testThree() throws Exception{
try {
testTwo();
} catch (Exception e) {
//写法二
Exception e1=new Exception("我是异常2");
e1.initCause(e);
throw e1;
}
}
}
输出结果
java.lang.Exception: 我是异常2
at com.hala.exception.Demo1.testThree(Demo1.java:32)
at com.hala.exception.Demo1.main(Demo1.java:9)
Caused by: java.lang.Exception: 我是异常1
at com.hala.exception.Demo1.testTwo(Demo1.java:24)
at com.hala.exception.Demo1.testThree(Demo1.java:30)
… 1 more
Caused by: com.hala.exception.HotelAgeException: 年龄必须在18岁与80岁之间!
at com.hala.exception.Demo1.testOne(Demo1.java:17)
at com.hala.exception.Demo1.testTwo(Demo1.java:22)
… 2 more