【问题标题】:Types of Exception in JavaJava中的异常类型
【发布时间】:2015-09-24 10:33:58
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • “在许多著名的教程网站上,我看到 java 中有两种类型的异常 1)编译时异常 2)运行时异常”。有哪些著名的教程?您确定他们不是在谈论已检查和未检查的异常吗?
  • 1) 不存在编译时异常。您的代码没有运行,因此不会有异常。这是一个编译器错误。 2)Java中有两种异常类型:checkedunchecked

标签: java exception checked-exceptions


【解决方案1】:

Java 中有 3 种类型的 Throwables。

  • 检查了Exceptions(Exception 和整个链条,除了RuntimeException)。这些由编译器检查,并且在抛出时必须被捕获。它们代表通常可以恢复的异常情况,例如在文件系统上找不到引用的文件时(请参阅FileNotFoundException)。
  • 未选中或运行时Exceptions(RuntimeException 的子代)。这些可以扔而不会被抓住。它们通常表示编程错误,例如在 null 对象上调用方法(请参阅 NullPointerException)。
  • Errors。这些也是未经检查的。当发生非常错误的事情时,它们会被 JVM 抛出,通常超出开发人员的直接控制(例如内存不足,请参阅 OutOfMemoryError)。当您的代码由于各种原因(例如语法错误、不明确的调用、未能捕获已检查的Exception 等)而无法编译时,Java 编译器会发出编译器错误。

【讨论】:

    【解决方案2】:

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

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

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


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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        您还发现以下讨论很有用 Differences between Exception and Error

        【讨论】:

          【解决方案5】:

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

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

          如果您在运行程序时遇到此问题,则它们是异常。 Java Exception,如文档中所定义,是在程序执行过程中发生的异常事件,会破坏程序的正常流程

          【讨论】:

            【解决方案6】:

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

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

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

            【讨论】:

              【解决方案7】:

              java中有两种异常。

              Checked Exception 
              Unchecked Exception 
              

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

              "所以你可以调用检查异常是编译时异常"

              现在未经检查的异常:在未经检查的异常中,程序员可以编写代码以避免未经检查的异常。程序员无法得到编译异常。

              "你可以调用 unchecked exception 是运行时异常"

              检查异常列表:

               ClassNotFoundException
               EOFException
               IllegalAccessException...etc
              

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

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

              未经检查的异常列表

               ArithmeticException  
               NullPointerException
               ArrayIndexOutOfBound...etc 
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-03-08
                • 2016-01-08
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-06-28
                相关资源
                最近更新 更多