我很难理解如何处理未经检查的异常.
如果方法没有声明异常并且我没有被强制处理它,我怎么知道该方法抛出异常?
未经检查的异常是针对编程错误的,正如我已经阅读过的,所以为了避免a NullPointerException,我会引入一个空检查.或者ArrayIndexOutOfBoundsException我会检查我如何访问数组.
但是当我不知道一个方法抛出一个自定义的未经检查的异常时,我该如何处理呢?
那么如何将异常从数据层传播到用户界面?那些必须检查例外,对吗?
我会让数据层抛出检查DataLayerExceptions然后在presenter类中有一个try-catch-block(假设我正在使用MVP)然后在catch-block中设置视图上的错误消息...
或者可以使用未经检查的例外来完成吗?
编辑
感谢到目前为止的回复.
这是我面临的一个具体例子.
我开始使用Spring,在一本书中我看到了一个UserRepository使用a JDBCTemplate从数据库中检索数据的类.在UserRepositoty一定程度上包含了这样的方法:
@Override
public List<User> findAll() {
String sql = "select id, username, email, password from p_user";
return new ArrayList<>(jdbcTemplate.query(sql, rowMapper));
}
Run Code Online (Sandbox Code Playgroud)
现在,jdbcTemplate的查询方法抛出a DataAccessException,这是一个运行时异常.
我知道这个,因为我查看了方法签名.
现在,我将如何处理此异常?当然,用户需要某种类型的反馈,以防出现问题.当然,我会记录异常.
但是我会在哪里捕获这个例外?
我应该在那里抓住它,然后重新抛出我自己的未经检查的异常吗?或者我应该DataAccessException在findAll方法上声明一个抛出然后处理调用类中的异常(可能是某种服务或演示者)?
或者我应该确保抛出异常的条件永远不会发生(如果那些甚至可以被我控制)?
我正在使用SonarQube,它显示以下错误:
Public methods should throw at most one checked exception.
// Noncompliant
public void delete() throws IOException, SQLException { /* ... */ }
// Compliant
public void delete() throws SomeApplicationLevelException { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
这是否意味着,SomeApplicationLevelException是一个父类,IOException并且SQALException是从它派生出来的?我们应该抛出父类异常?从而坚持只抛出1个检查异常的方法?
因为我有2个例外,我已经定义了例如说Exception1和Exception2扩展Exception.我的方法说,sampleMethod()抛出它们,即
public void sampleMethod() throws Exception1, Exception2 {
}
Run Code Online (Sandbox Code Playgroud)
这里显示错误.所以我应该有一个类作为父(说MainException),并获得Exception1和Exception2从它扔父异常类?如下所示:
public void sampleMethod() throws MainException {
}
Run Code Online (Sandbox Code Playgroud)
以上解决方案是否合适?
当我们在 Java 中调用抛出异常的方法时,我们如何处理这个问题?
我的代码在 kotlin 中,我使用的是用 Java 编写的第 3 方库。我调用了这个库的一个方法,在某些情况下它会抛出一些自定义异常。现在 kotlin 不强制我处理这个异常,在这种情况下应用程序会崩溃。处理这个问题的最佳方法是什么?
我发现Java的反射API是异常冗长的,我经常想要捕获每个特定的异常,但只是抛出异常.这是不好的做法,还是你真的把所有这些例外都抛在了方法签名上?然后,调用该方法的每个方法都必须以某种方式处理每个特定的异常.相反,我正在考虑这样做:
public void someMethod()
throws Exception {
try {
// do a bunch of reflection...
} catch(ClassCastException classCastException) {
throw new Exception("Some specific message.", classCastException);
} catch(InvocationTargetException invocationTargetException) {
throw new Exception("Some specific message.", invocationTargetException);
}
}
Run Code Online (Sandbox Code Playgroud)
这种做法很糟糕吗?
以下代码_从文件夹中的 png 文件中删除该字符:
use std::fs;
use std::path::Path;
fn main() {
let dir = Path::new("/home/alex/Desktop");
for entry in fs::read_dir(dir).unwrap() {
let entry = entry.unwrap();
let path = entry.path();
if path.is_file() && path.extension().unwrap() == "png" {
let new_path = path.with_file_name(path.file_name().unwrap().to_str().unwrap().replace("_",""));
fs::rename(path, new_path).unwrap();
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,unwrap()它被大量使用。可以在这段代码中删除它们,并使用更干净的方法吗?
我有一个DBconnector类,我写过.这是使用它具有的插入查询方法的实例.暂时忽略查询:
ResultSet NewCustomer = db.executeInsert("SELECT s Bookings VALUES (surnameOut,'Nilsen', 'Johan', 'Bakken 2', 'Stavanger')");
Run Code Online (Sandbox Code Playgroud)
目前上面的行正在获得"未处理的异常类型SQLException"错误.它建议我用try/catch语句包围上面的内容,或者给出保持代码抛出异常的方法.我希望有一些方法可以在DBconnector类中对它进行排序,这样我就可以维护很小的单行来执行SQL查询.这可能吗?
以下是方法executeInsert方法的代码:
public ResultSet executeInsert(String query)throws SQLException {
Statement s = null;
ResultSet rs = null;
try{
s = con.createStatement();
s.executeQuery(query);
rs = s.getResultSet();
}
catch(SQLException e){}
return rs;
}
Run Code Online (Sandbox Code Playgroud)