Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为API添加所有可用的异常,以针对不同的异常执行不同的操作_Java_Xml_File_Exception_Exception Handling - Fatal编程技术网

Java 如何为API添加所有可用的异常,以针对不同的异常执行不同的操作

Java 如何为API添加所有可用的异常,以针对不同的异常执行不同的操作,java,xml,file,exception,exception-handling,Java,Xml,File,Exception,Exception Handling,例如,假设我们要从XML文件读取数据,然后读取txt文件。我如何知道这些操作的所有可能异常,然后将它们添加到catch子句中,以便我的程序永远不会意外中断? 一般情况下情况如何 编辑(对复制的响应): 我想知道一个操作的每个异常是什么,而不是捕获异常,这样我可以对每个异常做出不同的反应。有很多方法来处理这个问题。根据您的代码要求,您需要考虑如何处理不同的异常。下面的代码显示了如何分离特定类型的异常,并在最后捕获剩余的异常 try { // your code here that may

例如,假设我们要从XML文件读取数据,然后读取txt文件。我如何知道这些操作的所有可能异常,然后将它们添加到catch子句中,以便我的程序永远不会意外中断? 一般情况下情况如何

编辑(对复制的响应)
我想知道一个操作的每个异常是什么,而不是捕获异常,这样我可以对每个异常做出不同的反应。

有很多方法来处理这个问题。根据您的代码要求,您需要考虑如何处理不同的异常。下面的代码显示了如何分离特定类型的异常,并在最后捕获剩余的异常

try {
    // your code here that may throw lots of different exceptions
} catch (AType1Exception ex) {
   // handle the AType1Exception specific exception here
} catch (AType2Exception ex) {
   // handle the AType2Exception specific exception here
} catch (Exception ex) {
   // handle all other exceptions here
}
如果您不需要处理特定类型的异常,只需要为所有可以使用的异常提供一个通用处理程序

try {
    // your code here that may throw lots of different exceptions
} catch (Exception ex) {
   // handle all exceptions here
}

关于这个问题有很多文档参考,更多信息在这个链接中

哈哈,我能想到的唯一可能的解决方案是捕获可丢弃的,然后与java中定义的每种类型的异常(已检查和运行时)和错误进行比较


它只会丢失您自己的可丢弃对象。

首先要做的是查找用于读取文本和XML文件的API文档。Javadoc是JavaAPI的文档,它将自动记录方法声明的所有异常。在大多数情况下,捕捉这些异常就足够了。另外,请确保所有方法参数都正确,以便方法不会意外抛出
NullPointerException
IllegalArgumentException
,或类似事件

如果您不知道已检查和未检查的异常,请立即阅读(例如)。简而言之,如果不在
throws
子句中声明,方法就不能抛出已检查的异常,并且方法调用方必须捕获并处理异常,或者声明它抛出异常。只有扩展了
RuntimeException
的异常才能由没有
throws
子句的方法抛出,尽管有时程序员也会声明和/或记录这些异常

确保您了解不同类型的异常。任何可丢弃的内容都扩展了可丢弃的
(请参阅)<代码>错误
异常
扩展可丢弃
Error
Throwable通常是您无法处理的内容,例如
OutOfMemoryError
,因此通常可以安全地忽略这些内容<代码>例外情况是您关心的问题<代码>运行时异常扩展了
异常
,并且运行时异常被取消选中。扩展
异常的任何其他内容都将选中

IO操作通常抛出
IOException
FileNotFoundException
SecurityException
<选中code>IOException
,由于
FileNotFoundException
扩展了
IOException
,因此也会选中它(仅捕获
IOException
将处理这两个问题)。它们可以单独处理,但在
IOException
之前需要捕获
FileNotFoundException
SecurityException
未选中,除非代码在JVM中运行,使用安全管理器限制程序(被文件权限拒绝的访问可能引发
IOException

如果您不确定代码是否捕获了所有异常并正确处理了它们,那么您可以始终捕获异常并处理它。或者,您可以捕获可丢弃的
,但是您可能会忽略程序无法处理的错误,并导致程序崩溃。如果您确实捕获了Trowable,最好使用它捕获详细信息并优雅地崩溃,例如日志记录或GUI应用程序试图在从屏幕消失之前显示错误

最后,制定处理异常的计划。我经常看到的一个错误是捕获异常、打印和出错,然后由于IO资源未初始化而崩溃。如果该方法无法完全恢复或正常崩溃,则让它抛出异常。不要忘记,您可以将信息附加到异常并使用异常链接,以便被调用方可以打印更有意义的错误

例如,假设您的程序可以读取一些设置文件并逐行处理。下面的方法假定参数已被选中,
fileName
,不过您应该显式地检查
public
方法上的参数,并相应地抛出
NullPointerException
IllegalArgumentException

/**
 * Read a settings file and configure this object.
 * 
 * @param fileName Name of the file. Must not be <code>null</code>
 *   or empty.
 * 
 * @throws IOException If an IO error occurs while opening or
 *   reading the file.
 * @throws SecurityException If a security manager exists and its
 *   <code>checkRead()</code> method denies read access to the file.
 */
private void loadSettingsFile(String fileName)
        throws IOException, SecurityException {

    String line;  // Line read from file

    // Read file
    try (BufferedReader reader = new BufferedReader(new FileReader(new File(fileName)))) {

        while ((line = reader.readLine()) != null) {
            line = line.trim();

            // Do something with line
        }

    } catch (IOException ex) {
        throw new IOException("IO error reading settings file: " + ex.getMessage(), ex);

    } catch (SecurityException ex) {
        throw new SecurityException("Security error reading settings file: " + ex.getMessage(), ex);

    } catch (Exception ex) {
        throw new IOException(String.format("Unknown error reading settings file: %s: %s", fileName, ex.getMessage()), ex);
    }

    return;
}
在本例中,捕获了
SecurityException
IOException
(也捕获了
FileNotFoundException
),并生成了一个具有其他信息的相同类型的新异常,例如抛出异常时程序正在执行的操作。在新异常(构造函数的第二个参数)中包含原始异常将保留完整的堆栈跟踪(这是异常链接)。我知道当在这个代码中抛出
IOException
SecurityException
时,会包含文件名;我不需要再次将其添加到异常中。当抛出其他异常时,它可能不会被包括在内,所以我在捕获
异常时会显式地这样做

请注意,
FileReader()
既不声明也不记录
SecurityException
,但它会抛出它(在OpenJDK 1.7.091中验证)。这又回到了您关于如何捕获所有异常的问题。有时它们没有被记录下来,你不得不猜测