Для решения одной задачи мне надо округлить результат деления Integer/Integer до большего целого числа (если он будет являться дробью).
Чтобы решить эту задачу я нашёл две конструкции:
Конструкция 1:
int a = 1;
int b = 3;
int x = (a+(b-1))/b;
Конструкция 2:
int a = 1;
int b = 3;
int x = Math.ceil((double)a / b).intValue();
Как я понимаю, единственно правильным будет использовать конструкцию 2, т.к. конструкция 1 работает не для всех значений (например, отрицательные b).
Проблема в том, что в своём коде при компиляции я получаю непонятную мне ошибку, на которую я не нашёл самостоятельного ответа:
java: double cannot be dereferenced
Пример моего кода:
public class Main {
public static void main(String[] args) {
int h = 20;
int up = 7;
int down = 3;
int predUpDays = h - up;
int progress = up - down;
int days = Math.ceil((double)predUpDays / progress).intValue();
days++;
System.out.println(days);
}
}
Что я делаю не так?
I understand that the ArrayList can’t hold any primitive data
but how can i call my method horseFeed() into the driver alongside my Arraylist constructor so that i don’t get a double dereferenced error
Also can someone explain to me what a double dereferenced error is and why I’m getting it, please help
The method is in my class
public class horse
{
.
.
.
//took out a lot of code as it was not important to the problem
public String horseFeed(double w)
{
double sFeed= w*.015;
double eFeed= w*.013;
String range = sFeed + " < " + eFeed;
return range;
}
}
This is the ArrayList class
import java.util.*;
public class horseStable
{
.
.
.
public double findHorseFeed(int i)
{
double weight = horseList.get(i).getWeight();
return weight;
}
}
This is the Driver
public class Main
{
public static void main(String args[])
{
//returns the weight of the horse works fine
System.out.println(stable1.findHorseFeed(1));
// This is supposed to use the horseFeed method in the class by using the horse's weight. Where can i place the horseFeed method without getting an error?
System.out.println(stable1.findHorseFeed(1).horseFeed());
}
}
asked Nov 15, 2017 at 23:49
1
That error means that you tried to invoke a method on a double
value — in Java, double
is a primitive type and you can’t call methods on it:
stable1.findHorseFeed(1).horseFeed()
^ ^
returns a double can't call any method on it
You need to invoke the method on the correct object, with the expected parameters — something like this:
Horse aHorse = new Horse(...);
aHorse.horseFeed(stable1.findHorseFeed(1));
The method horseFeed()
is in the Horse
class, and it receives a parameter of type double
, which is returned by the method findHorseFeed()
in the HorseStable
class. Clearly, first you need to create an instance of type Horse
to invoke it.
Also, please follow the convention that class names start with an uppercase character.
answered Nov 15, 2017 at 23:53
Óscar LópezÓscar López
233k37 gold badges313 silver badges386 bronze badges
findHorseFeed()
returns a double
, on which you cannot call the horseFeed()
method (it returns a double
, not a horse
object)
First you need to write (and subsequently call) another method to return a horse object that you can then call horseFeed()
on.
In class horseStable
you’ll want a method like
public horse findtHorse(int i) {
horse myhorse = horseList.get(i);
return myhorse
}
You can probably also refactor findHorseFeed
to just .getWeight()
on getHorse()
:
public double findHorseFeed(horse myhorse) {
double weight = myhorse.getWeight();
return weight
}
then you can call:
horse myHorse = stable1.findHorse(1);
String range = myHorse.horseFeed(stable1.findHorseFeed(myHorse));
answered Nov 15, 2017 at 23:57
cowbertcowbert
3,2322 gold badges25 silver badges34 bronze badges
Вопрос:
String mins = minsField.getText();
int Mins;
try
{
Mins = Integer.parseInt(mins);
}
catch (NumberFormatException e)
{
Mins = 0;
}
double hours = Mins / 60;
hours.setText(hoursminsfield);
Проблема заключается в том, что Double cannot be dereferenced
.
Лучший ответ:
EDIT 4/23/12
double cannot be dereferenced
– это ошибка, которую некоторые компиляторы Java дают, когда вы пытаетесь вызвать метод на примитиве. Мне кажется, что double has no such method
будет более полезным, но что я знаю.
Из вашего кода кажется, что вы думаете, что можете скопировать текстовое представление hours
в hoursminfield
, выполнив hours.setText(hoursminfield);
У этого есть несколько ошибок:
1) часов – это double
, который является примитивным типом, и нет методов, которые вы можете вызвать. Это то, что дает вам ошибку, о которой вы просили.
2) вы не говорите, какой тип hoursminfield, может быть, вы еще не объявили его.
3) необычно устанавливать значение переменной, считая ее аргументом для метода. Это случается иногда, но не обычно.
Строки кода, которые делают то, что вам кажется нужным, следующие:
String hoursrminfield; // you better declare any variable you are using
// wrap hours in a Double, then use toString() on that Double
hoursminfield = Double.valueOf(hours).toString();
// or else a different way to wrap in a double using the Double constructor:
(new Double(hours)).toString();
// or else use the very helpful valueOf() method from the class String which will
// create a string version of any primitive type:
hoursminfield = String.valueOf(hours);
ОРИГИНАЛЬНЫЙ ОТВЕТ (обратился к другой проблеме в вашем коде):
В double hours = Mins / 60;
вы разделите два int
s. Вы получите значение int
этого деления, так что если Mins = 43; двойные часы = мин /60; //Mins/ 60 – это int = 0. Назначая его двойным часам, // часы удваиваются, равные нулю.
Что вам нужно сделать:
double hours = Mins / ((double) 60);
или что-то в этом роде, вам нужно отбросить часть вашего деления на double
, чтобы заставить деление сделать с помощью double
, а не int
s.
Ответ №1
Вы не указали язык, но, если это Java, существует большая разница между базовым типом double
и классом double
.
В любом случае ваш setText
кажется неправильным. Метод setText
относится к полю данных, а не к данным, которые вы пытаетесь вставить:
hoursminsfield.setText (hours);
Другими словами, вы хотите установить текст поля, используя двойной вы только что рассчитали. Если вы можете пройти двойное, это другое дело, которое может потребоваться изучить.
Другое дело:
double hours = Mins / 60;
будет, если Mins
является целым числом, дайте вам целочисленное значение, которое вы затем положите в double. Это означает, что он будет усечен. Если вы хотите, чтобы вы сохраняли точность после разделения, вы можете использовать что-то вроде:
double hours = (double) Mins / 60.0;
(хотя он может работать только с одним из этих изменений, я предпочитаю делать все выражения явными).
Ответ №2
Как насчет этого пути
double hours = Mins / 60.0
Я всегда использую вышеуказанный оператор, чтобы получить двойное значение
That error means that you tried to invoke a method on a double
value – in Java, double
is a primitive type and you cant call methods on it:
stable1.findHorseFeed(1).horseFeed()
^ ^
returns a double cant call any method on it
You need to invoke the method on the correct object, with the expected parameters – something like this:
Horse aHorse = new Horse(...);
aHorse.horseFeed(stable1.findHorseFeed(1));
The method horseFeed()
is in the Horse
class, and it receives a parameter of type double
, which is returned by the method findHorseFeed()
in the HorseStable
class. Clearly, first you need to create an instance of type Horse
to invoke it.
Also, please follow the convention that class names start with an uppercase character.
findHorseFeed()
returns a double
, on which you cannot call the horseFeed()
method (it returns a double
, not a horse
object)
First you need to write (and subsequently call) another method to return a horse object that you can then call horseFeed()
on.
In class horseStable
youll want a method like
public horse findtHorse(int i) {
horse myhorse = horseList.get(i);
return myhorse
}
You can probably also refactor findHorseFeed
to just .getWeight()
on getHorse()
:
public double findHorseFeed(horse myhorse) {
double weight = myhorse.getWeight();
return weight
}
then you can call:
horse myHorse = stable1.findHorse(1);
String range = myHorse.horseFeed(stable1.findHorseFeed(myHorse));
java – What does the error double cannot be dereferenced mean?
EDIT 4/23/12
double cannot be dereferenced
is the error some Java compilers give when you try to call a method on a primitive. It seems to me double has no such method
would be more helpful, but what do I know.
From your code, it seems you think you can copy a text representation of hours
into hoursminfield
by doing
hours.setText(hoursminfield);
This has a few errors:
1) hours is a double
which is a primitive type, there are NO methods you can call on it. This is what gives you the error you asked about.
2) you don’t say what type hoursminfield is, maybe you haven’t even declared it yet.
3) it is unusual to set the value of a variable by having it be the argument to a method. It happens sometimes, but not usually.
The lines of code that do what you seem to want are:
String hoursrminfield; // you better declare any variable you are using
// wrap hours in a Double, then use toString() on that Double
hoursminfield = Double.valueOf(hours).toString();
// or else a different way to wrap in a double using the Double constructor:
(new Double(hours)).toString();
// or else use the very helpful valueOf() method from the class String which will
// create a string version of any primitive type:
hoursminfield = String.valueOf(hours);
ORIGINAL ANSWER (addressed a different problem in your code):
In double hours = Mins / 60;
you are dividing two int
s. You will get the int
value of that division, so if
Mins = 43;
double hours = Mins / 60;
// Mins / 60 is an int = 0. assigning it to double hours makes
// hours a double equal to zero.
What you need to do is:
double hours = Mins / ((double) 60);
or something like that, you need to cast some part of your division to a double
in order to force the division to be done with double
s and not int
s.
posted 18 years ago
-
Number of slices to send:
Optional ‘thank-you’ note:
Hi, can someone briefly explain what does this error mean? And how to solve it? Thanks.
Error:
[ edited to break long lines -ds ]
[ April 18, 2004: Message edited by: Dirk Schreckmann ]
posted 18 years ago
-
Number of slices to send:
Optional ‘thank-you’ note:
this.price is a double, a numeric primitive, not an object.
primitives don’t have methods.
if this.price were a Double, this.price.toString() would work.
Mike Gershman
SCJP 1.4, SCWCD in process
posted 18 years ago
-
Number of slices to send:
Optional ‘thank-you’ note:
I think you’re getting the error because the primitive types — including ‘double’ — are not objects; they cannot have members, and in particular, don’t have a toString() member method. Thus, you can’t say price.toString().
Try Double.toString(price).
Accela Moon
Greenhorn
Posts: 20
posted 18 years ago
-
Number of slices to send:
Optional ‘thank-you’ note:
I can use such a method, its listed in the double class in java specs from java webbie, I’ve imported java.lang.Double..
posted 18 years ago
-
Number of slices to send:
Optional ‘thank-you’ note:
I can use such a method, its listed in the double class in java specs from java webbie, I’ve imported java.lang.Double
In Java there is double, and there is Double. The former one is a primitive type that has no methods, and the latter is a wrapper class that extends Number and Object, and subsequently has the corresponding methods. In your code, you can use either one, — but understand the difference.
Accela Moon
Greenhorn
Posts: 20
posted 18 years ago
-
Number of slices to send:
Optional ‘thank-you’ note:
Oh, my bad. I’ve fixed it, thanks a million!
Для решения одной задачи мне надо округлить результат деления Integer/Integer до большего целого числа (если он будет являться дробью).
Чтобы решить эту задачу я нашёл две конструкции:
Конструкция 1:
int a = 1;
int b = 3;
int x = (a+(b-1))/b;
Конструкция 2:
int a = 1;
int b = 3;
int x = Math.ceil((double)a / b).intValue();
Как я понимаю, единственно правильным будет использовать конструкцию 2, т.к. конструкция 1 работает не для всех значений (например, отрицательные b).
Проблема в том, что в своём коде при компиляции я получаю непонятную мне ошибку, на которую я не нашёл самостоятельного ответа:
java: double cannot be dereferenced
Пример моего кода:
public class Main {
public static void main(String[] args) {
int h = 20;
int up = 7;
int down = 3;
int predUpDays = h - up;
int progress = up - down;
int days = Math.ceil((double)predUpDays / progress).intValue();
days++;
System.out.println(days);
}
}
Что я делаю не так?
EDIT 4/23/12
double cannot be dereferenced
— это ошибка, которую некоторые компиляторы Java дают, когда вы пытаетесь вызвать метод на примитиве. Мне кажется, что double has no such method
будет более полезным, но что я знаю.
Из вашего кода кажется, что вы думаете, что можете скопировать текстовое представление hours
в hoursminfield
, выполнив hours.setText(hoursminfield);
У этого есть несколько ошибок:
1) часов — это double
, который является примитивным типом, и нет методов, которые вы можете вызвать. Это то, что дает вам ошибку, о которой вы просили.
2) вы не говорите, какой тип hoursminfield, может быть, вы еще не объявили его.
3) необычно устанавливать значение переменной, считая ее аргументом для метода. Это случается иногда, но не обычно.
Строки кода, которые делают то, что вам кажется нужным, следующие:
String hoursrminfield; // you better declare any variable you are using
// wrap hours in a Double, then use toString() on that Double
hoursminfield = Double.valueOf(hours).toString();
// or else a different way to wrap in a double using the Double constructor:
(new Double(hours)).toString();
// or else use the very helpful valueOf() method from the class String which will
// create a string version of any primitive type:
hoursminfield = String.valueOf(hours);
ОРИГИНАЛЬНЫЙ ОТВЕТ (обратился к другой проблеме в вашем коде):
В double hours = Mins / 60;
вы разделите два int
s. Вы получите значение int
этого деления, так что если Mins = 43; двойные часы = мин /60; //Mins/ 60 — это int = 0. Назначая его двойным часам, // часы удваиваются, равные нулю.
Что вам нужно сделать:
double hours = Mins / ((double) 60);
или что-то в этом роде, вам нужно отбросить часть вашего деления на double
, чтобы заставить деление сделать с помощью double
, а не int
s.
In order to accomplish one task, I need to round the Integer/Integer divide to a larger number (if it is fragmented).
To accomplish this, I found two structures:
Design 1:
int a = 1;
int b = 3;
int x = (a+(b-1))/b;
Design 2:
int a = 1;
int b = 3;
int x = Math.ceil((double)a / b).intValue();
I understand that design 2 is the only right, since design 1 does not work for all values (e.g. negative b).
The problem is, in my code of compilation, I get a mistake I don’t understand, which I didn’t find my own answer:
java: double cannot be dereferenced
Example of my code:
public class Main { public static void main(String[] args) { int h = 20; int up = 7; int down = 3;
int predUpDays = h - up; int progress = up - down; int days = Math.ceil((double)predUpDays / progress).intValue(); days++; System.out.println(days); }
}
What am I doing wrong?