ошибка exception in thread “main” java.lang.nullpointerexception [дубликат]

159
30 октября 2019, 17:20

На данный вопрос уже ответили:

  • Что такое Null Pointer Exception и как его исправить? 4 ответа

При компиляции выдаёт вот такую ошибку:

Exception in thread "main" java.lang.NullPointerException at laba1.Laba1.showTable(Laba1.java:37) at laba1.Laba1.main(Laba1.java:178) C:\Users\Anna\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1 BUILD FAILED (total time: 21 seconds)

Код программы:

 package laba1;
     import java.sql.Connection;
    import java.sql.DriverManager;
   import java.sql.ResultSet;
   import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Scanner;
public class Laba1 {
private Connection con;
    public boolean setConnection(String name, String pass) {//устанавливаем соединение с базой,передаем свой логин и пароль
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return false;
        }
        try {
            con = DriverManager.getConnection("jdbc:oracle:thin:@DESKTOP-34UDS4O:1522:XE [SYS as sysdba on ANONYMOUS]",name, pass);
        } catch (SQLException e) {
            if(e.getErrorCode()==1017){
                System.out.println("Невірний логін чи пароль");
                return false;
            }
        }
        return true;
    }

      public void closeConnection() throws SQLException{//закрываем соединение
        con.close();
    }
    public void showTable() throws SQLException{//вывод таблицы на экран
        Statement st = con.createStatement();
        ResultSet rs = st.executeQuery("SELECT * FROM sorts");
        System.out.println("+--+----------------+----------+----------+-------------+");
        System.out.printf("|%3s %16s %9s %6s %13s%n", "Id|", "Назва сорту |", "Сезон|","Вегетаційний період|","Середня врожайність|");
        System.out.println("+--+----------------+----------+----------+-------------+");
        while(rs.next()){
            System.out.printf("|%3s %16s %10s %10s %13s%n",rs.getInt(1)+"|",rs.getString(2)+"|",rs.getInt(3)+"|",rs.getInt(4)+"|",rs.getString(5)+"|");
        }
        System.out.println("+--+----------------+----------+----------+-------------+");
        st.close();
        rs.close();
    }
    public void populationLessThan1() throws SQLException{//области с населением до 1млн
        Statement st = con.createStatement();
        ResultSet rs = st.executeQuery("SELECT name_sort, FROM sorts WHERE period<250");
        System.out.print("Озимі сорти з вегетаційним періодом до 250: ");
        while(rs.next()){
            System.out.print(rs.getString(1)+"("+rs.getInt(2)+");");
        }
        System.out.println();
        st.close();
        rs.close();
    }
public void avgPopulation() throws SQLException{//ищем среднее кол-во населения
        Statement st = con.createStatement();
        ResultSet rs = st.executeQuery("SELECT MIN(average_yield) FROM sorts");
        while(rs.next()){
            System.out.println("Сорт з мінімальною і максимальною врожайністю: "+rs.getInt(1)+" чол.");
        }
        st.close();
        rs.close();
    }
    public boolean isIdReal(int id) throws SQLException{//проверяем существует ли поле с таким id в таблице
        Statement st = con.createStatement();
        ResultSet rs1 = st.executeQuery("SELECT COUNT(name_sorts) FROM sorts WHERE id="+id);
        rs1.next();
        if(rs1.getInt(1)>0) return true;
        else return false;
    }
