2013-09-07 6 views
0

Может кто-нибудь объяснить, что здесь происходит? Почему «нестатическая переменная на это нельзя ссылаться из статического контекста». появляется в этом коде? Я попытался изменить parseBinary на нестатический. Я попытался изменить класс BinaryFormatException на static ... (не разрешено). Мое понимание этой ошибки очень слабое. Я знаю, что обычно могу поменять некоторые статические и публичные слова и заставить их работать правильно. Нет такой удачи в этом. Это вопрос домашнего задания ... но работа не вращается вокруг ошибки. Это связано с созданием настраиваемого класса исключений, который создается, когда двоичная строка некорректно сформирована. Поэтому, хотя мой вопрос поможет мне ответить на проблему, он не даст мне ответа.Почему создается обычное исключение, вызванное ошибкой нестатической переменной?

public class binaryToDecimal { 

    public static void main(String[] args) { 
     try { 
      System.out.println(parseBinary("10001")); 
      System.out.println(parseBinary("101111111")); 
     } catch (BinaryFormatException ex) { 
      ex.getMessage(); 
     } 
    } 

    public static int parseBinary(String binaryString) 
      throws BinaryFormatException { 
     int value = 0; 

     for (int i = 0; i < binaryString.length(); i++) { 
      char ch = binaryString.charAt(i); 

      if (ch != '0' && ch != '1') { 
       throw new BinaryFormatException(String message); 
       value = 0; 
      } else 
       value = value * 2 + binaryString.charAt(i) - '0'; 
     } 

     return value; 
    } 

    class BinaryFormatException extends Exception { 
     public BinaryFormatException(String message) { 
      super(message); 
     } 
    } 
} 
+0

«Я попытался изменить класс BinaryFormatException на статический ... (не разрешено)». Что изменилось? Какое именно изменение вы сделали и какую ошибку вы получили? Как следует из ответов, это именно то, что вам нужно сделать. –

+0

Извините, что в непростом вопросе ответить, потому что я попытался поменять местами так много. В конечном итоге я понял, что мне нужно сделать, благодаря помощи, которую вы все предоставили, и некоторым дополнительным методам «выталкивать и надеяться». Я разместил свое решение внизу. –

ответ

4

Похоже, вы определили BinaryFormatException как внутренний класс для вашего общественного класса binaryToDecimal. Это означает, что вам нужен экземпляр binaryToDecimal, чтобы иметь экземпляр BinaryFormatException. Тем не менее, вы находитесь в контексте static метода parseBinary. Нет примера binaryToDecimal.

У вас есть два варианта:

  1. Объявите BinaryFormatException класс static.
  2. Переместить код класса BinaryFormatException за пределами класса binaryToDecimal.
+0

+1. Также обратите внимание, что 'throw new BinaryFormatException (String message);' не будет работать. Сделайте 'throw new BinaryFormatException (« сообщение »); вместо этого. – Axel

2

Поскольку BinaryFormatException является внутренним классом BinaryToDecimal, для его создания требуется внешний экземпляр. Однако parseBinary является статическим методом и выполняется без экземпляра класса.

Поместите слово "static" перед "class BinaryFormat Exception", чтобы исправить это.

0

Благодарим вас за ответы. Это ответ, который я, наконец, придумал несколько минут назад, который, похоже, работает правильно.

public class binaryToDecimal extends parseBinary{ 

     public static void main(String[] args){ 
      try { 
       System.out.println(parseBinary("10001" )); 
       System.out.println(parseBinary("141111111")); 
      } catch (BinaryFormatException ex) { 
       ex.printStackTrace(); 
      } 
      } 
    } 

class parseBinary{ 
    String binaryString = ""; 
    public static int parseBinary(String binaryString) throws BinaryFormatException 
     { 
     int value = 0; 

     for (int i = 0; i < binaryString.length(); i++) 
     { 
     char ch = binaryString.charAt(i); 

     if (ch != '0' && ch != '1'){ 
      //value = value * 2 + binaryString.charAt(i) - '0'; 
     throw new BinaryFormatException("Invalid format at: " + ch + " in binaryString parameter."); 
     }else{   
      value = value * 2 + binaryString.charAt(i) - '0'; 
     } 

     } 
      return value; 

    } 
} 
class BinaryFormatException extends Exception{ 
    public BinaryFormatException(String message){ 
     super(message); 
    } 
}