Checked vs Unchecked Exceptions in Java

本文深入解析了Java中检查异常与未检查异常的概念,通过具体实例展示了如何处理这两种类型的异常,并讨论了它们在实际开发中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单说Checked就是在compile阶段会检查,必须用try catch或者throws处理,比如FileNotFoundException

Unchecked就是compile阶段不会检查,比如ArithmeticException 除法(除以0)



In Java, there two types of exceptions:

1) Checked:are the exceptions that are checked at compile time. If some code within a method throws a checked exception,then the method must either handle the exception or it must specify the exception usingthrowskeyword.

For example, consider the following Java program that opens file at locatiobn “C:\test\a.txt” and prints first three lines of it. The program doesn’t compile, because the function main() uses FileReader() and FileReader() throws a checked exceptionFileNotFoundException. It also uses readLine() and close() methods, and these methods also throw checked exceptionIOException

import java.io.*;

class Main {
public static void main(String[] args) {
FileReader file = new FileReader("C:\\test\\a.txt");
BufferedReader fileInput = new BufferedReader(file);

// Print first 3 lines of file "C:\test\a.txt"
for (int counter = 0; counter < 3; counter++) 
System.out.println(fileInput.readLine());

fileInput.close();
}
}



Output:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - 
unreported exception java.io.FileNotFoundException; must be caught or declared to be 
thrown
	at Main.main(Main.java:5)

To fix the above program, we either need to specify list of exceptions using throws, or we need to use try-catch block. We have used throws in the below program. SinceFileNotFoundExceptionis a subclass ofIOException, we can just specifyIOExceptionin the throws list and make the above program compiler-error-free.

import java.io.*;
 
class Main {
    public static void main(String[] args) throws IOException {
        FileReader file = new FileReader("C:\\test\\a.txt");
        BufferedReader fileInput = new BufferedReader(file);
         
        // Print first 3 lines of file "C:\test\a.txt"
        for (int counter = 0; counter < 3; counter++) 
            System.out.println(fileInput.readLine());
         
        fileInput.close();
    }
}



Output: First three lines of file “C:\test\a.txt”

2) Uncheckedare the exceptions that are not checked at compiled time. In C++, all exceptions are unchecked, so it is not forced by the compiler to either handle or specify the exception. It is up to the programmers to be civilized, and specify or catch the exceptions.
In Java exceptions underErrorandRuntimeExceptionclasses are unchecked exceptions, everything else under throwable is checked.

                   +-----------+
		   | Throwable |
                   +-----------+
                    /         \
		   /           \
          +-------+          +-----------+
          | Error |          | Exception |
          +-------+          +-----------+
	   /  |  \           / |        \
         \________/	  \______/    	 \
			                +------------------+
	unchecked	 checked	| RuntimeException |
					+------------------+
					  /   |    |      \
					 \_________________/
					   
					   unchecked

Consider the following Java program. It compiles fine, but it throwsArithmeticExceptionwhen run. The compiler allows it to compile, becauseArithmeticExceptionis an unchecked exception.

class Main {
   public static void main(String args[]) {
      int x = 0;
      int y = 10;
      int z = y/x;
  }
}


Output:

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at Main.main(Main.java:5)
Java Result: 1

Why two types?
SeeUnchecked Exceptions — The Controversyfor details.

Should we make our exceptions checked or unchecked?
Following is the bottom line fromJava documents
If a client can reasonably be expected to recover from an exception, make it a checked exception. If a client cannot do anything to recover from the exception, make it an unchecked exception


http://www.geeksforgeeks.org/checked-vs-unchecked-exceptions-in-java/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值