Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Помощь с Exception - ом


Автор: ioManip 13.11.2014, 16:09
Вот есть такой код:
Код

class Element {
    
    private int Delivery;
    private int Value;
    
    public int getDelivery() {
        return Delivery;
    }
    
    public int getValue() {
        return Value;
    }
    
    public void setValue(int value) {
        Value = value;
    }
    
    public void setDelivery(int value) {
        Delivery = value;
    }
    
    public static int findMinElement(int a, int b) {
        
        if (a > b)
            return b;
        if (a == b) {
            return a;
        } else return a;
    }
}


public class main {

    public static void main(String[] args) {

        int i = 0;
        int j = 0;
        
        System.out.print("Введите количество A: ");
        int n = Integer.parseInt((new Scanner(System.in).nextLine()));
        int[] a = new int[n];
        
        System.out.print("Введите количество B: ");
        int m = Integer.parseInt(new Scanner(System.in).nextLine());
        int[] b = new int[m];
        
        Element[][] c = new Element[n][m];
        
        System.out.println("Введите a[i]");
        for (i = 0; i < a.length; i++) {
            a[i] = Integer.parseInt((new Scanner(System.in)).nextLine());
        }
        
        System.out.println("Введите b[i]");
        for (j = 0; j < b.length; j++) {
            b[i] = Integer.parseInt(new Scanner(System.in).nextLine());
        }
        
        System.out.println("Введите c[i][j]");
        for (i = 0; i < n; i++) {
            for (j = 0; j < m; j++) {
                System.out.println("a[{0},{1}] = " + i + j);
               c[i][j].setValue(Integer.parseInt(new Scanner(System.in).nextLine()));
            }
        }
        i = j = 0;
        
        while (i < n && j < m) {
            
            try {
                if (a[i] == 0)
                    i++;
                if (b[j] == 0)
                    j++;
                if (a[i] == 0 && b[j] == 0) {
                    i++;
                    j++;
                }
                
                c[i][j].setDelivery(Element.findMinElement(a[i], b[i]));
                a[i] = a[i] - c[i][j].getDelivery();
                b[j] = b[j] - c[i][j].getDelivery();
                
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        
        for (i = 0; i < n; i++) {
            for (j = 0; j < m; j++) {
                if (c[i][j].getDelivery() != 0) {
                    System.out.println("{0}" + c[i][j].getValue());
                    System.out.println("({0})" + c[i][j].getDelivery());
                } else {
                    System.out.println("{0}({1})" + c[i][j].getValue() + c[i][j].getDelivery());
                }
            }
            System.out.println();
        }
        
        int resultFunction = 0;
        
        for (i = 0; i < n; i++) {
            for (j = 0; j < m; j++)
            {
                resultFunction = resultFunction + (c[i][j].getValue() * c[i][j].getDelivery());
            }
        }
        System.out.println("Результат: " + resultFunction);
    }
}

И вот в этом месте 
Код

 c[i][j].setValue(Integer.parseInt(new Scanner(System.in).nextLine()));

мне кидает НульПоинтер. Собственно, почему?

Автор: LSD 13.11.2014, 17:48
Потому что в c[i][j] лежит null

Автор: Michael.de 14.11.2014, 21:51
ioManip, в строке 48 ты создаёшь массив, заполненный не объектами типа Element, а null  >>https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html<<
И если ты хочешь весь array заполнить (в цикле) , необходимо сначала инициализировать каждый c[i][j] и лишь затем изменять значения полей объекта.

P.S. Вдогонку:
за строку 85 у нас можно попрощаться с возможностью карьерного роста smile

Автор: ioManip 16.11.2014, 06:10
Цитата(Michael.de @  14.11.2014,  21:51 Найти цитируемый пост)
за строку 85 у нас можно попрощаться с возможностью карьерного роста

А почему это?

Автор: Michael.de 17.11.2014, 16:04
ioManip:
Потому что с одной стороны Exception поймано и как-то обработано, но его тип нам не ясен (это RuntimeException, IOException, а может ArrayIndexOutOfBoundsException или NullPointerException etc.) Как приложение должно будет адекватно работать/реагировать, если в try-catch блоке отлавливаются несколько различных Exception-s? И как разработчик будет ошибки искать?
Мой вывод:
1. если несколько Exception - каждое обрабатывать по отдельности (или сгруппировать несколько, но только если реакция приложения на них должна быть одинакова)
2. если только одно, то использовать соответствующее (напр. ClassNotFoundException, но не Exception !!! )

Можешь набрать в google "java exception hierarchy" и посмотреть на диаграммы (какой класс от какого наследует и т.д.) или глянуть >>https://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html<<

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)