异常
一、异常:就是程序出现不正常的情况。
Throwable | Error | |
Exception | RuntimeException | |
非RuntimeException |
- Error:严重问题,不处理
- Exception:异常类,程序本身可以处理
- RuntimeException:编译期间不检查,程序出现问题再修改代码
- 非RuntimeException:编译期间处理,否则程序不能通过编译,更不能运行
二、异常处理方案:
1. try...catch...
2. throws
1. try...catch...
//系统默认处理异常方式
public class ExceptionDemo {
public static void main(String[] args) {
System.out.println("开始");
method();
System.out.println("结束");
}
public static void method (){
int[] arr = {1,2,3};
System.out.println(arr[3]);
}
}
运行结果:当出现异常时,程序不能继续往下执行
开始
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at com.chawaner.test2.ExceptionDemo.method(ExceptionDemo.java:17)
at com.chawaner.test2.ExceptionDemo.main(ExceptionDemo.java:11)
//try...catch..处理异常
public class ExceptionDemo {
public static void main(String[] args) {
System.out.println("开始");
method();
System.out.println("结束");
}
public static void method (){
int[] arr = {1,2,3};
try {
System.out.println(arr[3]);
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
}
}
运行结果:当出现异常时,程序能继续往下执行
开始
结束
java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at com.chawaner.test2.ExceptionDemo.method(ExceptionDemo.java:18)
at com.chawaner.test2.ExceptionDemo.main(ExceptionDemo.java:11)
2. Throwable:所有异常的父类,包含的一些方法
public String getMessage() 返回异常信息
public String toString() 返回可抛出的简短说明
public void printStackTrace() 打印详细异常信息
public class ExceptionDemo {
public static void main(String[] args) {
System.out.println("开始");
method();
System.out.println("结束");
}
public static void method (){
int[] arr = {1,2,3};
try {
System.out.println(arr[3]);
} catch (ArrayIndexOutOfBoundsException e) {
//e.printStackTrace();
//返回异常信息
System.out.println("异常信息:"+e.getMessage());
//返回可抛出的简短说明
System.out.println("简短说明:"+e.toString());
//打印详细异常信息
e.printStackTrace();
}
}
}
运行结果:
开始
异常信息:Index 3 out of bounds for length 3
简短说明:java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
结束
//详细异常信息
java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at com.chawaner.test2.ExceptionDemo.method(ExceptionDemo.java:18)
at com.chawaner.test2.ExceptionDemo.main(ExceptionDemo.java:11)
3. 编译时异常和运行时异常的区别
运行时异常:
public class ExceptionDemo1 {
public static void main(String[] args) {
method();
}
public static void method (){
int[] arr = {1,2,3};
//这个索引越界了,但是写代码时没有报错,运行的时候才报错
//所以,这是个运行时异常
System.out.println(arr[3]);
}
}
运行结果:ArrayIndexOutOfBoundsException
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at com.chawaner.test2.ExceptionDemo1.method(ExceptionDemo1.java:17)
at com.chawaner.test2.ExceptionDemo1.main(ExceptionDemo1.java:10)
编译时异常:不一定会出问题,但有可能会出问题
4. throws
有时候异常能够用try...catch...处理,有时候可能出现的异常是我们处理不了的,这个时候用throws解决。
在方法括号后跟上throws 异常类名
运行结果:throws可以解决编译时异常那个红色波浪线的提示。
Wed Nov 09 00:00:00 CST 2022
运行结果:运行时异常用throws解决不了,只是抛出异常。还得用try...catch...处理,才能在提示报错后,继续执行后面的程序。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at com.chawaner.test2.ExceptionDemo1.method(ExceptionDemo1.java:24)
at com.chawaner.test2.ExceptionDemo1.main(ExceptionDemo1.java:14)
总结:
- 运行时异常用try...catch...
- 编译时异常用throws或者try...catch...
- try...catch...是有显示处理的,就是用try...catch...你可以自己处理异常
- throws是抛出异常,控制台显示的是系统给的异常结果
自定义异常
写一个类,让类继承Exception
//自己写的JException异常类
public class JException extends Exception{
public JException() {
}
public JException(String message) {
super(message);
}
}
/*
IntNumber类,里面有个检查数字范围的方法checkNum(int i)
checkNum(int i)方法是由JException抛出的
JException抛出的异常结果显示为:输入的数字有误,范围应为:0-100
*/
public class IntNumber {
public void checkNum(int i) throws JException{
if (i < 0 || i > 100) {
//抛出异常,并显示自己写的异常结果信息
throw new JException("输入的数字有误,范围应为:0-100");
}else {
System.out.println("正常");
}
}
}
//测试类:输入数字,并检查数字的范围
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数字:");
int i = sc.nextInt();
IntNumber in = new IntNumber();
try {
//编译时异常
in.checkNum(i);
} catch (JException e) {
e.printStackTrace();
}
}
}
//运行结果:控制台显示了自定义异常类JException
//以及自己处理的异常显示结果:输入的数字有误,范围应为:0-100
请输入一个数字:
120
com.chawaner.test3.JException: 输入的数字有误,范围应为:0-100
at com.chawaner.test3.IntNumber.checkNum(IntNumber.java:12)
at com.chawaner.test3.Test.main(Test.java:18)
throws和throw的区别
throws | throw |
---|---|
用在方法声明后,后面跟异常类名 | 用在方法体内,后面跟异常对象 |
抛出异常,由方法调用者处理 | 抛出异常,由方法内的语句处理 |
表示可能发生异常,但不一定会发生 | 执行throw时,一定抛出了异常 |
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)