2014-03-14 34 views
0

我想讓我的程序運行。但是,我得到一個NullPointerException程序不會運行,Java,StringBuilder,數組

任何幫助,將不勝感激。我不想包含太多的代碼;所以,我只包括日食說錯的塊。

這是拼圖類的構造函數。 (java.lang.NullPointerException)

我更正了第一個問題,並添加了「StringBuilder puzzle = new StringBuilder();.」我現在在同一行上得到這些錯誤。 55

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0 
at java.lang.AbstractStringBuilder.setCharAt(Unknown Source) 
at java.lang.StringBuilder.setCharAt(Unknown Source) 
at Puzzle.<init>(Puzzle.java:55) 
at PuzzleGameConsole.main(PuzzleGameConsole.java:22) 

線是原來的問題行。它標誌着以「//月食這一行有一個錯誤」

代碼:

public class Puzzle 
{ 

    private StringBuilder puzzle; 

    public Puzzle(String theSolution) 
    { 
     for (int index = 0; index < theSolution.length(); index++) 
     { 
      if (theSolution.charAt(index) != ' ') 
      { 
       puzzle.setCharAt(index, '-'); //eclipse had an error on this line 
      } 
      else if (theSolution.charAt(index) == ' ') 
      { 
       puzzle.setCharAt(index, ' '); 
      } 
     } 
    } 
} 


public int guessLetter(char letter) 
    { 
     int count = 0; 

     for(int index = 0; index < solution.length(); index++) 
     { 
      if(Character.toUpperCase(letter) == solution.toUpperCase().charAt(index)) 
      { 
       if (puzzle.charAt(index) == '-') 
       { 
        puzzle.setCharAt(index, letter); 
       } 
       else 
       { 
        count = 0; 
        break; 
       } 
       count++; 
      } 
     } 
     return count; 
    } 

    public String getPuzzle() 
    { 
     return ""; 
    } 


    public boolean solvePuzzle(String guess) 
    { 
     if(guess.toUpperCase().equals(solution.toUpperCase())) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     }  
    } 

} 

測試是貼在下面。它沒有問題。

import java.util.Arrays; 
import java.util.Scanner; 


public class PuzzleGameConsole 
{ 
    private static final String NEWLINE = "\n"; 
    private static final String MENU = "(1) GUESS A LETTER (2) SOLVE THE PUZZLE (3) QUIT >> "; 
    private static final String PROMPT_ENTER_LETTER = "\nENTER A LETTER> "; 
    private static final String PROMPT_SOLVE_PUZZLE = "\nSOLVE THE PUZZLE> "; 

    private static final int SELCTION_ENTER_LETTER = 1; 
    private static final int SELCTION_SOLVE_PUZZLE = 2; 
    private static final int SELCTION_QUIT = 3; 


    public static void main(String[] args) 
    { 

     Scanner in = new Scanner(System.in); 

     Puzzle puzzle = new Puzzle("JAVA IS FUN"); 


     int selection = 0; 

     while(selection != SELCTION_QUIT) 
     { 
      System.out.printf("PUZZLE: %s\n\n", puzzle.getPuzzle()); 

      System.out.print(MENU); 
      selection = in.nextInt(); 
      in.nextLine(); 

      if(selection == SELCTION_ENTER_LETTER) 
      { 
       System.out.print(PROMPT_ENTER_LETTER); 
       char letter = in.next().charAt(0); 

       int letterCount = puzzle.guessLetter(letter); 
       if(letterCount > 0) 
       { 
        printMessageBox(String.format("YES! The letter %s was found %d time(s).", letter, letterCount)); 
       } 
       else 
       { 
        printMessageBox(String.format("Sorry, the letter %s is not available in the puzzle.", letter));     
       } 
      } 
      else if(selection == SELCTION_SOLVE_PUZZLE) 
      { 
       System.out.print(PROMPT_SOLVE_PUZZLE); 
       String guess = in.nextLine(); 

       if(puzzle.solvePuzzle(guess)) 
       { 
        printMessageBox("Congratulations, you solved the puzzle!"); 
        selection = 3; 
       } 
       else 
       { 
        printMessageBox(String.format("Sorry, '%s' is not the puzzle. Keep trying!", guess)); 
       } 
      } 
      else if (selection != SELCTION_QUIT) 
      { 
       System.out.println("INVALID MENU OPTION"); 
      } 
     } 

     System.out.println("\nGood Bye!"); 

     in.close(); 
    } 

