Доступ к переменной абстрактного класса из основного метода [дубликат]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

6
задан Benito Bertoli 20 October 2013 в 22:41
поделиться

3 ответа

Вы вызываете методы и поля экземпляра из статического метода, чего нельзя сделать, потому что экземпляры полей и методы не существуют без объекта, а внутри основного метода нет объекта this. Вместо этого вы должны создать экземпляр класса, а затем вызвать методы в экземпляре.

public class Cerchio{

  float r;
  float area;
  float cfr;
  final double pi = 3.14;

  public static void main(String[] args){
    System.out.println("CIRCLE PROGRAM\n");

    Cerchio cerchio = new Cerchio();
    cerchio.r = 5;
    cerchio.c_cfr();
    cerchio.c_area();
    System.out.ptintln("The cir is: " + cerchio.cfr);
    System.out.println("The area is: " + cerchio.area);
  }

  float c_cfr(){
    cfr =(float)(2 * pi * r); //casting
    return cfr;
  }

  float c_area(){
    area = (float)(pi * (r*r));
    return area;
  }

}

Множество других проблем, ...

  • Вы напрямую доступ к полям классов, что не должно быть сделано. Вместо этого поля должны быть закрытыми, и вы должны использовать параметры getters / setters / contructor для получения, установки и установки полей.
  • Ваш код не имеет смысла, что делает его очень трудным для чтения и понимания.

Пожалуйста, найдите этот сайт, так как задан тот же вопрос и ответили габизиллионом раз, и, скорее всего, есть ответ, который намного лучше моего. Если это найдено, тогда этот вопрос должен быть закрыт как дубликат.


Изменить Вы заявляете:

Я не понял. Вместо этого поля должны быть закрытыми и вы должны использовать параметры getters / setters / contructor для получения, установки и установки полей. " Я должен написать private float c_cfr ()?

Ваши поля:

float r;
float area;
float cfr;

Это действительно не поле, а константа: final double pi = 3.14;

и может быть заменена / улучшена простым использованием Math.PI.

Ваши поля должны быть изменены на:

private float r;
private float area;
private float cfr;

, и вы должны только получить к ним доступ через общедоступные методы getter и setter, и только если это абсолютно необходимо.

17
ответ дан Hovercraft Full Of Eels 17 August 2018 в 16:15
поделиться
  • 1
    Итак, мне нужно создать объект в классе, где мне нужно использовать свойства и методы, объявленные в классе, правильно? – Mitro 20 October 2013 в 21:59
  • 2
    @AlessioMTX: см. Править для ответа. Вы должны создать переменную типа Cerchio внутри основного метода и присвоить ей новый объект Cerchio, а затем вы можете вызывать методы этой переменной. Это должно быть хорошо объяснено в главах вашего учебника по созданию объекта. Пожалуйста, смотрите. – Hovercraft Full Of Eels 20 October 2013 в 22:00
  • 3
    Хорошо спасибо, это была глупая ошибка, но мне нужно объяснение, подобное вашему. Я исправил код, поэтому теперь его легко читать, хотя это неправильно. – Mitro 20 October 2013 в 22:04
  • 4
    Я не понял & quot; Вместо этого поля должны быть частными, и вы должны использовать параметры getters / setters / contructor для получения, установки и установки полей. & Quot; Я должен написать private float c_cfr () ?? – Mitro 20 October 2013 в 22:15
  • 5
    10+: D действительно хорошее объяснение !!! – Mitro 20 October 2013 в 22:21

Простое исправление заключается в том, чтобы поставить слово static перед каждым методом. Это универсальная статическая окружность истины = 2pi * r, ваш круг может быть больше моего круга (оба экземпляра круга), но чтобы найти область, есть одна формула

0
ответ дан David Allan Houser Jr 17 August 2018 в 16:15
поделиться

c_cfr () и c_area () - нестатические методы, которые вы пытаетесь вызвать непосредственно из статического основного метода. Либо сделайте методы c_cfr () и c_area () как статические или получите доступ к ним с помощью ссылки на объект.

0
ответ дан josliber 17 August 2018 в 16:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: