Jam*_*mes 9 java exception-handling
嘿所有,我是Java的新手,想知道我是否定义了一个返回数据库对象的方法
喜欢
import java.sql.*;
public class DbConn {
public Connection getConn() {
Connection conn;
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
if(System.getenv("MY_ENVIRONMENT") == "development") {
String hostname = "localhost";
String username = "root";
String password = "root";
}
conn = DriverManager.getConnection("jdbc:mysql:///mydb", username, password);
return conn;
} catch(Exception e) {
throw new Exception(e.getMessage());
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果连接失败,当我尝试创建它时应该返回什么?eclipse告诉我我必须返回一个Connection对象但是如果它失败了我不知道该怎么做.
谢谢!
更新代码以获得例外气泡:
public class DbConn {
public Connection getConn() throws SQLException {
Connection conn;
String hostname = "localhost";
String username = "root";
String password = "root";
Class.forName("com.mysql.jdbc.Driver").newInstance();
if(System.getenv("MY_ENVIRONMENT") != "development") {
hostname = "localhost";
username = "produser";
password = "prodpass";
}
conn = DriverManager.getConnection("jdbc:mysql:///mydb", username, password);
return conn;
}
}
Run Code Online (Sandbox Code Playgroud)
如果抛出异常,则该方法不返回正常值.通常编译器能够检测到这一点,因此它甚至不会使用"返回必需"样式警告/错误来纠缠您.有时,当它无法执行此操作时,您需要提供"alibi"返回语句,实际上它永远不会被执行.
像这样重新定义你的方法
public Connection getConn() {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
if(System.getenv("MY_ENVIRONMENT") == "development") {
String hostname = "localhost";
String username = "root";
String password = "root";
}
conn = DriverManager.getConnection("jdbc:mysql:///mydb", username, password);
} catch(Exception e) {
// handle the exception in a meaningful way - do not just rethrow it!
}
return conn;
}
Run Code Online (Sandbox Code Playgroud)
将满足Eclipse :-)
更新:正如其他人所指出的那样,以一种方式在catch块中重新抛出异常并不是一个好主意.它是一个体面的解决方案的唯一情况是,如果您需要在不同的异常类型之间进行转换.例如,一个名为throws的方法抛出一个异常类型,你不能或不想向上传播(例如,因为它属于专有的库或框架,你想要将其余的代码与它隔离开来).
即便如此,重新抛出异常的正确方法是将原始异常传递给新的构造函数(标准Java异常和大多数特定于框架的异常允许这样做).这样就可以保留堆栈跟踪和原始异常中的任何其他信息.在重新抛出之前记录错误也是一个好主意.例如
public void doSomething() throws MyException {
try {
// code which may throw HibernateException
} catch (HibernateException e) {
logger.log("Caught HibernateException", e);
throw new MyException("Caught HibernateException", e);
}
}
Run Code Online (Sandbox Code Playgroud)
您应该try/catch使用适当的异常声明来消除整个块并允许传播异常.这将消除Eclipse报告的错误,此外,您的代码正在做一些非常糟糕的事情:通过捕获并重新抛出所有异常,您将破坏原始堆栈跟踪并隐藏原始异常对象中包含的其他信息.
另外,该生产线的目的是Class.forName("com.mysql.jdbc.Driver").newInstance();什么?你是Driver通过反射创建一个新的mysql 对象(为什么?)但你没有做任何事情(为什么?).
| 归档时间: |
|
| 查看次数: |
23323 次 |
| 最近记录: |