2016-09-03 2 views
-3

Мне нужно умножить radius*radius*pi, чтобы найти точную область круга, но код, который я записал, не работает. Это продолжает давать двойную не может быть разыменованной ошибку ...Java Double не может быть разыменован

ОШИБКИ

----jGRASP exec: javac -g Circle.java 
Circle.java:7: error: double cannot be dereferenced 
     BigDecimal area = radius.multiply(pi); 
          ^
1 error 

КОДА

import java.math.*; 
public class Circle { 
    public BigDecimal findArea(double radius){ 
     double pi = 3.14159; 
     radius = radius * radius; 
     BigDecimal bd = new BigDecimal("1"); 
     BigDecimal area = pi.multiply(radius); 
     return area; 
    } 
} 
+2

Действительно ли это ошибка для этого кода? Зачем говорить «radius.multiply (pi)», а другой - «pi.multiply (radius)»? –

+2

Однако: используйте 'pi * radius' (или' radius * pi'). В обоих случаях они являются примитивными 'double', а не' BigDecimal'. –

+0

Также: зачем определять 'double pi' вместо использования' Math.PI'? И почему «новый BigDecimal (« 1 »)» вместо «BigDecimal.ONE»? –

ответ

5

Разыменование не работает на примитивных типах. double - примитивный тип.

Поэтому

pi.multiply(radius) 

является недействительным выражение.

Вы могли бы использовать что-то вроде этого:

BigDecimal area = BigDecimal.valueOf(pi).multiply(BigDecimal.valueOf(radius)); 

или это

BigDecimal area = BigDecimal.valueOf(pi*radius); 

вместо этого.

+1

Легче читать, создано меньше объектов: 'BigDecimal area = BigDecimal.valueOf (pi * radius);'. –

+1

Я мог бы также указать, что радиус = радиус радиуса; 'несколько строк выше путают - проще просто удалить эту строку и записать радиус радиуса pi * здесь. –

+0

Подход «pi * radius» будет работать намного быстрее из-за технологии с плавающей точкой, но также даст разные результаты, связанные с неточностями с плавающей точкой. Так что это зависит от того, чего хотят программисты: скорость выполнения с приблизительными результатами (второй пример) или намного медленнее, но с более точными результатами (первая строка примера). –

2

pi и radius являются двойными примитивными типами, то есть они не могут быть разыменованы, и вы не можете использовать такие методы, как multiply. Попробуйте это:

BigDecimal area = BigDecimal.valueOf(pi * radius); 

Или:

BigDecimal area = BigDecimal.valueOf(Math.PI * radius); 

В примере, я заменял pi с Math.PI, как это встроенные в Java и более точным. Приведенный выше код принимает значение Math.PI * radius и преобразует его в BigDecimal.

Смежные вопросы