public void edit() throws SQLException{ //редактирование данных
        int id;
        Scanner sc = new Scanner(System.in);
        Statement st = con.createStatement();
        System.out.print("Введіть ID поля або 'Exit' для відміни: ");
        while(true){
            if(sc.hasNextInt()){
                id = sc.nextInt();
                if(!isIdReal(id)){
                    System.out.print("Такого ID не існує! Введіть ще раз: ");
                    continue;
                }
                System.out.print("Введіть назву колонки або 'Exit': ");
                while(true){
                    String value = null;
                    Integer intValue = null;
                    String column = sc.nextLine();
                    if(column.equalsIgnoreCase("name_sorts")||column.equalsIgnoreCase("average_yield")){
                        System.out.println("Введіть нове значення: ");
                        value=sc.nextLine();
                        st.execute("UPDATE Sorts SET "+column+" = '"+value+"' WHERE id = "+id);
                        System.out.println("Дані оновлено");
                        return;
                    }
                    else if(column.equalsIgnoreCase("sezon")||column.equalsIgnoreCase("period")){
                        System.out.println("Введіть нове значення: ");
                        while(true){
                            if(sc.hasNextInt()){
                                intValue=sc.nextInt();
                                st.execute("UPDATE Sorts SET "+column+" = '"+intValue+"' WHERE id = "+id);
                                System.out.println("Дані оновлено");
                                return;
                            }
                            else {
                                System.out.println("Введіть число: ");
                                sc.next();
                            }
                        }
                    }
                    else if(column.equalsIgnoreCase("Exit")) {
                        return;
                    }
                    else{
                        System.out.print("Такої колонки не існує, введіть ще раз: ");
                    }
                }
            }
            else if(sc.hasNextLine()){
                if(sc.nextLine().equalsIgnoreCase("Exit")){
                    return;
                }
                else {
                    System.out.print("Введіть число або 'Exit' для відміни: ");
                }
            }
            else {
                System.out.print("Введіть число або 'Exit' для відміни: ");
                sc.next();
            }
        }       
    }public void insertData() throws SQLException{//заносим значения в таблицу
        Statement st = con.createStatement();
        st.execute("insert into sorts values (null, 'Botvm','Odessa', 2395000,33314)");
        st.execute("insert into sorts values (null, 'Dnipropetrovska','Dnipro', 3285000,31923)");
        st.execute("insert into sorts values (null, 'Chernigivska','Chernigiv', 1054000,31903)");
        st.execute("insert into sorts values (null, 'Kharkivska','Kharkiv', 2696000,31418)");
        st.execute("insert into sorts values (null, 'Zhytomyrska','Zhytomyr', 1233000,29827)");
        st.execute("insert into sorts values (null, 'Polravska','Poltava', 1462000,28750)");
        st.execute("insert into sorts values (null, 'Khersonska','Kherson', 1055000,28461)");
        st.execute("insert into sorts values (null, 'Kyivska','Kyiv', 1732000,28121)");
        st.execute("insert into sorts values (null, 'Kirovogradska','Kropyvnytsky',999000,24588)");
        st.execute("insert into sorts values (null, 'Chernovytska','Chernyvtsy', 906000,8906)");
        System.out.println("Додано!");
    }
public void clearTable() throws SQLException{//удаляем все из таблицы 
        Statement st = con.createStatement();
        st.execute("DELETE FROM sorts");
    }
public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Laba1 l = new Laba1();
        Scanner sc = new Scanner(System.in);
        String name;
        String pass;
        boolean end = false;
        do{
            System.out.print("Введіть логін: ");
            name = sc.nextLine();
            System.out.print("Введіть пароль: ");
            pass = sc.nextLine();
        }while(!l.setConnection(name, pass));
        System.out.println("З'єднання встановлено!");
        do{
            String num;
            System.out.println("Виберіть дію:\n1 - показати таблицю\n2 - додати дані\n3 - показати області з населенням до 1млн.\n4 - показати середню кількість населення\n5 - очистити таблицю\n6 - змінити дані\n0 - вийти");
            num = sc.nextLine();
            switch(num){
                case "1": 
                    l.showTable();
                    break;
                case "2":
                    l.insertData();
                    break;
                case "3":
                    l.populationLessThan1();
                    break;
                case "4": 
                    l.avgPopulation();
                    break;
                case "5": 
                    l.clearTable();
                    break;
                case "6":
                    l.edit();
                    break;
                case "0":
                    l.closeConnection();
                    end = true;
                    break;
                default:
                    System.out.println("Такої команди не існує!");
                    break;
            }
        }
        while(!end);
    }
    }
Answer 1

В методе setConnection() во втором try-catch вы ловите все SQLException-ы, но false возвращаете только если этот эксепшын связан с ошибкой логина-пароля (1017). Остальные вы не обрабатываете и метод при другом SQLException возвращает true. При этом con остается не проинициализированной (null). Отсюда и NPE. Перенесите return false; ниже за фигурную скобку!

READ ALSO
Как вызвать метод клаcа(java)

Как вызвать метод клаcа(java)

Только начал изучать джавуПоследняя строчка выдает ошибку

165
Как передать Context

Как передать Context

Пишу клавиатуру, пытаюсь вывести информацию из БД

130
CRUD операции в Spring Data JPA и Hibernate

CRUD операции в Spring Data JPA и Hibernate

Spring Data JPA – это не реализация JPA, это абстракция доступа к данным БД

156
Как передать данные из Json в ArrayList

Как передать данные из Json в ArrayList

Пробую высветлить несколько маркеров на карте но не понимаю как правильно создать запрос к Json помогите пожалуста

160