✈【【零基础 快速学Java】韩顺平 零基础30天学会Java】
package com.dingjiaxiong.exception_;
/**
* ClassName: Exception01
* date: 2022/9/4 14:25
*
* @author DingJiaxiong
*/
public class Exception01 {
public static void main(String[] args) {
int num1 = 10;
int num2 = 0;
int res = num1 / num2;
System.out.println("程序继续运行");
}
}
运行结果
因为我们把0作除数了
对异常进行捕获,保证程序可以继续运行
package com.dingjiaxiong.exception_;
/**
* ClassName: Exception01
* date: 2022/9/4 14:25
*
* @author DingJiaxiong
*/
public class Exception01 {
public static void main(String[] args) {
int num1 = 10;
int num2 = 0;
try {
int res = num1 / num2;
}catch (Exception e){
System.out.println("出现异常的原因 = " + e.getMessage());
}
System.out.println("程序继续运行");
}
}
运行结果
Java语言中,将程序执行中发生的不正常情况称为“异常”。
(开发过程中的语法错误和逻辑错误不是异常)
【NullPointerException 空指针异常】
当应用程序试图在需要对象的地方使用 null 时,抛出该异常
package com.dingjiaxiong.exception_;
/**
* ClassName: NullPointerException_
* date: 2022/9/4 14:33
*
* @author DingJiaxiong
*/
public class NullPointerException_ {
public static void main(String[] args) {
String name = null;
System.out.println(name.length());
}
}
运行结果
【ArithmeticException 数学运算异常】
当出现异常的运算条件时,抛出此异常
package com.dingjiaxiong.exception_;
/**
* ClassName: NumberFormatException_
* date: 2022/9/4 14:34
*
* @author DingJiaxiong
*/
public class NumberFormatException_ {
public static void main(String[] args) {
String name = "韩老师666";
int num = Integer.parseInt(name);
System.out.println(num);
}
}
运行结果
【ArrayIndexOutOfBoundsException 数组下标越界异常】
package com.dingjiaxiong.exception_;
/**
* ClassName: ArrayIndexOutOfBoundsException_
* date: 2022/9/4 14:35
*
* @author DingJiaxiong
*/
public class ArrayIndexOutOfBoundsException_ {
public static void main(String[] args) {
int[] arr = {1 ,2 ,4};
for (int i = 0; i <= arr.length; i++) {
System.out.println(arr[i]);
}
}
}
运行结果
【ClassCastException 类型转换异常】
当试图将对象强制转换为不是实例的子类时,抛出该异常
package com.dingjiaxiong.exception_;
/**
* ClassName: ClassCastException_
* date: 2022/9/4 14:37
*
* @author DingJiaxiong
*/
public class ClassCastException_ {
public static void main(String[] args) {
A b = new B(); //向上转型
B b2 = (B) b; //向下转型
C c2 = (C) b;
}
}
class A {
}
class B extends A {
}
class C extends A {
}
运行结果
【NumberFormatException 数字格式不正确异常】
当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常
package com.dingjiaxiong.exception_;
/**
* ClassName: NumberFormatException_
* date: 2022/9/4 14:34
*
* @author DingJiaxiong
*/
public class NumberFormatException_ {
public static void main(String[] args) {
String name = "韩老师666";
int num = Integer.parseInt(name);
System.out.println(num);
}
}
运行结果
编译异常是指在编译期间,就必须处理的异常,否则代码不能通过编译。
package com.dingjiaxiong.exception_;
import java.io.FileInputStream;
import java.io.IOException;
/**
* ClassName: Exception02
* date: 2022/9/4 14:44
*
* @author DingJiaxiong
*/
public class Exception02 {
public static void main(String[] args) {
try {
FileInputStream fis;
fis = new FileInputStream("d:\\aa.jpg");
int len;
while ((len = fis.read()) != -1){
System.out.println(len);
}
fis.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
运行结果
异常处理就是当异常发生时,对异常处理的方式。
Java提供try和catch块来处理异常。
try块用于包含可能出错的代码。
catch块用于处理try块中发生的异常。
可以根据需要在程序中有多个try…catch块。
【基本语法】
try{
//可疑代码
//将异常生成对应的异常对象,传递给catch块
}catch(异常){
//对异常进行处理
}
//如果没有finally,语法可以通过
package com.dingjiaxiong.exception_;
/**
* ClassName: Exception01
* date: 2022/9/4 14:25
*
* @author DingJiaxiong
*/
public class Exception01 {
public static void main(String[] args) {
int num1 = 10;
int num2 = 0;
try {
int res = num1 / num2;
}catch (Exception e){
System.out.println("出现异常的原因 = " + e.getMessage());
}
System.out.println("程序继续运行");
}
}
运行结果
try{
//可疑代码
//将异常生成对应的异常对象,传递给catch块
}catch(异常){
//对异常进行处理
}finally{
//释放资源等
}
【举个栗子】
package com.dingjiaxiong.try_;
import com.dingjiaxiong.exception_.NumberFormatException_;
/**
* ClassName: TryCatchDetail
* date: 2022/9/4 14:54
*
* @author DingJiaxiong
*/
public class TryCatchDetail {
public static void main(String[] args) {
try {
String str = "韩老师666";
int a = Integer.parseInt(str);
System.out.println("数字 : " + a);
}catch (NumberFormatException e){
System.out.println("异常信息:" + e.getMessage());
}finally {
System.out.println("finally代码块");
}
System.out.println("程序继续");
}
}
运行结果
【可以有多个catch语句,捕获不同的异常(进行不同的业务处理)】
要求父类异常在后,子类异常在前,比如(Exception在后,NullPointerException在前),如果发生异常,只会匹配一个catch
【举个栗子】
package com.dingjiaxiong.try_;
import com.dingjiaxiong.exception_.NullPointerException_;
import com.dingjiaxiong.exception_.NumberFormatException_;
/**
* ClassName: TryCatchDetail02
* date: 2022/9/4 14:56
*
* @author DingJiaxiong
*/
public class TryCatchDetail02 {
public static void main(String[] args) {
try {
Person person = new Person();
person = null;
System.out.println(person.getName()); //NullPointerException
int n1 = 10;
int n2 = 0;
int res = n1 / n2; //ArithmeticException
}catch (NullPointerException e){
System.out.println("空指针异常 : " + e.getMessage());
}catch (ArithmeticException e){
System.out.println("算术异常 : " + e.getMessage());
}catch (Exception e){
System.out.println(e.getMessage());
}
finally {
}
}
}
class Person{
private String name = "Jack";
public String getName() {
return name;
}
}
运行结果
【可以进行try-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉/退出。应用场景,就是执行一段代码,不管是否发生异常,都必须执行某个业务逻辑】
package com.dingjiaxiong.try_;
/**
* ClassName: TryCatchDetail03
* date: 2022/9/4 15:04
*
* @author DingJiaxiong
*/
public class TryCatchDetail03 {
public static void main(String[] args) {
try {
int n1 = 10;
int n2 = 0;
System.out.println(n1 / n2);
}finally {
System.out.println("执行了finally...");
}
System.out.println("程序继续执行");
}
}
运行结果
如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。
在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。
举个栗子
package com.dingjiaxiong.throws_;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* ClassName: Throws01
* date: 2022/9/4 15:11
*
* @author DingJiaxiong
*/
public class Throws01 {
public static void main(String[] args) {
}
public void f2() throws FileNotFoundException {
FileInputStream fis = new FileInputStream("d://aa.txt");
}
}
读文件的操作可能产生FileNotFoundException类型的异常
【举个栗子】
package com.dingjiaxiong.throws_;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.PipedInputStream;
/**
* ClassName: ThrowsDetail
* date: 2022/9/4 15:13
*
* @author DingJiaxiong
*/
public class ThrowsDetail {
public static void main(String[] args) {
f2();
}
public static void f2(){
//1.对于编译异常,程序中必须处理,比如 try-catch 或者 throws
//2.对于运行时异常,程序中如果没有处理,默认就是 throws 的方式处理
int n1 = 10;
int n2 = 0;
double res = n1 / n2;
}
public static void f1() throws FileNotFoundException {
//f3()抛出的是一个编译异常,f1就必须要处理
f3();
}
public static void f3() throws FileNotFoundException {
FileInputStream fis = new FileInputStream("d://a.txt");
}
public static void f4(){
//f4之所以不用处理f5的异常,是因为f5抛出的是一个运行异常,有默认处理机制
f5();
}
public static void f5() throws ArithmeticException{
}
}
class Father{ //父类
public void method() throws RuntimeException{}
}
//子类重写父类方法时,对抛出异常的规定:子类重写的方法
//所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常类型的子类型
class Son extends Father{ //子类
@Override
public void method() throws ArithmeticException{
}
}
运行结果
当程序中出现了某些“错误”,但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息。
定义类:自定义异常类名(程序员自己写)继承Exception或RuntimeException
如果继承Exception,属于编译异常
如果继承RuntimeException,属于运行异常(一般来说,继承RuntimeException)
package com.dingjiaxiong.customexception_;
/**
* ClassName: CustomException
* date: 2022/9/4 15:22
*
* @author DingJiaxiong
*/
public class CustomException {
public static void main(String[] args) {
int age = 180;
if (!(age >= 18 && age <= 120)){
throw new AgeException("年龄需要在18 - 120之间");
}
System.out.println("你的年龄范围正确");
}
}
class AgeException extends RuntimeException{
public AgeException(String message){
super(message);
}
}
运行结果