Porque é que este código causa uma “start ilegal de expressão” exceção?
-
06-09-2019 - |
Pergunta
Estas são as minhas perguntas:
-
Estou recebendo um par de erros na linha "public static boolean validNumCheck (String num) {" - "start ilegal de expressão", " ';' esperado", e " ')' esperado".
-
Como posso dar ao usuário 3 tentativas no total para cada número? Eu acredito que agora o programa pede ao usuário para 3 números e dá-lhes 3 tentativas no total para obter os números corretos (minhas explicações chupar ... leia o código para ter uma melhor idéia do que quero dizer).
Este é meu código:
import javax.swing.JOptionPane;
public class Assignment3 {
public static void main (String[] args){
final int MAX_TRIES = 3;
int[] attempts= new int[2];
String[] getNumber= new String [2];
//Ask the user for 3 integers.
while(attempts[0]<MAX_TRIES){
getNumber[0]= JOptionPane.showInputDialog(null,"Please enter an integer between 0-200.");
//Pass the value to validNumChek
validNumCheck (getNumber);
//If it is not a valid number give the user 3 more tries.
if (getNumber== false){
while(attempts[1]<MAX_TRIES){
getNumber[1]= JOptionPane.showInputDialog(null,"Please enter an integer between 0-200.");
attempts[1]++;}
}
attempts[0]++;
}
//Parse the string to an integer and check if it is a valid number.
public static boolean validNumCheck(String num){
int number;
try {
number = Integer.parseInt(num);
return number >= 0 && number <= 200;
}catch(NumberFormatException e){
//If it is not a valid number return false.
return false;
}
}
}
Solução
Eu acho que é importante criar um código pseudo ou algoritmo do problema início e, em seguida, se ele funciona acordo com a programação depois . Caso contrário, você estará resolvendo duas coisas ao mesmo tempo 1. problema de lógica e 2. Implementação detalhes.
Isto é como eu iria fazê-lo.
//The three numbers should be entered by a user in the main method.
MAIN PROGRAM starts
declare a , b , c as numbers
//The numbers should be positive and less than 200.
// see validNumCheck below.
//part 1.If not, the program asks the user to renter the number.
//part 2.The user will have three chances to enter a valid number for each number.
//part 3. If the number is still invalid after the three trials, the program displays an error message to the user and ends.
// ok then read a number and validate it.
attempts = 0;
maxAttempts = 3;
//part 2. three chances... .
loop_while ( attemtps < maxAttempts ) do // or 3 directly.
number = readUserInput(); // part 1. reenter the number...
if( numcheck( number ) == false ) then
attempts = attempts + 1;
// one failure.. try again.
else
break the loop.
end
end
// part 3:. out of the loop.
// either because the attempts where exhausted
// or because the user input was correct.
if( attempts == maxAttemtps ) then
displayError("The input is invalid due to ... ")
die();
else
a = number
end
// Now I have to repeat this for the other two numbers, b and c.
// see the notes below...
MAIN PROGRAM ENDS
E esta seria a função para "validNumCheck"
// You are encouraged to write a separate method for this part of program – for example: validNumCheck
bool validNumCheck( num ) begin
if( num < 0 and num > 200 ) then
// invalid number
return false;
else
return true;
end
end
Assim, temos a um ponto onde um número "um" pode ser validado, mas temos de fazer o mesmo para "b" e "c"
Em vez de "copiar / colar" seu código e complicar a sua vida tentando ajustar o código para atender às necessidades que você pode criar uma função e delegar esse trabalho para a nova função.
Assim, o novo código pseudo vai ser assim:
MAIN PROGRAM STARTS
declare a , b , c as numbers
a = giveMeValidUserInput();
b = giveMeValidUserInput();
c = giveMeValidUserInput();
print( a, b , c )
MAIN PROGRAM ENDS
E mover a lógica para a nova função (ou método)
A função giveMeValidUserInput seria assim (aviso é quase idêntico ao primeiro código pseudo)
function giveMeValidUserInput() starts
maxAttempts = 3;
attempts = 0;
loop_while ( attemtps < maxAttempts ) do // or 3 directly.
number = readUserInput();
if( numcheck( number ) == false ) then
attempts = attempts + 1;
// one failure.. try again.
else
return number
end
end
// out of the loop.
// if we reach this line is because the attempts were exhausted.
displayError("The input is invalid due to ... ")
function ends
Será que o validNumCheck não mudar.
Passando que fazer código será de alguma forma simples. Porque você já entende o que você quer fazer (análise), e como você deseja fazê-lo (design).
Claro, isso seria mais fácil com a experiência.
Resumo
Os passos passar do problema para a código são :
-
Leia o problema e entendê-lo (é claro).
-
Identificar possíveis "funções" e variáveis.
-
Write como eu ia fazê-lo passo a passo (algoritmo)
-
traduzi-lo em código, se há algo que você não pode fazer, criar uma função que faz isso por você e manter em movimento.
Outras dicas
Este thread pode seja útil. Essas são dicas para passar de "descrição do problema" para "real codificação"
De acordo com suas perguntas específicas:
Como posso dar ao usuário três oportunidades para introduzir um número válido para cada número? (Eu não quero que a 'resposta' apenas algumas idéias / dicas.
Como você faria isso se fosse uma caixa (com má memória) na vida real? E eu quero dizer muito, muito ruim de memória, tanto que você não consegue se lembrar se você está rejeitando um cliente para a primeira vez ou segundo?
Gostaria de anotá-la em um pedaço de papel, e cada vez que eu rejeito o cliente para adicionar um "|"
"| | |"
Quando o papel tem três linhas em que eu chamaria a polícia. .. :)
Isso é semelhante aqui. Se você não tiver algum coisa que pode variar você vai entrar em uma infinita laço ;)
é validNumCheck supor para retornar um valor e depois sair no método main vazio
Não
... ou eu posso ter apenas sair do programa em que o método principal?
Sim.
Quando você contar (na vida real), você não precisa para armazenar os números em caixas, você só tem que alterar o valor da contagem e têm um limite.
Por exemplo, você pode substituir o seguinte:
int[] count= new int[2];
Com este:
int attemtps = 0 ; // or count
int maxTries = 3;
Você não pode atribuir um array de inteiros a um matrizes de Strings.
String[] getNumber= new int [2];
Usando uma matriz de strings podem funcionar, mas você tem que atribuir um array de strings
String[] numbers = new String[2];
Ou você pode usar e matriz de int:
int [] numbers = new int [2];
Escolha um.
Lembre-se matrizes são como caixas onde você pode armazenar valores.
Na assinatura do método (que seria "public static int validNumCheck(num1,num2,num3)
"), você tem que declarar os tipos de parâmetros formais . "public static int validNumCheck(int num1, int num2, int num3)
" deve fazer o truque.
No entanto, um projeto melhor seria fazer validNumCheck
take apenas um parâmetro, e então você iria chamá-lo com cada um dos três números.
A minha sugestão seguinte (depois de ter visto o seu código atualizado) é que você começa uma IDE decente. Eu só carregá-la em NetBeans e encontrou uma série de erros. Em particular, o "start ilegal de expressão" é porque você se esqueceu de um }
no loop while, que um IDE teria sinalizado imediatamente. Depois de ter passado "Olá, mundo", Notepad apenas não cortá-lo mais.
Eu não estou indo para listar as correções para cada erro, mas tenha em mente que int[]
, int
, String[]
e String
são todos diferentes. Você parece estar usando-os de forma intercambiável (provavelmente devido à quantidade de mudanças que você fez ao seu código). Mais uma vez, um IDE iria sinalizar todos esses problemas.
Em resposta ao seu código mais recente (revisão 12): Você está ficando mais perto. Você parece ter MAX_TRIES
usado para dois fins distintos: os três números para entrar, e os três chances para cada número. Embora estes dois números são os mesmos, é melhor não usar a mesma constante para ambos. NUM_INPUTS
e MAX_TRIES
são o que eu iria chamá-los.
E você ainda não adicionou a }
faltando para o loop while.
A próxima coisa a fazer após a fixação desses seria olhar para if (getNumber == false)
.
getNumber
é um String[]
, então esta comparação é ilegal. Você deve estar recebendo o valor de retorno de validNumCheck
em uma variável, como:
boolean isValidNum = validNumCheck(getNumber[0]);
E, também, não há nenhuma razão para getNumber
ser um array. Você só precisa de um String
de cada vez, certo?
Cada parâmetro em uma definição de método precisa de um tipo:
public static int validNumCheck(int num1, int num2, int num3){
mas eu me pergunto por que você passar todos os três números, quando você só verificar um no momento. E você quiser retornar se o número é verdadeiro ou não, então o valor de retorno deve ser um booleano:
public static boolean validNumCheck(int num){
// test and return true or false
Além disso, se o usuário digita "abc", você receberá uma exceção do "Intger.pareInt (String)" método. Talvez você deseja armazenar o texto inserido como uma String de um dar a validNumCheck, tentar convertê-lo e verificar se ele está entre 0 e 200.
public static boolean isValidNumber(String num){
try {
int number = Integer.parseInt(num);
return number >= 0 && number <= 200;
}catch(NumberFormatException e){
return false;
}
}
Editar 1: Para os três tentativas, você precisa de um loop, que é executado até que o número é válido ou três tentativas são tomadas. Basta contar as tentativas com em int.
A propósito, você tem certeza que você tem que usar JOptionPane e JMessageDialog? Isso é coisa GUI e apenas complica essa coisa buraco. Você também pode ler e texto de gravação para o console usando System.out e System.in
EDIT 2: Mais uma dica, quando você criar uma matriz int com um determinado comprimento, cada lugar na matriz é preenchida com 0, então você poderia escrever:
int[] count= new int [3];
e não é necessário que:
count[0]=0;
count[1]=0;
count[2]=0;
E se você quiser usar outros valores que 0, você poderia usar uma forma mais curta como esta:
int[] count = {1, 5, 2}
EDIT 3: Uma coisa que você deve fazer / aprender é esta: não escrever a coisa toda e acabar com muitos erros e um programa não funcionar. Código um pouco, testar um pouco . Proceda de uma parte dela, vê-lo correr e você está feliz.
Será que essa coisa nunca correr? Quero dizer, você já viu que JOptionPane-InputDialog tentar usar? Se não, só que desta primeira: (! E executá-lo)
public class Assignment3 {
public static void main (String[] args){
int[] numbers = new int[3];
for (int i = 0; i < numbers.length; i++) {
JOptionPane.showInputDialog("enter something");
}
}
}
Got-lo para executar? Ótimo! Agora, tente embrulhar essa linha com o JOptionPane em um loop, que vai até o usuário digitou um número válido (usando o método checkValidNum você já tem) ou usou suas três tentativas.