2012-01-10 3 views
0

У меня есть этот способ подключения к oracle 11g xe. Он все еще возвращает исключение java.lang.NullPointerException. Я использую Eclipse IDE. Пожалуйста, помогите, я не знаю, как это исправить.подключение к Oracle Oracle в Java возвращает NullPointerException

public static Connection connectDB() throws ClassNotFoundException, SQLException, InstantiationException, IllegalAccessException { 

    Connection connection = null; 
    try { 
     // Load the JDBC driver 
     String driverName = "oracle.jdbc.driver.OracleDriver"; 
     Class.forName(driverName).newInstance(); 

     // Create a connection to the database 
     String serverName = "127.0.0.1"; 
     String portNumber = "1521"; 
     String sid = "xe"; 
     String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid; 
     String username = "peter"; 
     String password = "pass"; 
     connection = DriverManager.getConnection(url, username, password); 
     System.out.println(connection); 
    } catch (ClassNotFoundException e) { 
     // Could not find the database driver 
    } catch (SQLException e) { 
     // Could not connect to the database 
    } 
    System.out.println(connection); 
    return connection; 
} 
+2

отправить трассировку стека –

+5

Когда? Где? Как? –

ответ

1

Вы игнорируете исключения, а затем надеетесь, что все пойдет хорошо. Просто перестать игнорировать исключения, и вы, вероятно, основную причину вашего NPE:

public static Connection connectDB() throws ClassNotFoundException, SQLException, InstantiationException, IllegalAccessException { 

    Connection connection = null; 
    // Load the JDBC driver 
    String driverName = "oracle.jdbc.driver.OracleDriver"; 
    Class.forName(driverName).newInstance(); 

    // Create a connection to the database 
    String serverName = "127.0.0.1"; 
    String portNumber = "1521"; 
    String sid = "xe"; 
    String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid; 
    String username = "peter"; 
    String password = "pass"; 
    connection = DriverManager.getConnection(url, username, password); 
    System.out.println(connection); 

    System.out.println(connection); 
    return connection; 
} 
+0

Eclipse позволяет легко игнорировать исключения, поскольку по умолчанию создается стандартная ошибка стека. Я немедленно изменяю это на исключение IllegalStateException («Исключение пока не обрабатывается», e) и задание TODO. Просто e.printStackTrace также играет хаос с внутренним состоянием методов (не имея возможности объявлять конечные переменные за пределами try, чтобы назвать только один или потребовать возврата после catch). Разумеется, бросать их тоже помогает. –

+0

@owlstead: согласовано. Я делаю то же самое. Но для кредита Eclipse, по крайней мере, он регистрирует исключение и не просто полностью его проглатывает. –

1

Я думаю, даже если StackTrace размещен, то NullPointerException не происходит в части кода, публикуемую в этом вопросе. Есть только две строки, которые не являются инициализациями переменных или простыми операциями System.out.println (которые могут обрабатывать null в любом случае).

Существует

Class.forName(driverName).newInstance(); 

линия, которая может вызвать исключение, когда Class.forName(driverName) не найден. Однако это приведет к возникновению ClassNotFoundException, а не NullPointerException, поэтому это можно устранить.

Единственная другая линия, которая может вызвать исключение является

connection = DriverManager.getConnection(url, username, password); 

линии. Однако url, username и password - все это не null, поэтому эта строка также не вызовет исключения.

В нижней строке вы получите стек, проанализируйте его самостоятельно (тривиально при использовании среды IDE, просто нажмите в стеке и посмотрите, где вы взяли IDE) и при необходимости разместите его здесь с соответствующим фрагментом кода.

О, и почему вы объявляете свой метод бросить ClassNotFoundException, если вы его поймаете и проигнорируете его при реализации метода. Это должно быть как наихудшее из обоих миров.

+0

Я использую эту строку для подключения к переменной «соединение» Connection connection = DatabazaOracle.connectDB(); здесь отладчик говорит, что переменное соединение равно null –

+0

Просто разместите stacktrace исключения здесь, с соответствующим кодом. Чтобы получить stacktrace: 'exception.printStackTrace()', который выведет его на консоль – Robin

2

Проблема была в драйвере для оракула. Я решаю это, поставив нужный файл ojdbc14.jar в папку с сервером. Я использую tomcat, поэтому я поставил файл ojdbc14.jar в папку apache-tomcat-7.0.8\lib\

+3

'ojdbc14.jar' предназначен для Java 1.4. вы должны использовать 'ojdbc5.jar' (который для Java 1.5) или' ojdbc6.jar', который предназначен для Java 1.6. –

Смежные вопросы