异常的探讨
Posted Al_tair
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异常的探讨相关的知识,希望对你有一定的参考价值。
异常的探讨
大家好呀!我是小笙!我学习了韩顺平老师的类和对象的知识,收获颇丰!现在来和大家分享笔记!
异常
基本概念
概念: 将程序执行中发生的不正常情况(语法错误和逻辑错误不是异常)
public class Exception01
/*
* 异常
* 分两大点 Error & Exception
* Error: 严重错误,程序奔溃 例如:java虚拟机无法解决的严重问题
* Exception:偶然的外在因素导致的一般性问题,可以使用针对性代码进行处理
* Exception 可以分为 运行时异常 和 编译时异常
*/
public static void main(String[] args)
int num1 = 10,num2 = 0;
/*
* Exception in thread "main" java.lang.ArithmeticException: / by zero
* at com.Al_tair.exception_.Exception01.main(Exception01.java:14)
*/
// int div = num1/num2; 异常
try
int div = num1/num2;
catch (Exception e)
e.printStackTrace();
System.out.println("~~~"); // 会继续运行
异常的体系图
异常分为两大类:运行时异常,编译时异常
- 运行时异常,编译器不要求强制处置的异常(一般是逻辑错误)
- 编译时异常是编译器要求必须处置的异常
运行时异常
运行时异常,编译器不要求强制处置的异常(一般是逻辑错误)
空指针异常
NullPointException :当应用程序在需要使用对象的地方使用null,抛出该异常
// 实例
class NullPointException
public static void main(String[] args)
String name = null;
System.out.println(name.length()); // NullPointerException
数字运算异常
ArithmeticException:当出现异常运算条件时,抛出异常
// 实例
class ArithmeticException
public static void main(String[] args)
int num1 = 10,num2 = 0;
int div = num1/num2; // ArithmeticException
数组下标越界
ArrayIndexOutOfBoundsException:用非法索引访问数组的异常
// 实例
class ArrayIndexOutOfBoundsException
public static void main(String[] args)
int[] array = new int[3];
System.out.println(array[3]); //ArrayIndexOutOfBoundsException
类型转换异常
ClassCastException:当试图将对象强制类型转换为不是该实例的子类,抛出该异常
// 实例
class ClassCastException
public static void main(String[] args)
A b = new B();
C c = (C)b; // ClassCastException
class A
class B extends A
class C extends A
数字格式不正确异常
NumberFormatException:当应用程序试图将字符串转换成一种数值类型,将抛出该异常
// 实例
class NumberFormatException
public static void main(String[] args)
String name = "";
int num = Integer.parseInt(name); // NumberFormatException
编译异常
编译时异常是编译器要求必须处置的异常
异常处理
两种处理方式
-
try - catch - finally 程序员在代码中捕获异常,自行处理
-
throws 将异常抛出,交给调用者来处理,最顶级处理者JVM
-
运行时异常:如果没有处理,默认throws的方式处理
-
编译时异常:程序必须抛出异常或者处理异常,并且当子类重写父类的方法时,对抛出的异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一样,要么为父类抛出异常的子类型
class Father public void methos() throws RuntimeException class Son extends Father @Override public void methos() throws NullPointerException super.methos();
-
try - catch - finally格式:
try
// 代码可能有异常
// 如果没有出现异常,则执行try块中所有的语句,反之有出现异常,则不再执行try块中剩余的语句
catch()
// 捕获到异常
// 1.当异常发生时,才会执行catch内的代码
// 2.系统将异常封装成Exception对象e,传递给catch
finally
// 不管是否有异常,都会执行
// 注意细节
// 可以有多个catch语句进行捕获不同的异常,要求子类异常在父类异常之前,不然就没有子类异常存在的意义
// 可以进行try-finally配合使用,不进行其他异常捕获(包括throws),不管是否有异常都执行某些语句,然后程序退出
throws 抛出形式:
习题一
当异常处理后需要返回数据,catch和finally中都有return语句,最终返回的数据是finally中的数据
习题二
自定义异常
继承Throwable的子类或者间接子类
运行时异常通常继承RuntimeException;编译时异常通常继承Exception
// 例子
class test
public static void main(String[] args)
int age = 208;
/*
* Exception in thread "main" com.Al_tair.exception_.AgeJudge: 不符合年龄
* at com.Al_tair.exception_.test.main(Exception01.java:71)
*/
if(!(age >= 0 && age <= 140))
throw new AgeJudge("不符合年龄");
class AgeJudge extends RuntimeException
public AgeJudge(String message)
super(message);
throws VS throw
意义 | 位置 | 后面的语句 | |
---|---|---|---|
throws | 异常处理的一种方式 | 方法声明处 | 异常类型 |
throw | 手动生成异常对象的关键字 | 方法体中 | 异常对象 |
相关面试题
1.请说明JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。
Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。用try来指定一块预防所有”异常”的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的”异常”的类型。throw语句用来明确地抛出一个”异常”。throws用来标明一个成员函数可能抛出的各种”异常”。Finally为确保一段代码不管发生什么”异常”都被执行一段代码。可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try语句,”异常“的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种”异常”进行处理,堆栈就会展开,直到遇到有处理这种”异常”的try语句。
以上是关于异常的探讨的主要内容,如果未能解决你的问题,请参考以下文章
python 这意味着无论何时引发未捕获的异常,我都会立即得知发生了什么(完全回溯)。
在模块 ExpoPushTokenManager 上执行导出方法 getDevicePushTokenAsync 时发生异常