    public static void printMessageBox(String message) 
    { 
     char [] border = new char[message.length() + 4]; 
     Arrays.fill(border, '-'); 

     StringBuilder result = new StringBuilder(); 
     result.append(NEWLINE); 
     result.append(border).append(NEWLINE); 
     result.append("| ").append(message).append(" |").append(NEWLINE); 
     result.append(border).append(NEWLINE); 

     System.out.println(result); 
    } 

} 
+0

拼圖是一個StringBuilder – user3417938

+2

那個你永遠無法初始化! –

+0

你需要聲明/初始化變量'難題' – csmckelvey

回答

1

你的問題是,StringBuilder最初是空的,你不能設置一個不存在的值/字符。你試圖做的簡單解決方案是使用正則表達式。

private StringBuilder puzzle; 

Puzzle(String theSolution) { 
    // create a buffer where all non space are turned into - 
    puzzle = new StringBuilder(theSolution.replaceAll("\\S", "-")); 
} 
3

你的問題很可能是你從來沒有初始化的難題,從來沒有分配給它一個new StringBuilder()。即,

StringBuilder puzzle = new StringBuilder(); 

例如,

public class Puzzle 
{ 
    private StringBuilder puzzle = new StringBuilder(); // **** add this! 

    public Puzzle(String theSolution) 
    { 
     for (int index = 0; index < theSolution.length(); index++) 
     { 
      if (theSolution.charAt(index) != ' ') 
      { 
       puzzle.setCharAt(index, '-'); //eclipse had an error on this line 
      } 
      else if (theSolution.charAt(index) == ' ') 
      { 
       puzzle.setCharAt(index, ' '); 
      } 
     } 
    } 
} 

更重要的是,你需要學習如何調試NPE(NullPointerException異常)的一般概念。你應該仔細檢查引發它的行,找出哪個變量爲空,然後追溯到你的代碼,看看爲什麼。你會一次又一次遇到這些,相信我。

+0

這不起作用。你可以在上面看到我的編輯。 – user3417938

+1

@ user3417938:''這不起作用「'很少告訴我們,這有助於我們理解你的問題。分配一個可行的StringBuilder對象肯定可以治癒你的主要問題 - 你的NPE。如果您現在看到另一個問題,您最好詳細告訴我們,作爲對您問題的編輯。細節**非常重要。 –

+0

@ user3417938:我已重新審查您的問題。如果你仍然有問題,那麼你需要告訴我們更多。瞭解我們只能看到您向我們展示的代碼,只能瞭解您告訴我們的概念和細節。我們越瞭解,我們就越能提供幫助。 –

0

爲什麼會出現NullPointerException?

NullPointerException是由試圖取消引用不指向任何東西的指針引起的;指針爲空。這裏有 幾個常見的場景,其中NullPointerException異常,可以發現:

  1. String myString = null;
  2. System.out.println(myString.length());

這裏的變量,MyString的,聲明並初始化爲空線#1。當行#2 嘗試引用變量myString以打印 字符串的長度時,會拋出NullPointerException,因爲myString 不指向任何內容。

  1. System.out.println(aMethodThatReturnsNull().toString());

這第二個例子是有點麻煩。沒有聲明變量,但 仍然有一個指針:方法 aMethodThatReturnsNull()的返回值。這個虛構(並且看似毫無用處)的方法將總是返回null。正如我們在第一個示例中看到的,嘗試解除引用空指針並調用 引用對象(它爲空)的方法 會導致NullPointerException。

如何追蹤NullPointerException?

要找到NullPointerException的來源,請從堆棧 跟蹤開始。在您的Java控制檯或日誌文件,你會看到類似這樣 :

異常線程「main」顯示java.lang.NullPointerException
在com.foo.example.NullPointerExample.main(NullPointerExample.java:21 )

堆棧跟蹤告訴你發生了什麼(NullPointerException)和 其中(NullPointerExample.java的第21行)。看看那條線,如果你能識別上面給出的兩種模式中的一種,參見 。問問你自己 這些問題:

  1. 你是否正在調用一個可能爲空的變量的方法?
  2. 你是否正在調用另一個方法的返回值的方法,其中第一個方法可能返回null?
  3. 你絕對相信前兩個問題的答案是「不是?」

NullPointerExceptions可能會發生 其他原因,但這兩個是迄今爲止最常見的。

http://publicint.blogspot.com/2009/04/nullpointerexception.html

+0

你的文章確實幫了很大忙。我的程序有很多NullPointerExceptions。我沒有解決所有問題。但我很感激你花時間幫助我學習。謝謝! – user3417938