2010-04-12 1 views
-2
$ javac InitInt.java 
InitInt.java:7: variable right might not have been initialized 
InitInt(){} 
     ^
1 error 
$ cat InitInt.java 
import java.util.*; 
import java.io.*; 

public class InitInt { 
private final int right; 

    // Design Problem? 
    // I feel the initialization problem is just due to bad style. 

InitInt(){} 
    InitInt{ 
      // Still the error, "may not be initialized" 
      // How to initialise it? 

      if(snippetBuilder.length()>(charwisePos+25)){ 
        right=charwisePos+25; 
      }else{ 
        right=snippetBuilder.length()-1; 
      } 
    } 

public static void main(String[] args) { 
    InitInt test = new InitInt(); 
    System.out.println(test.getRight()); 
} 
public int getRight(){return right;} 
} 

Solutions partielles et suggestionsJava: problème de conception avec la valeur finale et constructeur vide

  1. utilisation « ce » pour accéder aux méthodes de la classe, au lieu de créer constructeur vide
  2. dernier changement à non-final
  3. avec la valeur de champ finale: initialiser toutes les valeurs finales dans chaque constructeur
  4. supprimer le constructeur vide, garder votre code simple e et clean
+0

Vous décrivez jamais le problème. Pourriez-vous le décrire ** avec des mots **? Parce que le code peut être interprété de plusieurs façons et il se peut que votre question ne soit pas évidente. –

+0

Sauer: Je ne sais pas. La conception signifie l'artisanat, la réduction, la rupture de gros problèmes pour les petits. Je ne peux que sentir des solutions plus simples, des mouvements plus intelligents tels que statique, final et cela.Il n'y a probablement pas de solution miracle à ce problème, une tâche d'ingénierie. – hhh

Répondre

2

Oui, le problème est que l'un de vos constructeurs n'initialise pas le champ final. En Java, les champs non statiques finaux doivent être initialisés au moment de la déclaration, dans un bloc d'initialisation, OU dans le constructeur EVERY! Le constructeur par défaut de votre exemple ne le fait pas. N'oubliez pas que l'implémentation d'un constructeur par défaut vide n'a de sens que si vous voulez utiliser les fonctions d'héritage. Si vous ne fournissez pas un constructeur par défaut, mais vous en aurez un autre, Java ne créera pas un constructeur par défaut caché pour vous, car celui par défaut n'est pas requis. Donc, ne pas mettre en œuvre des choses comme MyClass() {} sans but particulier - garder votre code propre et économisez!

2

Vous ne pouvez pas utiliser new avec int. int est une primitive et new est un opérateur d'objet. Pensez à utiliser Integer à la place, ou en lui affectant simplement un littéral entier.

1

Il n'y a rien de mal dans votre instruction if-else, et rien de mal à initialiser une variable finale dans une instruction de branchement dans un constructeur. J'ai juste couru un constructeur simple comme le vôtre pour initialiser private int right et cela a fonctionné très bien. Assurez-vous que vous déclarez votre constructeur correctement, comme InitInt() { ... }.

L'erreur que vous avez affichée est due au fait que vous avez dans votre code InitInt(){}, un constructeur vide qui n'initialise pas right. Vous devez initialiser les champs finaux dans ce constructeur et dans tous les constructeurs.

+0

Problème A: certaines méthodes n'ont pas de paramètres. Problème B: de nombreuses méthodes dépendent de l'IniInt() {}. Problème C: initialiser les choses dans InitInt() {...}. Comment? – hhh

+0

A & B) Pourriez-vous expliquer en quoi ils sont pertinents à la question? C) Il suffit de déplacer l'instruction if-else où je mets '...' –

3

Vous voulez dire définir, pas initialiser. Le problème que vous rencontrez (après cette modification radicale) est que vous définissez un constructeur qui n'initialise pas une variable finale, ce que Java n'autorise pas - toutes les finales doivent être initialisées au moment où l'instance est terminée construire. Soit l'initialiser dans votre constructeur, soit le rendre non-final

+2

Le code que vous avez actuellement posté n'est pas valide, pour les raisons que j'ai dites. Avez-vous essayé de faire le bon non-final? Si c'est final vous devez l'initialiser dans le constructeur, c'est obligatoire –

0

Votre constructeur est absolument Okey !!!! Le problème est que vous avez laissé la variable "droite" non initialisée.

Vous avez initialiser la variable « droit »:

private final int right = 0; 
0

Si vous essayez seulement d'accéder aux méthodes de la classe, utilisez this, au lieu de créer vide constructeur pour elle:

import java.io.*; 
import java.util.*; 

public class FileDir { 
     private ArrayList<Integer> lineNumbers; 
     FileDir(Integer nth){ 
       lineNumbers=new ArrayList<Integer>(); 
       lineNumbers.add(nth); 
       // You don't need an empty constructor 
       // to call class methods, use "this" 
       this.printHello("Davids"); 
     } 
     public static void main(String[] args) { 
       FileDir test = new FileDir(7); 
       ArrayList<Integer> inteTest=test.getLineNumbers(); 
       for (Integer i : inteTest) 
         System.out.println(i); 
     } 
     public void printHello(String name) { System.out.println("Hello "+ name); } 
     public ArrayList<Integer> getLineNumbers() { return lineNumbers; } 
} 
Questions connexes