关于异常的相关问题

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 通常是由于程序内部逻辑或数据异常导致的,可以不处理或者在需要时进行处理。
  • 在处理异常时,应该根据具体的异常类型进行处理,例如可以尝试重新打开文件、重新建立网络连接等操作。
  • 异常处理应该根据具体的业务需求和设计原则进行,避免过度捕获和处理异常,从而降低程序的性能和可维护性。

猜你喜欢

转载自blog.csdn.net/pachupingminku/article/details/132588906
今日推荐