2012-12-22 179 views
2

我得到我的代碼NullPointerException錯誤,我已經把範圍縮小是這段代碼是導致異常雖然我仍然得到一個NullPointerException,雖然這個循環(readLines)不添加空條目?

AttributedString mStyledText = new AttributedString(mText); 

我曾認爲值多行文字會從futher了代碼retrived使用此代碼:

BufferedReader br = null; 
        try { 
         br = new BufferedReader(new FileReader(path)); 
         List<String> list = new ArrayList<String>(); 
         while ((mText = br.readLine()) != null) { 
          //Displays the contents of the file in terminal 
          System.out.println(mText); 
          list.add(mText); 
         } 

但是我還是空的錯誤,我認爲值MTEXT將來自上面的代碼和使用,但是這似乎並沒有要發生的事情,這是爲什麼,整個代碼低於

import java.awt.*; 
import java.awt.font.*; 
import java.awt.geom.*; 
import java.awt.print.*; 
import java.text.*; 
import java.io.*; 
import javax.swing.*; 
import java.util.List; 
import java.util.ArrayList; 

public class PrintText implements Printable { 

    private List<String> list; 

    // Below the code will allow the user to select a file and then print out the contents of the file 
    public static void main(String[] args) throws IOException { 
     new PrintText(); 
    } 

    public PrintText() { 
     EventQueue.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        try { 
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        } 

        //selects the file 
        JFileChooser chooser = new JFileChooser(); 
        chooser.showOpenDialog(null); 
        File file = chooser.getSelectedFile(); 
        String filename = file.getName(); 
        //System.out.println("You have selected: " + filename); testing to see if file seleected was right 
        String path = file.getAbsolutePath(); 

        //Reads contents of file into terminal 
        //FileReader fr = new FileReader("filename"); 
        // FileReader fr = new FileReader("D:/Documents/" + "filename")); 

        BufferedReader br = null; 
        try { 
         br = new BufferedReader(new FileReader(path)); 
         List<String> list = new ArrayList<String>(); 
         String line; 
         while ((line = br.readLine()) != null) { 
          System.out.println(line); 
          list.add(line); 
         } 

         printer(); 
        } catch (IOException exp) { 
         exp.printStackTrace(); 
        } finally { 
         try { 
          br.close(); 
         } catch (Exception e) { 
         } 
        } 
        //fr.close(); 
       } 
      }); 
    } 
    //private static final String mText = 
    // "This is a test to see if this text will be printed "; //This works perfectly fine 
    //AttributedString mStyledText = new AttributedString(mText); 
    /** 
    * Print a single page containing some sample text. 
    */ 
    public void printer() { 

     /* Get the representation of the current printer and 
     * the current print job. 
     */ 
     PrinterJob printerJob = PrinterJob.getPrinterJob(); 
     /* Build a book containing pairs of page painters (Printables) 
     * and PageFormats. This example has a single page containing 
     * text. 
     */ 
     Book book = new Book(); 
     book.append(this, new PageFormat()); 
     /* Set the object to be printed (the Book) into the PrinterJob. 
     * Doing this before bringing up the print dialog allows the 
     * print dialog to correctly display the page range to be printed 
     * and to dissallow any print settings not appropriate for the 
     * pages to be printed. 
     */ 
     printerJob.setPageable(book); 
     /* Show the print dialog to the user. This is an optional step 
     * and need not be done if the application wants to perform 
     * 'quiet' printing. If the user cancels the print dialog then false 
     * is returned. If true is returned we go ahead and print. 
     */ 
     boolean doPrint = printerJob.printDialog(); 
     if (doPrint) { 
      try { 
       printerJob.print(); 
      } catch (PrinterException exception) { 
       System.err.println("Printing error: " + exception); 
      } 
     } 
    } 

    /** 
    * Print a page of text. 
    */ 
    public int print(Graphics g, PageFormat format, int pageIndex) { 

     System.out.println("About to obtain an attributed string, list=" + list); 
     AttributedString mStyledText = new AttributedString(list); 
     // etc 
     /* We'll assume that Jav2D is available. 
     */ 
     Graphics2D g2d = (Graphics2D) g; 
     /* Move the origin from the corner of the Paper to the corner 
     * of the imageable area. 
     */ 
     g2d.translate(format.getImageableX(), format.getImageableY()); 
     /* Set the text color. 
     */ 
     g2d.setPaint(Color.black); 
     /* Use a LineBreakMeasurer instance to break our text into 
     * lines that fit the imageable area of the page. 
     */ 
     Point2D.Float pen = new Point2D.Float(); 
     AttributedCharacterIterator charIterator = mStyledText.getIterator(); 
     LineBreakMeasurer measurer = new LineBreakMeasurer(charIterator, g2d.getFontRenderContext()); 
     float wrappingWidth = (float) format.getImageableWidth(); 
     while (measurer.getPosition() < charIterator.getEndIndex()) { 
      TextLayout layout = measurer.nextLayout(wrappingWidth); 
      pen.y += layout.getAscent(); 
      float dx = layout.isLeftToRight() ? 0 : (wrappingWidth - layout.getAdvance()); 
      layout.draw(g2d, pen.x + dx, pen.y); 
      pen.y += layout.getDescent() + layout.getLeading(); 
     } 
     return Printable.PAGE_EXISTS; 
    } 
} 

完整堆棧跟蹤:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at java.text.AttributedString.<init>(AttributedString.java:127) 
    at PrintText.print(PrintText.java:109) 
    at sun.print.RasterPrinterJob.printPage(RasterPrinterJob.java:1973) 
    at sun.print.RasterPrinterJob.print(RasterPrinterJob.java:1461) 
    at sun.print.RasterPrinterJob.print(RasterPrinterJob.java:1277) 
    at PrintText.printer(PrintText.java:97) 
    at PrintText$1.run(PrintText.java:51) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721) 
    at java.awt.EventQueue.access$200(EventQueue.java:103) 
    at java.awt.EventQueue$3.run(EventQueue.java:682) 
    at java.awt.EventQueue$3.run(EventQueue.java:680) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:691) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:97) 

回答

5

的唯一途徑這個循環可以退出:

while ((mText = br.readLine()) != null) { 
    System.out.println(mText); 
    list.add(mText); 
} 

是當mText爲null。所以肯定的,mText後面的代碼中必須爲空。

您可以通過使用list變量來訪問文件的線條,但你需要或者把它作爲參數傳遞給你的方法:

public void printer(List<String> list) { 
    // etc... 
} 

或使你的類的字段,以便它對班級中的其他方法是可見的。

public class PrintText implements Printable { 
    private List<String> list; 
    // etc.. 
} 

除了減少今後發生類似的錯誤,我建議你刪除靜態字段mText,轉而使用方法中的局部變量的風險:

String line; 
while ((line = br.readLine()) != null) { 
    System.out.println(line); 
    list.add(line); 
} 
+0

謝謝,我也試過用list變量,但是我然後得到一個編譯器錯誤,說找不到符號變量列表 – user1924104

+0

@ user1924104:在變量* scope *上讀取。列表變量只在其聲明的塊中可見,所以在嘗試使用它時可能不會顯示。解決方案:在更高的塊或類中聲明它。 –

+0

看到你只是想閱讀整個文件,我還建議用'StringBuilder'替換'ArrayList'並使用'StringBuilder.append(mText)'來填充它(如果需要,還包括一個額外的行分隔符)。稍後,您可以將'StringBuilder.toString()'的結果傳遞給'AttributedString'構造函數。 –