我正在尝试将Java中的try / catch块放在我的连接上。以下是我的代码示例:
public static Connection getConnection() throws Exception, SQLException {
try{
String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String url = "jdbc:sqlserver://IP\\:Port;databaseName=DB";
String username = "username";
String password = "password";
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, username, password);
}catch (SQLException e){
System.out.println(e.getMessage());
}
return conn;
}
我的代码在线上给出错误我的 * return conn; * !说:conn无法解析为变量。
此外,我想在我的PasswordAuthentication周围放置try catch块,但我尝试的所有内容都不适用于我。这是我的部分代码:
class EmailSender{
private Session session;
//Checking for authentication, taking host and port information
private void init(){
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "IP");
props.put("mail.smtp.port", "PORT");
session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
//returning user name and password to connect to email server
return new PasswordAuthentication("Username", "password");
}
});
}
我尝试将try / catch块放在这部分的整个代码中,也只是围绕会话部分,但没有什么对我不起作用。任何人都可以帮我解决这个问题吗?
答案 0 :(得分:4)
由于在conn
中定义了try { ... }
,因此在该块之外不知道它(变量具有已知的“范围”)。你有两个选择:
a)在尝试之前声明你的conn并将其分配到...
Connection conn = null;
try {
conn = ...;
b)将您的回报移至try
区块内,并在结尾处移动return null
。这样,如果一切正常,它将返回conn,如果异常被捕获,则返回null。
对于第二部分,我不明白为什么围绕Session.getInstance()包装try catch会有任何问题:
private void init(){
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "IP");
props.put("mail.smtp.port", "PORT");
try {
session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
//returning user name and password to connect to email server
return new PasswordAuthentication("Username", "password");
}
});
} catch(RuntimeException e) {
e.printStackTrace(); // for example
}
}
当然这只会阻止该方法进一步抛出异常。会导致会话为空。
答案 1 :(得分:1)
向Florian Schaetz的答案添加一个重点。
对于案例一,应该有两个catch块
对于
Class.forName("com.mysql.jdbc.Driver");
我们应该抓住ClassNotFoundException
和
Connection conn = DriverManager.getConnection(url, username, password);
我们应该抓住SQLException
所以你的最终代码应该有两个catch块
public static Connection getConnection() throws Exception, SQLException {
try{
String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String url = "jdbc:sqlserver://IP\\:Port;databaseName=DB";
String username = "username";
String password = "password";
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, username, password);
}catch (ClassNotFoundException e){
System.out.println(e.getMessage());
}
catch (SQLException e){
System.out.println(e.getMessage());
}
return conn;
}