O método calcularPreco
recebe dois parâmetros do tipo double
. Este é um tipo primitivo (em Java existe essa separação entre classes e primitivos, nem toda linguagem é assim), e tipos primitivos não podem ser null
. Então quando você fez preco.calcularPreco(null, null)
, tentou passar um valor inválido para o tipo em questão.
Mas na verdade está sendo feita uma grande confusão (ou várias). Por exemplo, se a variável compra
vai ser sobrescrita dentro do método, não precisa passá-la como parâmetro. Exemplo:
public void fazAlgo(double variavel) {
variavel = algumOutroValor; // estou sobrescrevendo o valor da variável
}
...
fazAlgo(10); // o valor 10 é ignorado pelo método
É mais ou menos isso que você fez. Não importa o valor que é passado para o método, dentro dele esse valor será sobrescrito e perdido. Então na verdade este parâmetro, da forma que está, é inútil. Ou você lê o valor fora do método e passa, ou não passa e lê dentro do método.
Quanto ao markup
, por que está passando null
? Se a ideia é usar o markup
que já foi definido antes (1.54
), também não precisa passá-lo como parâmetro do método.
Vale pensar também na separação de responsabilidades - ou no princípio de Separation of Concerns: o método que faz o cálculo também deveria ser responsável por ler o valor da compra? Eu acho que ele só deveria receber os valores e calcular, deixe a leitura separada dele:
public class PrecoDeVenda {
private double markup;
// construtor recebe o valor do markup
public PrecoDeVenda(double markup) {
this.markup = markup;
}
public double calcularPreco(double compra) {
return compra * this.markup;
}
}
E no main
:
public static void main(String[] args) {
// cria uma instância com markup de 1.54
PrecoDeVenda preco = new PrecoDeVenda(1.54);
// lè os dados
double compra = Double.parseDouble(JOptionPane.showInputDialog(null, "Digite a primeira nota:"));
// calcula o preço final, baseado no preço de compra
double precoFinal = preco.calcularPreco(compra);
// exibe os dados
JOptionPane.showMessageDialog(null, precoFinal);
}
Assim, não importa de onde veio o valor de compra
(se foi digitado em um JOptionPane
, se foi lido de um arquivo, etc), a classe PrecoDeVenda
não se importa com isso: a ela só interessa calcular o valor final (e repare que mudei o nome para PrecoDeVenda
, seguindo as convenções de nomenclatura do Java).
O mesmo vale para o valor calculado, o método só retorna o resultado, e quem o chamou que faça o que quiser com o resultado (se vai mostrar em um JOptionPane
, gravar em um arquivo, salvar no banco de dados, etc, não importa, a classe PrecoDeVenda
não precisa saber disso, ela só calcula e retorna o resultado).
Repare também que incluí um construtor que recebe o valor do markup
, assim você pode criar instâncias diferentes com valores distintos:
// cria uma instância com markup de 1.54
PrecoDeVenda preco1 = new PrecoDeVenda(1.54);
// cria outra instância com markup diferente
PrecoDeVenda preco2 = new PrecoDeVenda(3.75);
// lè os dados
double compra = Double.parseDouble(JOptionPane.showInputDialog(null, "Digite a primeira nota:"));
// calcula o preço final, baseado no preço de compra
// cada instância de PrecoDeVenda usa o seu próprio markup
double precoFinal1 = preco1.calcularPreco(compra);
double precoFinal2 = preco2.calcularPreco(compra);
Claro que isso é só uma ideia, pois sem requisitos reais não dá para saber se era para fazer isso mesmo (o markup
é fixo, varia conforme determinadas condições, etc?), mas enfim…