Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2015, 14:37   #1
dmitrykzmn
Пользователь
 
Аватар для dmitrykzmn
 
Регистрация: 25.05.2015
Сообщений: 30
По умолчанию Массив из класса

Здравствуйте. Недавно начал учить яву, и столкнулся с одной проблемой
Код:
import javax.swing.*;
class myclass{
    int [][] a;
    int n,m;
    String s="";
}
public class Test{
    public static void main(String[] args){
        myclass obj=new myclass();
        obj.n=Integer.parseInt(JOptionPane.showInputDialog("Enter n"));
        obj.m=Integer.parseInt(JOptionPane.showInputDialog("Enter m"));
        int [][] a=new int[obj.n][obj.m];
            for (int i=0;i<=obj.n-1;i++){
                obj.s+="\n";
                for (int j=0;j<=obj.m-1;j++){
                    obj.a[i][j]=(int)(10*Math.random());
                    obj.s+=obj.a[i][j]+" ";
                }
            }
        JOptionPane.showMessageDialog(null, obj.s);
    }
}
Здесь у меня есть свой класс с массивом и парой переменных, который я пытаюсь заполнить. Но при выполнении программы кидает ошибку н а16 строку (obj.a[i][j]=(int)(10*Math.random()).
Копа-копал, но косяка так и не нашел. Прошу объяснить, где тут косяк. Заранее спасибо)
dmitrykzmn вне форума Ответить с цитированием
Старый 09.07.2015, 15:07   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Секретная ошибка?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.07.2015, 15:12   #3
dmitrykzmn
Пользователь
 
Аватар для dmitrykzmn
 
Регистрация: 25.05.2015
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Секретная ошибка?
Exception in thread "main" java.lang.NullPointerException
dmitrykzmn вне форума Ответить с цитированием
Старый 09.07.2015, 16:29   #4
ultimatet41
Форумчанин
 
Аватар для ultimatet41
 
Регистрация: 08.04.2012
Сообщений: 104
По умолчанию

Вы создали внешний массив a, а обращаетесь к массиву класса myclass который не был создан. И ещё обратите внимание как рекомендовано оформлять счётчик цикла.
Код:
public class Test {
    public static void main(String[] args){
        MyClass obj=new MyClass();
        obj.n=Integer.parseInt(JOptionPane.showInputDialog("Enter n"));
        obj.m=Integer.parseInt(JOptionPane.showInputDialog("Enter m"));
        obj.a = new int[obj.n][obj.m];
        for (int i = 0; i < obj.n; i++){
            obj.s+="\n";
            for (int j = 0; j < obj.m; j++){
                System.out.println(i + " " +j);
                obj.a[i][j]=(int)(10.0 * Math.random());
                obj.s+=obj.a[i][j]+" ";
            }
        }
        JOptionPane.showMessageDialog(null, obj.s);
    }
}
ultimatet41 вне форума Ответить с цитированием
Старый 09.07.2015, 16:29   #5
dmitrykzmn
Пользователь
 
Аватар для dmitrykzmn
 
Регистрация: 25.05.2015
Сообщений: 30
По умолчанию

Ошибку я нашел и исправил.
Строку obj.a[i][j]=(int)(10*Math.random()); нужно было исправить на
a[i][j]=(int)(10*Math.random());
Но можете объяснить, почему перед именем массива а не ставится имя класса, из которого он вызывается (obj в данном случае). Ведь массив-это переменная, и по идее должен вызываться через точку с именем своего класса
dmitrykzmn вне форума Ответить с цитированием
Старый 09.07.2015, 16:31   #6
dmitrykzmn
Пользователь
 
Аватар для dmitrykzmn
 
Регистрация: 25.05.2015
Сообщений: 30
По умолчанию

Цитата:
Сообщение от ultimatet41 Посмотреть сообщение
Вы создали внешний массив a, а обращаетесь к массиву класса myclass который не был создан.
Код:
public class Test {
    public static void main(String[] args){
        MyClass obj=new MyClass();
        obj.n=Integer.parseInt(JOptionPane.showInputDialog("Enter n"));
        obj.m=Integer.parseInt(JOptionPane.showInputDialog("Enter m"));
        obj.a = new int[obj.n][obj.m];
        for (int i = 0; i < obj.n; i++){
            obj.s+="\n";
            for (int j = 0; j < obj.m; j++){
                System.out.println(i + " " +j);
                obj.a[i][j]=(int)(10.0 * Math.random());
                obj.s+=obj.a[i][j]+" ";
            }
        }
        JOptionPane.showMessageDialog(null, obj.s);
    }
}
Прошу прощения, коряво вставился код. Внешний класс имеется:
Код:
class myclass{
    int [][] a;
    int n,m;
    String s="";
}
dmitrykzmn вне форума Ответить с цитированием
Старый 09.07.2015, 16:36   #7
dmitrykzmn
Пользователь
 
Аватар для dmitrykzmn
 
Регистрация: 25.05.2015
Сообщений: 30
По умолчанию

