Java 未检查的异常处理与已检查的异常处理
为什么Java 未检查的异常处理与已检查的异常处理,java,exception-handling,Java,Exception Handling,为什么NoSuchElementFoundExceptionaRuntimeExceptionaka unchecked错误?我有未检查的错误是程序员的错误,所以如果用户正在输入一个要读取的文件,并且该文件存在但为空,该怎么办。这不是程序员的错,那有什么意义呢?我认为这里的“错”一词有点误导 检查异常通常是程序应该捕获并适当处理的异常,而未检查异常通常是程序应该防止的异常。如果一个方法包含一行throw new NoSuchElementException(),这意味着该行不应该被访问,如果它被
NoSuchElementFoundException
aRuntimeException
aka unchecked错误?我有未检查的错误是程序员的错误,所以如果用户正在输入一个要读取的文件,并且该文件存在但为空,该怎么办。这不是程序员的错,那有什么意义呢?我认为这里的“错”一词有点误导
检查异常通常是程序应该捕获并适当处理的异常,而未检查异常通常是程序应该防止的异常。如果一个方法包含一行throw new NoSuchElementException()
,这意味着该行不应该被访问,如果它被访问,这可能意味着某个调用方法中存在错误
在java.util.Scanner
的情况下,我想这就是您的想法,当您调用例如nextLong()
并且文件为空时,它抛出NoSuchElementException
的原因是您应该调用hasNextLong()
来事先检查这是否安全。您不会首先调用hasNextLong()
的唯一原因是,如果您确实希望long出现(例如,如果您正在读取与程序捆绑在一起的配置文件)
为什么NoTouchElementFoundException是RuntimeException,又称未检查错误
因为它就是这样设计的
我检查了错误,程序员的错误是对的
一般来说,这是正确的。但更准确的描述是,选中的异常是您希望能够从最终用户恢复和/或向最终用户报告的异常
。。。那么,如果用户正在输入一个要读取的文件,而该文件存在但为空,该怎么办呢。这不是程序员的错,那有什么意义呢
在这种情况下,这是“程序员的错误”,因为他可以(也可能应该)在调用next*
方法之前使用has*
方法测试条件
但这有点离题了…你从哪里知道运行时错误或未检查的异常是程序员的错?有一些方法可以在获取元素之前检查元素是否存在,所以在某种意义上这是程序员的错。程序员的错只是缺少正确的防御代码。在这个问题的上下文中,在调用next()之前使用hasNext()进行检查是正确的方法。大多数情况下,您可以不调用hasNext()(例如,如果您正在进行线性搜索,并且很早就找到了元素),但有时它会反过来攻击您。