异常:所谓异常指的是程序在运行时出现错误时通知调用者的一种机制。
异常分为两大类:受查异常(编译异常)和非受查异常(运行异常)。
一、受查异常(编译异常):
受查异常主要为:Exception(异常类父类)。
常见的受查异常是:找不到类异常、IO 异常等多种。
受查异常必须解决,且需要显示处理。
受查异常处理方式包括:可以向上抛和直接通过try包裹。
二、非受查异常(运行异常):
非受查异常主要为:Error(错误类)、RuntimeException 。
常见的非受查异常是:空指针异常、数组下标越界异常、算数异常等。
非受查异常可以不直接处理,可以 try 或者向上抛。
运行异常不解决的话,会导致程序终止,程序终止会自动调用 printStackTrace() 函数。
try(有可能出现异常的代码块):
1、try 中捕捉到异常会立刻结束 { } 中的代码,进入对应的 catch。
2、try 也可以回收资源:
try (Scanner sc1 = new Scanner(System.in)) {
int num = sc1.nextInt();
System.out.println("num = " + num);
} catch (Exception e) {
e.printStackTrace();
}
catch(异常对象的处理):
1、可以 catch 捕获 Exception类(所有异常的父类),但是非常不推荐。
2、catch 只能处理对应种类的异常。
3、catch 进行类型匹配的时候,不光会匹配相同类型的异常对象,也会捕捉目标异常类的子类对象。
4、try 中发生异常后会在 catch 中捕捉对应的异常,如果自己没有捕捉则交给JVM处理(但也会执行finally)。
5、catch 中的异常类型可以用“ | ”隔开。
try{
System.out.printly("这是可能出现异常的代码块")
}catch(Kind1Exception | Kind2Exception | Kind3Exception){
System.out.printly("处理规则")
}finally{
System.out.printly("善后处理")
}
6、printStackTrace() 函数:栈跟踪,查看异常代码调用栈,即打印异常信息(位置和类型)的方法。打印出的信息在控制台不确定。常在catch中调用。
finally(处理善后,可以不加):
1、finally 可以节约资源。
2、finally 不论是否抛出异常、是否catch到异常都会执行,但前面必须由try语句,否则出错。
3、finally 中不要写 return,这会被编译器当作一个警告。因为 finally 执行的时机是方法返回之前(try 或 catch 中的 return 之前),但如果 finally 也有 return,只会执行 finally 中的 return ,不会执行 try 中的 return。
异常向上抛:
向上抛需要抛具体的异常类,最多抛至主函数,此时由JVM处理。
当JVM处理异常时,程序会立即异常终止。
手动抛出异常:
throw new 编译时异常或运行时异常,一般为运行时异常。
class Text{
public static int divide(int x, int y) throws ArithmeticException{
if (y == 0) {
throw new ArithmeticException("抛出除 0 异常");
}
return x / y;
}
public static void main2(String[] args) {
//手动抛出异常
System.out.println(divide(10, 0));
}
}
自定义异常:
继承自 Exception 默认为编译时异常(受查异常)
继承自 RuntimeException 默认为运行时异常(非受查异常)。
//自己创建用户登录
class NameException extends RuntimeException{ //用户名异常类
//RuntimeException是运行时异常,即非受查异常
//受查异常不可以通过编译,必须立刻处理
public NameException (String name){
System.out.println("八嘎!用户名错误!");
}
}
class PasswordException extends RuntimeException{ //密码异常类
public PasswordException (String password){
System.out.println("八嘎!密码错误!");
}
}
class Text{
private static final String name = "zhouzhou"; //真正用户名
private static final String password = "gugaguga24678"; //真正密码
public static void login(String name, String password){ //静态方法调用异常类
if (!GaGa7.name.equals(name)){
throw new NameException(name);
}
if (!GaGa7.name.equals(password)) {
throw new PasswordException(password);
}
}
public static void main(String[] args) { //主方法执行
//手动自定义登录的异常
try{
login("zhouzhou","gugaguga真呀真多呀");
}catch(NameException e){
e.printStackTrace();
}catch(PasswordException e){
e.printStackTrace();
}finally{
System.out.println("finally已执行。");
}
}
}
受查异常(编译异常)和非受查异常(运行异常)最好 try ,越早解决越好。
(文章参考:周周 嘿嘿:异常类型学习)
本文介绍了Java中的异常处理机制,包括受查异常(编译异常)和非受查异常(运行异常)。受查异常如IOException必须处理,可通过try-catch或向上抛出。非受查异常如NullPointerException可不处理,但可能导致程序终止。try-catch-finally语句用于捕获和处理异常,finally块确保资源释放。异常向上抛至主函数由JVM处理,也可手动throw异常。自定义异常可继承Exception或RuntimeException来创建编译时或运行时异常。
586

被折叠的 条评论
为什么被折叠?



