2017-06-02 1 views
-2

Je suis nouveau pour le codage avec Java alors s'il vous plaît donnez-moi une pause.ne peut pas être résolu en variable

Pendant l'exécution de ce code,

public class operators { 

public static int getMonthNumber(String monthName) { 
    int monthNumber; 
    switch (monthName) { 
    case "January": monthNumber=1; 
    break; 
    case "February": monthNumber=2; 
    break; 
    default: monthNumber=0; 

    } 


} 
public static void main(String[] args) { 
    operators.getMonthNumber("January"); 
    System.out.println(monthNumber); 
     } 
} 

Je reçois ce message, "monthNumber ne peut pas être résolu à une variable". Je ne comprends pas pourquoi il n'imprime pas seulement l'entier 1. Je sais que la solution serait de remplacer

operators.getMonthNumber("January"); 

cette

int returnedMonthNumber=operators.getMonthNumber("January"); 

Pourquoi ne peut-il imprimer seulement le nombre entier 1 sans avoir à affecter une variable à l'entier?

+0

Votre code ne compile même pas. S'il vous plaît lire [mcve]. En ce sens: s'il vous plaît comprendre que ce site n'est pas l'école de programmation si nous expliquons les bases absolues et corriger vos erreurs de syntaxe pour vous. – GhostCat

Répondre

1

Comme d'autres l'ont dit, ce site n'est pas une école pour apprendre les rudiments de la langue. Mais tôt ou tard les gens viendront probablement ici à la recherche d'une réponse à votre question exacte.

Vous avez un énorme malentendu sur le fonctionnement de Java. Dans votre code, vous faites deux erreurs. D'abord, vous essayez d'accéder à une variable qui serait déjà partie, si vous pouviez l'atteindre. Et en second lieu, vous essayez d'accéder à une variable que vous ne pouvez pas "voir" d'où vous appelez. Votre code:

public static void main(String[] args) { 
    operators.getMonthNumber("January"); 
    System.out.println(monthNumber); 
} 

Plus d'informations sur le premier problème: Vous déclarez la monthNumber variable dans votre méthode getMonthNumber. Donc, il n'existe que pour la durée de la méthode. Donc, lorsque vous appelez la méthode, la variable est là. Après la méthode, la variable est partie. Il est jeté. Mais une copie de la valeur de la variable est retournée dans votre méthode. Vous pouvez donc prendre la copie et la placer dans une nouvelle variable et l'utiliser ou l'utiliser directement. C'est ce que vous avez indiqué avec

int retournéMonthNumber = opérateurs.getMonthNumber ("Janvier");

Il n'y a pas de langage de programmation que je connaisse qui fonctionne comme vous le souhaitez.Et s'il y en avait un, ce ne serait pas vraiment populaire car cela pourrait causer beaucoup de bugs car une faute de frappe pourrait conduire au programme en utilisant une variable complètement différente que vous ne vouliez pas utiliser.

Plus d'informations sur le deuxième problème: De manière générale, les variables ne sont accessibles qu'entre parenthèses. Cela signifie que les variables déclarées dans {} ne sont accessibles que dans les mêmes parenthèses, ou entre crochets. Exemple:

public static void main(String[] args) { // first bracket 

    final int dollar = 2; 
    System.out.println("i can access dollar: " + dollar); 

    { 
     final int euro = 33; 
     System.out.println("I can access dollar: " + dollar + ", and i can access euro: " + euro); 
    } 

    // you have to remove +euro to compile this: 
    System.out.println("But i cant access euro because i am outside the brackets where euro is declared: " + euro); 
} 

Gardez cette règle à l'esprit car elle fonctionne toujours. Cela fonctionne avec les méthodes, avec ifs, avec while/for/do while etc. Si le compilateur ne peut pas voir une variable, c'est probablement une faute de frappe ou un mauvais bloc.

J'ai vu beaucoup de débutants dire quelque chose comme vous l'avez dit. Ils se demandent "pourquoi le compilateur ne sait-il pas ce que je veux, c'est évident!". Mais ce n'est pas évident. Le comportement que vous attendez est seulement "utile" dans votre tête. Cela pourrait vous sauver une demi-ligne de code. Mais dans un exemple plus avancé, vous verrez que ce serait une très mauvaise idée de l'implémenter comme vous l'attendez. Et chaque débutant s'en rend compte à un certain moment: Si vous vous demandez pourquoi le compilateur ne fera pas quelque chose que vous voulez, alors vous ne lui avez pas dit de faire ce que vous voulez qu'il fasse. Si tu vois ce que je veux dire.

1

La variable 'monthNumber' n'existe que dans la méthode getMonthNumber(). Si vous l'appelez sans affecter le résultat à quelque chose, le résultat sera perdu.

Vous pouvez, cependant, faire ce qui suit - cela passe le résultat de votre appel directement à l'appel println().

System.out.println(operators.getMonthNumber("January")); 
1

Le code ci-dessus ne ressemble pas compilerait

public static int getMonthNumber(String monthName) { 
    int monthNumber; 
    switch (monthName) { 
    case "January": monthNumber=1; 
    break; 
    case "February": monthNumber=2; 
    break; 
    default: monthNumber=0; 

    } 

// You need to return something 

return monthNumber; 

} 

Ensuite, vous pouvez l'appeler

System.out.println(operators.getMonthNumber("January")); 
1
System.out.println(operators.getMonthNumber("January")); 

passe directement à la méthode d'impression qui prendra soin de le reste. la raison pour laquelle println peut l'imprimer directement est parce qu'elle est surchargée.

Il y a tellement de méthodes surchargées du PrintStream System.out:

println(boolean x) 
println(char x) 
println(int x) 
println(long x) 
println(float x) 
println(double x) 
println(char x[]) 
println(String x) 
println(Object x)