2010-05-31 6 views
8

tüm hey, Java için yeni ve ben dönmek gerektiğini bunu oluşturmaya çalıştığınızda bağlantı başarısız olursaJava'da, bir özel durum ortaya çıkarsa nasıl bir dönüş tipi ayarlayabilirim?

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()); 
     } 

    } 

} 

gibi bir veritabanı nesne döndürmek için bir yöntem tanımlarsanız merak ? Tutulma bana bir Connection nesnesi döndürmek zorunda olduğumu söylüyor ama başarısız olursa ne yapacağımı emin değilim.

Teşekkürler!

GÜNCELLEME KOD İSTİSNA BUBBLE LET İÇİN: bir istisnası atılır

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; 

    } 

} 
+0

deneyin. Eclipse normalde bir şey attıktan sonra bir şey döndürmene gerek olmadığını anlayacak kadar akıllıdır. Ama onu mutlu etmek için bir "dönüş null" koy. yakalama bloğu bittikten sonra. –

+0

@Paul: Aslında Eclipse, yakalama içindeki "İşlenmeyen istisna türü Özel Durum" hakkında sadece mutsuz (eksik atmalar). –

cevap

5

, yöntem dönen asla normal değer yoktur. Genellikle derleyici bunu algılayabilir, bu yüzden "gerekli" stil uyarılar/hataları ile sizi rahatsız etmez. Bazen, bunu yapamadığı zaman, aslında hiçbir zaman idam edilmeyecek bir "alibi" iade beyanı vermelisiniz.

yeniden tanımlanması gibi yöntem bu

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; 
} 

Güncelleme Eclipse :-) tatmin edecek: Diğerleri işaret gibi, yeniden atan bir catch istisna o şekilde bloke olduğunu iyi bir fikir değil. İyi bir çözüm olduğunda tek durum, farklı istisna türleri arasında dönüşüm yapmanız gerektiğidir. Örneğin. Bir yöntem, yukarı doğru yayılamayacağınız veya yaymayacağınız bir istisna türü atar (örneğin, özel bir kütüphaneye veya çerçeveye ait olduğu ve kodunuzun geri kalanını bundan izole etmek istediğiniz için). O zaman bile, bir istisnayı yeniden gözden geçirmenin doğru yolu, orijinal istisnayı yeni kişinin yapıcısına iletmektir (standart Java istisnaları ve çoğu çerçeve özel istisnalar buna izin verir). Bu şekilde yığın izlemesi ve özgün istisna içindeki diğer bilgiler korunur. Ayrıca, yeniden işlemeden önce hatayı günlüğe kaydetmek iyi bir fikirdir. Örneğin.

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); 
    } 
} 
+0

Eclipse, bu yöntemin bir Koleksiyon türünü döndürmesi gerektiğini ve yöntem ayrıştırmasıyla birlikte bir hata simgesi olduğunu söylüyor. – James

+1

@beagleguy, bir dönüş veya atma ile sonuçlanmayacak bir kod yolu olduğundan öyledir. Ancak, yayınladığınız kod, böyle bir kod yolunu göstermediği için tamamlanmadı. – Yishai

+0

Teşekkürler Peter, try/catch'u kaldırmak için kodumu güncelledim. 2. sürüm daha iyi görünüyor mu? – James

1

Bu tam olarak size özel durum çağrı yığını (throws SQLException olarak yöntem bildirerek veya uygulamaya özgü istisna sararak) Eğer yakalamak ve daha yüksek bir adresten işleyebilir böylece yukarı yaymak izin vermeli durum seviyesi.

Bu, istisnaların tamamıdır: onları nerede yakalayacağınızı seçebilirsiniz.

5

try/catch tüm bloğunuzun tamamını ortadan kaldırmanız ve istisnaların uygun bir istisna bildirimi ile yayılmasına izin vermeniz gerekir. Bu, Eclipse'nin bildirdiği hatayı ortadan kaldıracak, artı şu anda kodunuz çok kötü bir şey yapıyor: tüm istisnaları yakalayıp yeniden atayarak, orijinal yığın izini yok ediyor ve orijinal istisna nesnesinde bulunan diğer bilgileri saklıyorsunuz.

Artı, Class.forName("com.mysql.jdbc.Driver").newInstance(); hattının amacı nedir? Yansımayla yeni bir mysql Driver nesnesi yaratıyorsunuz (neden?) Fakat bununla hiçbir şey yapmıyorsunuz (neden?).

+0

Eğer bu satırı yoksa, şu istisnayı almaya devam ediyorum: Genel İstisna: Uygun bir sürücü bulunamadı jdbc: mysql: /// mydb mysql bağlantı nesnesi almak için daha iyi bir yol var mı? – James

+1

@beagleguy, Google'dan bu oluşturma yönteminin aslında önerildiğini görüyorum. Huh. Sanırım jdbc’nin yazarları Bağımlılık Enjeksiyonu’nı hiç duymamışlardır. –

1

Asla, asla böyle genel bir istisna kullanmayın. Hazır bir istisna (bu durumda, bir SQLException) yoksa, kendi istisna tipinizi yapın ve atın.Her zaman "istisna atar" ı ilan eden bir şeyle karşılaşırsam ve bunun öyle olduğunu ortaya çıkarır çünkü dediği bir şey "istisna atar" ı ilan eder, ve böylece aşağı doğru, o zinciri başlatan aptalı boğazlamak istiyorum beyanları.

0

Üzgünüm, ancak Java için yeni olsanız bile bu şekilde kod yazmamalısınız. ,

public class DatabaseUtils 
{ 

    public static Connection getConnection(String driver, String url, String username, String password) throws SQLException 
    { 
     Class.forName(driver).newInstance(); 


     return DriverManager.getConnection(url, username, password); 
    } 
} 

Ve ayrıca bağlantı havuzları basit dışında başka bir şey için gitmek gerçek yol olduğunu bilmelidir: Eğer böyle bir şey yazmak gerekiyorsa

, bunu daha böyle yapmak istiyorum tek dişli uygulama.

0

Ben şaşırdım, Açıkçası bu bir

public ActionForward Login(ActionMapping mapping, ActionForm form, 
     HttpServletRequest request, HttpServletResponse response) { 
    MigForm migForm = (MigForm) form;// TODO Auto-generated method stub 

    Connection con = null; 
    Statement st = null; 
    ResultSet rs = null; 

    String uname=migForm.getUname(); 
    String pwd=migForm.getPwd(); 

    try{ 
     Class.forName("oracle.jdbc.driver.OracleDriver"); 
     con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","uname","pwd"); 
     if(con.isClosed()) 
     { 
      return mapping.findForward("success"); 
     } 

     //st=con.createStatement(); 

     }catch(Exception err){ 

     System.out.println(err.getMessage()); 
     } 


      return mapping.findForward("failure"); 



} 
İlgili konular