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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Вы вызываете методы и поля экземпляра из статического метода, чего нельзя сделать, потому что экземпляры полей и методы не существуют без объекта, а внутри основного метода нет объекта 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 для получения, установки и установки полей. " Я должен написать private float c_cfr ()?
blockquote>Ваши поля:
float r; float area; float cfr;
Это действительно не поле, а константа: final double pi = 3.14;
и может быть заменена / улучшена простым использованием Math.PI.
Ваши поля должны быть изменены на:
private float r; private float area; private float cfr;
, и вы должны только получить к ним доступ через общедоступные методы getter и setter, и только если это абсолютно необходимо.
Простое исправление заключается в том, чтобы поставить слово static перед каждым методом. Это универсальная статическая окружность истины = 2pi * r, ваш круг может быть больше моего круга (оба экземпляра круга), но чтобы найти область, есть одна формула
c_cfr () и c_area () - нестатические методы, которые вы пытаетесь вызвать непосредственно из статического основного метода. Либо сделайте методы c_cfr () и c_area () как статические или получите доступ к ним с помощью ссылки на объект.