3

我对 Java 中的异常类型感到困惑。在许多教程网站上,我看到 java 中有两种类型的异常

  1. 编译时异常
  2. 运行时异常

但是当我和一些java高手交谈时,据他们说没有编译时异常之类的东西。他们说这是编译时错误而不是异常,而且我在Java 文档中没有发现任何关于编译时异常的信息。但是当我运行以下程序时

File f = new File("C:/Documents and Settings/satyajeet/Desktop/satya.txt");
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);
String s = br.readLine();
System.out.println(s);

如果未提供 try catch,我得到以下输出。

D:\jdk1.6.0_19\bin>javac Testing.java
Testing.java:7: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown
     FileReader fr=new FileReader(f);
                   ^
Testing.java:9: unreported exception java.io.IOException; must be caught or declared to be thrown
      String s=br.readLine();
                          ^
2 errors

那么我应该考虑这个错误还是编译时异常?

4

7 回答 7

7

Java 中有 3 种Throwable类型。

  • 检查Exceptions (Exception并沿着链向下,保存RuntimeException)。这些由编译器检查,并且在抛出时必须被捕获。它们代表通常可以恢复的异常情况,例如,当文件系统上找不到引用的文件时(请参阅 参考资料FileNotFoundException)。
  • 未选中或 runtime Exceptions(的子级RuntimeException)。这些可以扔而不会被抓住。它们通常表示编程错误,例如在null对象上调用方法(请参阅 参考资料NullPointerException)。
  • Errors. 这些也是未经检查的。当发生非常错误的事情时,JVM 会抛出它们,通常超出开发人员的直接控制范围(例如内存不足,请参阅 参考资料OutOfMemoryError)。当您的代码编译失败时,Java 编译器会发出编译器错误,原因有多种,例如语法错误、不明确的调用、未能捕捉到 checkedException等。
于 2015-09-24T10:43:31.900 回答
4

任何说不应该阅读的“著名网站”。这是垃圾。没有“编译时异常”之类的东西。与您交谈的 Java 极客是正确的1

实际上,您可能误读或误解了您在那些“著名网站”上阅读的内容。有“编译时错误”和“运行时异常”。

在您的示例中,您所拥有的是一些编译时错误消息,这是由于您的代码中的错误造成的。错误在那里是因为您的代码没有正确处理异常,但它们仍然是错误。并且它们在编译时被 Java 编译器检测到。


1 ...也许是时候停止为他们使用“极客”之类的半贬义标签了。听起来他们应该得到一些尊重。

于 2015-09-24T10:38:42.677 回答
1

没有“编译时异常”之类的东西。异常只在运行时发生(它们可以被选中或取消选中——你可能想查一下)。

你所拥有的只是一个编译错误。您的代码甚至不是有效的 Java。

顺便说一句,大多数教程都是垃圾。使用信誉良好的资源,例如 Oracle 教程。或者一本好书。

于 2015-09-24T10:38:44.097 回答
1

它们不是编译时异常。正如上面的评论所提到的。

请在下面找到有关异常的 javdocs 并链接到有关已检查和未检查异常的信息。 https://docs.oracle.com/javase/tutorial/essential/exceptions/ http://www.geeksforgeeks.org/checked-vs-unchecked-exceptions-in-java/

您还发现下面的讨论很有用 异常和错误之间的区别

于 2015-09-24T10:47:52.650 回答
1

如果你在编译过程中得到这个,那么这两个是编译错误。编译错误基本上是java编译器报的问题。编译错误可能包括:

  1. 语法错误
  2. 类路径相关错误
  3. try-catch 块相关错误(您报告的错误)

如果你在运行程序时得到了这个,它们就是例外。文档中定义的Java Exception是在程序执行过程中发生的异常事件,它破坏了程序的正常流程

于 2015-09-24T10:48:05.347 回答
1

您发布的javac.exe的输出是与您正在开发的软件不同的软件的错误。

这意味着您的代码不会向 Java 代码范例抱怨:实际上,您并没有检查已检查的异常。

您的代码没有抛出任何异常或错误,它根本不存在。

于 2015-09-24T10:48:26.477 回答
0

java中有两种类型的异常。

Checked Exception 
Unchecked Exception 

Checked:异常必须由程序员处理,否则程序会抛出编译错误。

所以你可以称检查异常是编译时异常

现在 Unchecked Exception :在 unchecked 异常中,程序员可以以这样的方式编写代码来避免 unchecked 异常。程序员无法获得编译异常。

你可以称未经检查的异常是运行时异常

已检查异常列表:

 ClassNotFoundException
 EOFException
 IllegalAccessException...etc

如果方法应该抛出一个检查异常,那么它应该由

try{}catch(Exception ex ){} Or you can use the throws keyword.

未经检查的异常列表

 ArithmeticException  
 NullPointerException
 ArrayIndexOutOfBound...etc 
于 2015-10-07T20:13:01.277 回答