1、什么是异常
异常是指中断程序正常执行的一个不确定的事件。当异常发生时,程序的正常执行流程就会被打断。一般情况下,程序都会有很多条语句,如果没有异常处理机制,前面的语句一旦出现了异常,后面的语句就没办法继续执行了。”
“有了异常处理机制后,程序在发生异常的时候就不会中断,我们可以对异常进行捕获,然后改变程序执行的流程。”
2、什么是运行是异常
UnChecked异常:运行时异常,运行之后才可能能抛出的异常
3、如何处理异常
(1) 用 try 、catch 、finally 来捕获和处理异常
try 块中包含可能会抛出异常的代码。
catch 块用于捕获并处理指定类型的异常
finally 块中的代码无论是否发生异常都会被执行,用于释放资源或清理操作
(2)使用 throw、throws 来抛出异常
throw关键字手动抛出异常对象。
throws 关键字用于在方法声明中指定可能抛出的异常类型,表示该方法可能会抛出该类型的异常,由调用者处理
public void divideZero(){
try{
System.out.println(1/0); // 抛出除0异常
}catch(ArithmeticException e){
// 在 catch 里捕获异常,
// 注意,异常一旦被捕获,就相当于没有异常了,因此程序可以继续向
后运行
}
}
try with resource
4、checked和unchecked异常
checked 异常(检查型异常)在源代码里必须显式地捕获或者抛出,否则编译器会提示你进行相应的操作;而 unchecked 异常(非检查型异常)就是所谓的运行时异常,通常是可以通过编码进行规避的,并不需要显式地捕获或者抛出。
5、构造方法可以用throws抛异常吗,用和不用的区别
6、 throw 和 throws的区别
1)throws 关键字用于声明异常,它的作用和 try-catch 相似;而 throw 关键字用于显式的抛出异常。
2)throws 关键字后面跟的是异常的名字;而 throw 关键字后面跟的是异常的对象。
3)throws 关键字出现在方法签名上,而 throw 关键字出现在方法体里。
4)throws 关键字在声明异常的时候可以跟多个,用逗号隔开;而 throw 关键字每次只能抛出一个异常。
7、可以抛error吗
Error 的出现,意味着程序出现了严重的问题,而这些问题不应该再交给 Java 的异常处理机制来处理,程序应该直接崩溃掉,比如说 OutOfMemoryError,内存溢出了,这就意味着程序在运行时申请的内存大于系统能够提供的内存,导致出现的错误,这种错误的出现,对于程序来说是致命的。
Exception 的出现,意味着程序出现了一些在可控范围内的问题,我们应当采取措施进行挽救。
比如说之前提到的 ArithmeticException,很明显是因为除数出现了 0 的情况,我们可以选择捕获异常,然后提示用户不应该进行除 0 操作,当然了,更好的做法是直接对除数进行判断,如果是 0 就不进行除法运算,而是告诉用户换一个非 0 的数进行运算
8、try --catch --finally 语句中都可以用 return 为什么只输出 finally里的
public class TryDemo {
public static void main(String[] args) {
System.out.println(test1());
}
public static int test1() {
try {
return 2;
} finally {
return 3;
}
}
}
执行结果:3。
try 返回前先执行 finally,结果 finally 里不按套路出牌,直接 return 了,自然也就走不到 try 里面的 return 了。
(2)
public class TryDemo {
public static void main(String[] args) {
System.out.println(test());
}
public static int test() {
try {
return 1;
} catch (Exception e) {
return 2;
} finally {
System.out.print("3");
}
}
}
执行结果:31。
try、catch。finally 的基础用法,在 return 前会先执行 finally 语句块,所以是先输出 finally 里的 3,再输出 return 的 1。
(3)
public class TryDemo {
public static void main(String[] args) {
System.out.println(test1());
}
public static int test1() {
int i = 0;
try {
i = 2;
return i;
} finally {
i = 3;
}
}
}
执行结果:2。
大家可能会以为结果应该是 3,因为在 return 前会执行 finally,而 i 在 finally 中被修改为 3 了,那最终返回 i 不是应该为 3 吗?
但其实,在执行 finally 之前,JVM 会先将 i 的结果暂存起来,然后 finally 执行完毕后,会返回之前暂存的结果,而不是返回 i,所以即使 i 已经被修改为 3,最终返回的还是之前暂存起来的结果 2。
9、为什么自定义异常
为什么要自定义异常:
Java已经预见了很多异常,每个异常都用一个类来表示。 但是如果java提供的异常类不能满足你的需要时,你可以自己定义异常,来满足 你的需要。 项目开发中,通常因业务的需要自定义相应的异常,自定义异常使得异常信息更 精准。
10、如何自定义异常
自定义异常步骤:
第一步:自定义编译时异常继承Exception,自定义运行时异常继承 RuntimeException
第二步:通过构造函数将异常描述信息传递给异常父类
第三步:使用throw抛出异常对象
第四步:处理异常
// 自定义异常
class MyException extends Exception{
public MyException(String message){
// 通过构造函数将异常描述信息传递给异常父类
super(message);
}
}
public class UserController {
public static void main(String[] args) throws MyException
{
int i=1 ,j = 0;
if(j ==0){
// 将自定义异常抛给虚拟机,让虚拟机去处理
throw new MyException("除数不能为0");
}
System.out.println("i / j = "+ i/j);
}
}
11、NoClassDefFoundError 和 ClassNotFoundException 有什么区别?
它们都是由于系统运行时找不到要加载的类导致的,但是触发的原因不一样。
- NoClassDefFoundError:程序在编译时可以找到所依赖的类,但是在运行时找不到指定的类文件,导致抛出该错误;原因可能是 jar 包缺失或者调用了初始化失败的类。
- ClassNotFoundException:当动态加载 Class 对象的时候找不到对应的类时抛出该异常;原因可能是要加载的类不存在或者类名写错了。
其次,像 IOException、ClassNotFoundException、SQLException 都属于 checked 异常;像 RuntimeException 以及子类 ArithmeticException、ClassCastException、ArrayIndexOutOfBoundsException、NullPointerException,都属于 unchecked 异常。
unchecked 异常可以不在程序中显示处理,就像之前提到的 ArithmeticException 就是的;但 checked 异常必须显式处理。
12、方法结束运行的三种情况
方法中的代码执行完毕时,方法结束运行
方法中执行return语句后,方法结束运行
方法中抛出异常后,方法结束运行
ava 的异常处理是一种重要的机制,可以帮助我们处理程序执行期间发生的错误❎或异常。
异常分为两类:Checked Exception 和 Unchecked Exception,其中 Checked Exception 需要在代码中显式地处理或声明抛出,而 Unchecked Exception 不需要在代码中显式地处理或声明抛出。异常处理通常使用 try-catch-finally 块来处理,也可以使用 throws 关键字将异常抛出给调用者处理。
下面是 Java 异常处理的一些总结:
- 使用 try-catch 块捕获并处理异常,可以避免程序因异常而崩溃。
- 可以使用多个 catch 块来捕获不同类型的异常,并进行不同的处理。
- 可以使用 finally 块来执行一些必要的清理工作,无论是否发生异常都会执行。
- 可以使用 throw 关键字手动抛出异常,用于在程序中明确指定某些异常情况。
- 可以使用 throws 关键字将异常抛出给调用者处理,用于在方法签名中声明可能会出现的异常。
- Checked Exception 通常是由于外部因素导致的问题,需要在代码中显式地处理或声明抛出。
- Unchecked Exception 通常是由于程序内部逻辑或数据异常导致的,可以不处理或者在需要时进行处理。
- 在处理异常时,应该根据具体的异常类型进行处理,例如可以尝试重新打开文件、重新建立网络连接等操作。
- 异常处理应该根据具体的业务需求和设计原则进行,避免过度捕获和处理异常,从而降低程序的性能和可维护性。