Хм, странно. Переписал код, аналогичный этому, только с парой отличий в названии, и все работает отлично.
Код:
import javax.swing.*;
class variab{
    int [][] a;
    int n,m;
    String s="";
}
public class Test{
    public static void main(String[] args){
        variab obj=new variab();
        obj.n=Integer.parseInt(JOptionPane.showInputDialog("Enter n"));
        obj.m=Integer.parseInt(JOptionPane.showInputDialog("Enter m"));
        int [][] a=new int [obj.n][obj.m];
            for (int i=0;i<=obj.n-1;i++){
                obj.s+="\n";
                for (int j=0;j<=obj.m-1;j++){
                    a[i][j]=(int)(10*Math.random());
                    obj.s+=a[i][j];
                }
            }
        JOptionPane.showMessageDialog(null, obj.s);
    }
}
Но мне все равно не понятно, почему в цикле массив a вызывается без obj.

Последний раз редактировалось dmitrykzmn; 09.07.2015 в 16:38.
dmitrykzmn вне форума Ответить с цитированием
Старый 09.07.2015, 16:39   #8
ultimatet41
Форумчанин
 
Аватар для ultimatet41
 
Регистрация: 08.04.2012
Сообщений: 104
По умолчанию

Цитата:
Сообщение от dmitrykzmn Посмотреть сообщение
Ошибку я нашел и исправил.
Строку obj.a[i][j]=(int)(10*Math.random()); нужно было исправить на
a[i][j]=(int)(10*Math.random());
Но можете объяснить, почему перед именем массива а не ставится имя класса, из которого он вызывается (obj в данном случае). Ведь массив-это переменная, и по идее должен вызываться через точку с именем своего класса
Вы внесли не верное исправление, что легко проверить попробовав обратится к массиву объекта, т.е. попробуйте написать после циклов obj.a[0][0] и у вас вывалится ошибка, т.к. вы работаете не с массивом obj, а с локальным массивом созданный в классе Test. Ещё раз перечитайте код который я исправил.
ultimatet41 вне форума Ответить с цитированием
Старый 09.07.2015, 16:47   #9
dmitrykzmn
Пользователь
 
Аватар для dmitrykzmn
 
Регистрация: 25.05.2015
Сообщений: 30
По умолчанию

Цитата:
Сообщение от ultimatet41 Посмотреть сообщение
Вы внесли не верное исправление, что легко проверить попробовав обратится к массиву объекта, т.е. попробуйте написать после циклов obj.a[0][0] и у вас вывалится ошибка, т.к. вы работаете не с массивом obj, а с локальным массивом созданный в классе Test. Ещё раз перечитайте код который я исправил.
Все, понял. Большое спасибо!
dmitrykzmn вне форума Ответить с цитированием
Старый 11.07.2015, 16:17   #10
dmitrykzmn
Пользователь
 
Аватар для dmitrykzmn
 
Регистрация: 25.05.2015
Сообщений: 30
По умолчанию

Возник еще вопрос, дабы не засорять раздел спрошу прямо тут.
Код:
Код:
import javax.swing.*;
class matmax{
    String getmat(){
        String s="";
        int n=Integer.parseInt(JOptionPane.showInputDialog("Enter n"));
        int [] a=new int[n];
            for (int i=0;i<n;i++){
              a[i]=(int)(10*Math.random());
              s+=a[i]+" ";
            }
    return s;
    }
    String getmatrix(){
        String s="";
        int a=Integer.parseInt(JOptionPane.showInputDialog("Enter a"));
        int b=Integer.parseInt(JOptionPane.showInputDialog("Enter b"));
        int [][] m=new int[a][b];
            for (int i=0;i<a;i++){
              s+="\n";
              for (int j=0;j<b;j++){
                  m[i][j]=(int)(10*Math.random());
                  s+=m[i][j]+" ";
              }
            }
        return s;
    }
}
class strings(){
    String ones(){
        String s="";
        int k=Integer.parseInt(JOptionPane.showInputDialog("Enter k"));
        char [] p=new char [k];
            for (int i=0;i<k;i++){
                p[i]=(char)(10*Math.random());
                s+=p[i]+" ";
            }
        return s;
    }
    String mats(){
        String s="";
        int g=Integer.parseInt(JOptionPane.showInputDialog("Enter g"));
        int h=Integer.parseInt(JOptionPane.showInputDialog("Enter h"));
        char [][] si=new char [g][h];
            for (int i=0;i<g;i++){
               s+="\n";
               for (int j=0;j<h;j++){
                   si[i][j]=(char)(10*Math.random());
                   s+=si[i][j]+" ";
               }
            }
        return s;
    }
}
public class Test{
    public static void main(String[] args){
        Integer num=Integer.parseInt(JOptionPane.showInputDialog("Enter num of command"));
        matmax objf=new matmax();
        strings objs=new strings();
        if (num==1){JOptionPane.showMessageDialog(null, objf.getmat());}
        else if (num==2){JOptionPane.showMessageDialog(null, objf.getmatrix());}
        else if (num==3){JOptionPane.showMessageDialog(null, objs.ones());}
        else if (num==4){JOptionPane.showMessageDialog(null, objs.mats());}
        }
    }
В целом все работает, кроме методов из класса strings. Видимо я что-то не правильно делаю с чаром. Буду рад, если поможете с этой проблемкой
dmitrykzmn вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
массив экземпляров класса flibustier912 Visual C++ 1 05.05.2012 01:00
Массив объектов класса. zipwind Общие вопросы C/C++ 8 01.05.2011 20:56
массив методов класса DartDayring Общие вопросы C/C++ 0 07.12.2010 20:00
Массив эллементов пользовательского класса windzor Общие вопросы .NET 4 02.03.2010 19:53
массив указателей на методы класса? cout Общие вопросы C/C++ 2 08.05.2008 09:43