2015-05-18 51 views
2

我在Android Studio中有一個項目,它有一個Google Cloud Endpoints模塊。我試圖將我的端點模塊連接到我在同一個項目中使用的Google Cloud SQL的實例Android Studio中未處理的異常Class.forname(「com.google.cloud.sql.jdbc.Driver」)

在IDE中我看到了以下錯誤:

Unhandled exception: java.lang.ClassNotFoundException 

我gradle這個構建顯示:

Error:(82, 26) error: unreported exception ClassNotFoundException; must be caught or declared to be thrown 
Error:(87, 26) error: unreported exception ClassNotFoundException; must be caught or declared to be thrown 

我已經啓用的appengine-web.xml

enter image description here

殲連接器我不知道我需要做什麼來連接我的SQL數據庫到我的Google App Engine。這似乎比我想象的更復雜。

我的代碼:

@ApiMethod(name = "getLesson") 
public Lesson getLesson(@Named("id") Long id) { 

    Lesson l = new Lesson(); 

    l.setLessonId(345); 
    l.setLessonColour("Blue"); 
    l.setLessonImage("itshappening.gif"); 



    String url = null; 
    if (SystemProperty.environment.value() == 
      SystemProperty.Environment.Value.Production) { 
     // Connecting from App Engine. 
     // Load the class that provides the "jdbc:google:mysql://" 
     // prefix. 
     Class.forName("com.google.cloud.sql.jdbc.Driver"); 
     url = 
       "jdbc:google:mysql://app:instance?user=root"; 
    } else { 
     // Connecting from an external network. 
     Class.forName("com.mysql.jdbc.Driver"); 
     url = "jdbc:mysql://000.000.000.000:3306?user=root"; 
    } 

    Connection conn = null; 
    try { 
     conn = DriverManager.getConnection(url); 
    } catch (SQLException e) { 
     l.setLessonDescription(e.getStackTrace().toString()); 
    } 

    try { 
     ResultSet rs = conn.createStatement().executeQuery(
       "SELECT 1 + 56"); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

    logger.info("Calling getLesson method"); 

    return l; 
} 

任何幫助,意見或指導意見,將不勝感激。

回答

1

方法Class.forName()會拋出一個ClassNotFoundException當給定的類不能被定位。

由於ClassNotFoundExceptionchecked exception,您實際上必須處理髮生某種可能性的可能性。你可以通過將它傳遞給調用方法來做到這一點。爲此,您必須將其添加到方法的簽名中:

@ApiMethod(name = "getLesson") 
public Lesson getLesson(@Named("id") Long id) throws ClassNotFoundException { 
    // ... 

然後調用當前方法的方法必須處理它。

另外,您也可以直接當前的方法中處理它,使用try/catch block

try { 
    // ... 

    Class.forName("com.google.cloud.sql.jdbc.Driver"); 

    // ... 
} catch (ClassNotFoundException e) { 
    e.printStackTrace(); 
} 

在這個例子中,它會簡單地打印出異常的堆棧跟蹤System.err。您可以將錯誤處理更改爲任何您想要的。

+0

嘆息。沒有我想象的那麼複雜......感謝您的洞察力/幫助。我應該看到這一點。 – markbratanov

1

ClassNotFoundException是一個檢查異常,因此您必須捕獲它或拋出它,如錯誤所述。

要跟隨當前的異常處理方案:

try { 
    Class.forName("com.google.cloud.sql.jdbc.Driver"); 
} catch (ClassNotFoundException e) { 
    l.setLessonDescription(e.getStackTrace().toString()); 
}