Java 未检查的异常处理与已检查的异常处理

Java 未检查的异常处理与已检查的异常处理,java,exception-handling,Java,Exception Handling,为什么NoSuchElementFoundExceptionaRuntimeExceptionaka unchecked错误?我有未检查的错误是程序员的错误,所以如果用户正在输入一个要读取的文件,并且该文件存在但为空,该怎么办。这不是程序员的错,那有什么意义呢?我认为这里的“错”一词有点误导 检查异常通常是程序应该捕获并适当处理的异常,而未检查异常通常是程序应该防止的异常。如果一个方法包含一行throw new NoSuchElementException(),这意味着该行不应该被访问,如果它被

为什么
NoSuchElementFoundException
a
RuntimeException
aka unchecked错误?我有未检查的错误是程序员的错误,所以如果用户正在输入一个要读取的文件,并且该文件存在但为空,该怎么办。这不是程序员的错,那有什么意义呢?

我认为这里的“错”一词有点误导

检查异常通常是程序应该捕获并适当处理的异常,而未检查异常通常是程序应该防止的异常。如果一个方法包含一行
throw new NoSuchElementException()
,这意味着该行不应该被访问,如果它被访问,这可能意味着某个调用方法中存在错误

java.util.Scanner
的情况下,我想这就是您的想法,当您调用例如
nextLong()
并且文件为空时,它抛出
NoSuchElementException
的原因是您应该调用
hasNextLong()
来事先检查这是否安全。您不会首先调用
hasNextLong()
的唯一原因是,如果您确实希望long出现(例如,如果您正在读取与程序捆绑在一起的配置文件)

为什么NoTouchElementFoundException是RuntimeException,又称未检查错误

因为它就是这样设计的

我检查了错误,程序员的错误是对的

一般来说,这是正确的。但更准确的描述是,选中的异常是您希望能够从最终用户恢复和/或向最终用户报告的异常

。。。那么,如果用户正在输入一个要读取的文件,而该文件存在但为空,该怎么办呢。这不是程序员的错,那有什么意义呢

在这种情况下,这是“程序员的错误”,因为他可以(也可能应该)在调用
next*
方法之前使用
has*
方法测试条件


但这有点离题了…

你从哪里知道运行时错误或未检查的异常是程序员的错?有一些方法可以在获取元素之前检查元素是否存在,所以在某种意义上这是程序员的错。程序员的错只是缺少正确的防御代码。在这个问题的上下文中,在调用next()之前使用hasNext()进行检查是正确的方法。大多数情况下,您可以不调用hasNext()(例如,如果您正在进行线性搜索,并且很早就找到了元素),但有时它会反过来攻击您。