java中异常报错如图:
main:表示main方法线程;
java.util.InputMismatchException:表示打印当前异常类型;
下面为可能出错行数,有些还有原因:by:***
java中提供了异常解决机制,帮助处理异常情况:
异常解决办法:
第一种:try catch(try catch finally)
异常解决结构:
try{
//可能出现异常的代码段
}catch(匹配的异常){
解决办法//执行的代码段
}
异常解决执行过程:
1、先执行try块,如果出现异常,匹配catch中的异常
2、如果匹配到了,那么执行catch块中的内容
3、catch中执行之后 程序继续向下运行
4、如果catch中匹配失败了,那么相当于程序没有当前异常的解决手段,jvm会帮助我们解决该异常
try-catch异常解决中的注意点:
1、能够捕获的异常太少了,如果存在大量异常那么还是jvm在解决
2、catch块中可以通过编写父类 Exception 来捕获try块中的所有异常,但是处理方式过于单一,不推荐使用。
try{
//可能出现异常的代码段
}catch(匹配的异常){
解决办法
//执行的代码段
}catch(匹配的异常){
解决办法
//执行的代码段
}catch(匹配的异常){
解决办法
//执行的代码段
}
执行顺序:
1、执行try块中的内容 如果有异常
2、匹配下面所有catch块 如果匹配到 执行对应catch中的 内容跳过整个try-catch,执行后续代码
3、如果没有对应的catch匹配, jvm处理该异常
注意事项:
1、一般情况下 我们会在多重catch中最后添加一个Exception,拍捕获未知异常,统一处理
2、Exception捕获应该放到catch最后,因为异常会从第一个catch开始匹配,如果第一个是Exception,那么会导致
Exception捕获所有异常,因为Exception是所有异常的父类
try{
//可能出现异常的代码段
}catch(匹配的异常){
解决办法
//执行的代码段
}catch(匹配的异常){
解决办法
//执行的代码段
}catch(匹配的异常){
解决办法
//执行的代码段
。。。。。
}finally{
//执行代码
}
执行顺序
1、执行try块中的内容 如果有异常
2、匹配下面所有catch块 如果匹配到 执行对应catch中的 内容跳过整个try-catch,执行后续代码
3、如果没有对应的catch匹配, jvm处理该异常
4、执行完整个try-catch 最后都会执行finally
注意事项
1、finally最后肯定会被执行
2、return不能阻止finally执行 先执行finally再执行return
3、如果要强制不执行finally,通过System.exit(0或者是一个非0的数); 0 代表正常退出 非0 非正常退出
第二种:throws (throw)
throws: 抛 出很多
抛出异常,不解决。 解决异常的一种方式,听天由命 统一交由jvm解决
在方法的形参列表之后 通过 throws 对外抛出异常,这个异常可以是一个 也可以很多。
throws 抛出运行时异常时 调用该方法是 可以不对抛出的异常进行处理,因为运行时异常只有程序执行期间才能捕获
在方法后添加throws关键词 用来向上抛出异常信息:
运行时异常:
调用异常方法时 不会报错 ,所以很难判定是否存在异常。
检查时异常:
程序调用时会报错:
解决方案:
1、继续向上抛 简单 但是不能解决问题
2、手动try-catch 复杂 但是用户体验度好 能精准定位到问题出错的地方
throw:
定义在方法里面 和throws一起使用
不要将throw产生的异常 try-catch
很多时候。jdk提供的异常都不满足场景需要,所以需要自己创建一个自定义异常:
自定义异常:
1、让当前类继承 Exception
2、编写空构造器以及带参构造显示的调用父类中的空构造和带参构造
程序异常:所有的异常类都是java.lang.Exception的子类;
java.util.InputMismatchException:由Scanner抛出,表明获取的标记与期望类型的模式不相匹配,或者该标记超出期望类型的范围。
java.lang.IllegalStateExceptiom:在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。
java.lang.ArithmeticException:当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。
java.lang.NullPointerException:当应用程序试图在需要对象的地方使用 null
时,抛出该异常。这种情况包括:
调用 null
对象的实例方法。
访问或修改 null
对象的字段。
将 null
作为一个数组,获得其长度。
将 null
作为一个数组,访问或修改其时间片。
将 null
作为 Throwable
值抛出。
java.lang.ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出该异常。例如,以下代码将生成一个 ClassCastException
:
Object x = new Integer(0); System.out.println((String)x);